Как решить, что publicKey является необработанными битами или закодирован, а закрытый ключ всегда закодирован pkcs8?

Недавно я читал код bouncycastle(java), я заметил, что при использовании EdDSA мы используем для получения publicKey в org.bouncycastle.jcajce.provider.asymmetric.edec.BCEdDSAPublicKey#populateFromPubKeyInfo. Но при использовании RSA мы используем org.bouncycastle.asn1.x509.SubjectPublicKeyInfo#parsePublicKeyв org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPublicKey#populateFromPublicKeyInfo.

Комментарий parsePublicKeyявляется for when the public key is an encoded object - if the bitstring can't be decoded this routine throws an IOException.а также getPublicKeyDataэто for when the public key is raw bits..

Я смущен тем, как мы можем решить, какой метод использовать? Это написано в EdDSAспец или где? Я погуглил и ничего не нашел.

Редактировать:

Ниже приведена информация, которую я собрал, поправьте меня, если я ошибаюсь.

И EdRsa publicKey, и RSA publicKey кодируются ASN.1, использование org.bouncycastle.asn1.x509.SubjectPublicKeyInfo#getPublicKeyDataпросто потому, что EdRsa publicKey содержит только один компонент (простой массив байтов), а ключ rsa содержит два компонента (модули и publicExp).

Почти все закрытые ключи кодируются pkcs # 8, в конце концов, он называется «Стандарт синтаксиса информации закрытого ключа». Но rsa privateKey также может быть закодирован в pkcs # 1, который был до pkc#8, и эти два формата можно преобразовать обратно и принудительно.

1 ответ

RFC 5280 указывает, что открытые ключи X.509 должны быть закодированы в ПОСЛЕДОВАТЕЛЬНОСТИ ASN.1 SubjectPublicKeyInfo. Он состоит из двух частей: первая («алгоритм») — это AlgorithmIdentifier, который сообщает, для какого алгоритма предназначен ключ, а вторая («subjectPublicKey») — это битовая цепочка ASN.1, интерпретация которой зависит от алгоритма.

В случае EdDSA его использование в X.509 было указано в RFC 8410 . Этот RFC предоставляет ОБЪЕКТНЫЙ ИДЕНТИФИКАТОР для использования в «алгоритме» для Ed25519/Ed448 и сохраняет формат открытого ключа, указанный в исходном RFC EdDSA — RFC 8032 , то есть строку байтов, так что это то, что входит в «subjectPublicKey».

Другие вопросы по тегам