RSACng и CngKeyBlobFormat форматы импорта и экспорта

У меня есть закрытый ключ RSA ASN.1 в файле pem в этом формате:

-----BEGIN RSA PRIVATE KEY-----
base64 encoded pkcs8 key
-----END RSA PRIVATE KEY-----

Теперь, чтобы импортировать его в мой RSACng объект, который я должен выполнить следующие шаги:

  1. Прочитайте файл и извлеките закодированный ключ

  2. Перерабатывать base64 в байтах, чтобы получить byte[] для ключа pkcs8

  3. Расшифровать byte[] от ASN.1 (DER) до ключевой информации (модуль, показатель степени и т. д.)

  4. Загрузите эти параметры в 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 ответ

Решение
  1. Почему CngKeyBlobFormat.Pkcs8PrivateBlob не позволяет автоматически импортировать ключ байта [] PKCS8 в объект RSACng?

Так как BEGIN RSA PRIVATE KEY указывает на PKCS#1 RSAPrivateKeyне PKCS#8 PrivateKeyInfo, Не зашифрованный закрытый ключ PKCS#8 скажет BEGIN PRIVATE KEY,

  1. Что такое формат кодирования 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и так далее.

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