Алгоритмы {hash}withECDSA
в Java поддерживают любую кривую, которая может быть выражена в объекте ECPrivateKey
, переданном в Signature.initSign(key)
или (в вашем случае), в объект ECPublicKey
, переданный в Signature.initVerify(key)
, который для стандартного поставщика SunEC: любая кривая, выраженная в форме X9.62 (Вейерштрасса) . В основном это все, что используется в настоящее время , за исключением Bernstein et al. {Curve, X, Ed} {25519,448} (EdDSA - это алгоритм подписи эллиптической кривой, но не алгоритм с именем ECDSA).
Стандартные кривые X9 / NIST и TLS предопределены, хотя доступ к ним (правка), отличный от ключа генерация , немного неуклюж; см. Как преобразовать общедоступную кодовую точку EC и имя кривой в PublicKey? .
Обычно пара ключей должна быть сгенерирована подписывающей стороной, и (только) publickey передан верификатору (ам) либо до, либо вместе с подписью (ями) и подписанные данные; часто это делается в форме сертификата, который позволяет избежать ручных усилий и ручных ошибок, которые создают уязвимости. Java напрямую поддерживает сертификаты X.509 и используемый ими формат publickey (SubjectPublicKeyInfo aka SPKI); см. Javadoc для java.security.spec.X509EncodedKeySpec
и java.security.Key
. Для EC SPKI включает идентификацию кривой, но, к сожалению, API Java не предоставляет удобного способа вернуть его обратно.
Если у вас есть сертификат X.509 или только SPKI X.509 для publickey в файле в формате DER или PEM, и у вас есть OpenSSL, он может декодировать и отображать эту информацию:
openssl x509 -in certfile -inform {der|pem} -text
openssl pkey -in spkifile -inform {der|pem} -pubin -text # 1.0.0 up
openssl ec -in spkifile -inform {der|pem} -pubin -text # 0.9.x
# look at the line labelled ASN1 OID: