C# BouncyCastle PKCS # 8 - PullRequest
       87

C# BouncyCastle PKCS # 8

1 голос
/ 16 апреля 2020

Я хочу загрузить PEM, используя. net framework (не .netcore)

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIHs........................................................CAAw
DAYI........................................................gZAf
Y/Iu........................................................X7DZ
ZKoE........................................................OYQQ
3ZST........................................................A2E=
-----END ENCRYPTED PRIVATE KEY-----
  • Я пытался использовать следующий код, используя BouncyCastle, но он выдает PemException: "проблема при создании ENCRYPTED закрытый ключ: Org.BouncyCastle.Crypto.InvalidCipherTextException: блок панели поврежден "
 class Passowrd : IPasswordFinder
    {
        private string v;

        public Passowrd(string v)
        {
            this.v = v;
        }

        public char[] GetPassword()
        {
            return v.ToCharArray();
        }
    }

var pemReader = new PemReader(new StringReader(privateKeyText), new Passowrd("PASSWORD"));
var pemObj = pemReader.ReadObject(); // this line throw PemException
  • Однако я загружаю точно такой же файл PEM, используя .netcore3.1, с помощью следующего кода:
    var ecdsa = ECDsa.Create();
    ecdsa.ImportEncryptedPkcs8PrivateKey(passSpan, privateKeyBytes, out _);

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Проблема, похоже, связана с шифрованием ключа: ключ не может быть прочитан с помощью PemReader, если опция -v2prf hmacWithSHA1 не установлена, когда ключ зашифрован.

Опция -v2prf существует начиная с V1.1.0 и задает алгоритм PRF (псевдослучайная функция), используемый с PKCS # 5 v2.0 или ключом деривационная функция PBKDF2 .

  • Случай 1: создание нового ключа

    Следующие два оператора создают и шифруют ключ:

    openssl ecparam -name secp256r1 -genkey -noout -out <out-path>
    openssl pkcs8 -topk8 -v2 aes256 -v2prf hmacWithSHA1 -in <in-path> -out <out-path>  // aes256 as of OpenSSL 1.1.0 inclusive
    

    Сгенерированный таким образом ключ может быть успешно прочитан с помощью PemReader. Однако, если опция -v2prf hmacWithSHA1 отсутствует, генерируется исключение.

  • Случай 2. Исправление уже сгенерированного ключа

    Следующий оператор расшифровывает уже зашифрованный ключ :

    openssl pkcs8 -topk8 -nocrypt -in <in-path> -out <out-path>
    

    Если ключ впоследствии зашифрован с установленным параметром -v2prf hmacWithSHA1 (см. Выше), ключ можно успешно прочитать с помощью PemReader. Таким образом, я смог исправить опубликованный ключ, чтобы его можно было прочитать с помощью PemReader!

Возможное (к сожалению, только поверхностное) объяснение может быть найдено в документации openssl pkcs8. Там можно прочитать о параметре -v2prf:

Некоторые реализации могут не поддерживать пользовательские алгоритмы PRF и могут требовать, чтобы для работы работала опция hmacWithSHA1.

Интересно, что критические ключи можно без проблем прочитать, используя ECDsa#ImportEncryptedPkcs8PrivateKey from. NET Core 3.x. Для полного объяснения, вероятно, понадобится заглянуть в исходный код.

0 голосов
/ 16 апреля 2020

Вы можете прочитать PEM, используя

var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(new StringReader(privateKeyText), new Passowrd("PASSWORD"));

или

var pemReader = new Org.BouncyCastle.Utilities.IO.Pem.PemReader(new StringReader(privateKeyText));

, а затем прочитать содержимое как

var pemObject = pemReader.ReadPemObject();
...