Как решить, что 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».