Недавно я читал код bouncycastle (java) и заметил, что при использовании EdDSA мы используем org.bouncycastle.asn1.x509.SubjectPublicKeyInfo#getPublicKeyData
для получения 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, и эти два формата можно преобразовать обратно и принудительно.
RFC 5280 указывает, что открытые ключи X.509 должны быть закодированы в ПОСЛЕДОВАТЕЛЬНОСТИ ASN.1 SubjectPublicKeyInfo. Он состоит из двух частей: первая («алгоритм») — это AlgorithmIdentifier, который сообщает, для какого алгоритма предназначен ключ, а вторая («subjectPublicKey») — это битовая цепочка ASN.1, интерпретация которой зависит от алгоритма.
В случае с EdDSA его использование в X.509 было указано в RFC 8410 . Этот RFC предоставляет ИДЕНТИФИКАТОР ОБЪЕКТА для использования в «алгоритме» для Ed25519/Ed448 и сохраняет формат открытого ключа, указанный в исходном RFC EdDSA — RFC 8032, то есть строку байтов, так что это то, что идет в «subjectPublicKey».
Так является ли EdDSA publicKey необработанными битами, потому что он содержит только один объект, а ключи rsa закодированы как asn.1, потому что он содержит два объекта (модуль и publicExp)?
@NickAllen: не совсем так. Ключ EdDSA содержит два значения, y и sign(x), в фиксированной кодировке, определенной 8032, без использования ASN1. ECDSA (и ECDH) имеет два представления, описанные в 5480, на основе X9.62 и SEC1, оба с фиксированным значением, отличным от ASN1, которые семантически представляют два значения либо x,y, либо x,sign_or_parity(y). Пубключ OTOH DSA представляет собой одно целое число, но закодировано в кодировке ASN1, как определено в 3279 2.3.2. По сути, это произвольное решение, принятое стандартизаторами, и вы должны прочитать то, что они написали.
OTOH RSA указан в 3280 2.3.1 как структура ASN.1, которая фактически совпадает с PKCS1 (RFC 2313, 2437, 4347, 8017), хотя и не упоминается там, подтверждена в 4055 1.2.