RSACng и CngKeyBlobFormat форматы импорта и экспорта
У меня есть закрытый ключ RSA ASN.1 в файле pem в этом формате:
-----BEGIN RSA PRIVATE KEY-----
base64 encoded pkcs8 key
-----END RSA PRIVATE KEY-----
Теперь, чтобы импортировать его в мой RSACng
объект, который я должен выполнить следующие шаги:
Прочитайте файл и извлеките закодированный ключ
Перерабатывать
base64
в байтах, чтобы получитьbyte[]
для ключа pkcs8Расшифровать
byte[]
от ASN.1 (DER) до ключевой информации (модуль, показатель степени и т. д.)Загрузите эти параметры в
RSACng
объект
У меня есть два следующих вопроса:
1. Почему не CngKeyBlobFormat.Pkcs8PrivateBlob
позволяют автоматически импортировать PKCS8 byte[]
ключ в RSACng
объект?
Например, почему это не может работать таким образом:
var keyData = GetBytesFromPEM(pemstring); // Get the bytes for key that is ASN.1 DER encoded
CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob);
CngKeyBlobFormat четко указывает, что это частный BLOB-объект PKCS8.
2. Что такое формат кодирования ASN.1 RSACng.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob)
?
Я заметил, что если я загружу ключ в RSACng
как я описал выше, и затем я экспортирую тот же ключ, используя приведенный выше код, я получаю большой двоичный объект, который закодирован в другом формате ASN.1, и в котором он содержит ключ, закодированный в ASN.1 DER. По сути, чтобы получить информацию из этого экспортированного ключа, мне нужно было бы снова ДЕКОДИТЬ ее из этого формата ASN.1, чтобы получить исходные сохраненные в нем ключевые параметры, которые ВНОВЬ закодированы в ASN.1 DER.
Почему это такой беспорядок? И это причина, почему вы не можете импортировать закодированный ключ ASN.1 DER в RSACng
тот CngKeyBlobFormat.Pkcs8PrivateBlob
имеет другой формат кодировки ASN.1, и это не DER? Будет ли возможный обходной путь для кодирования исходного закрытого ключа RSA в этот другой формат ASN.1, поскольку именно так экспортируется ключ?
РЕДАКТИРОВАТЬ: по-видимому, RSACng.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob)
использует идентификаторы объектов (я еще не знаком с этим), но, похоже, все еще в формате DER
1 ответ
- Почему CngKeyBlobFormat.Pkcs8PrivateBlob не позволяет автоматически импортировать ключ байта [] PKCS8 в объект RSACng?
Так как BEGIN RSA PRIVATE KEY
указывает на PKCS#1 RSAPrivateKey
не PKCS#8 PrivateKeyInfo
, Не зашифрованный закрытый ключ PKCS#8 скажет BEGIN PRIVATE KEY
,
- Что такое формат кодирования ASN.1
RSACng.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob)
?
PKCS#8 PrivateKeyInfo. https://tools.ietf.org/html/rfc5208.
PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
privateKey PrivateKey,
attributes [0] IMPLICIT Attributes OPTIONAL }
Version ::= INTEGER
PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
PrivateKey ::= OCTET STRING
Attributes ::= SET OF Attribute
Значение в PrivateKey
для ключа RSA - PKCS#1 RSAPrivateKey
значение.
Почему это такой беспорядок? ... Идентификаторы объекта...
Формат PKCS#8 PrivateKeyInfo является контейнером для любого типа закрытого ключа. Идентификатор объекта (OID) сообщает читателю, что это за полезная нагрузка. Если OID rsaEncryption
(1.2.840.113549.1.1.1), то полезная нагрузка RSAPrivateKey
, если это id-dsa
(1.2.840.10040.4.1), тогда полезная нагрузка представляет собой INTEGER, представляющий закрытый ключ (и параметры контекста находятся в privateKeyAlgorithm.Parameters
), если это id-ecPublicKey
(1.2.840.10045.2.1) (да "public", 'cuz names), тогда полезная нагрузка ECPrivateKey
и так далее.