Экспорт CngKey в PKCS8 с шифрованием С#

Как экспортировать CngKey в PKCS#8 с шифрованием?

static void Main(string[] args)
    {
        CngKeyCreationParameters ckcParams = new CngKeyCreationParameters()
        {
            ExportPolicy = CngExportPolicies.AllowExport,
            KeyCreationOptions = CngKeyCreationOptions.None,
            KeyUsage = CngKeyUsages.AllUsages,                
        };
        ckcParams.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(2048), CngPropertyOptions.None));

        myCngKey = CngKey.Create(CngAlgorithm.Rsa, "theCngKey", ckcParams);

        byte[] privatePlainTextBlob = myCngKey.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);
 }

Установка для параметра ExportPolicy значения AllowPlainTextExport позволяет экспортировать ключ, но только в виде простого текста. Я хотел бы создать большой двоичный объект PCKS8, зашифрованный симметричным ключом.

Спасибо


person Rowan Smith    schedule 01.06.2017    source источник


Ответы (1)


Поскольку CngKey.Export не принимает пароль, вам придется вручную выполнить P/Invoke для NCryptExportKey со значением NCRYPTBUFFER_PKCS_SECRET (пароль в кодировке Unicode/UCS-2 с явным нулевым символом окончания).

http://source.dot.net/#System.Security.Cryptography.Cng/Common/System/Security/Cryptography/ECCng.ImportExport.cs,8b172741466df7a1 можно использовать в качестве примера построения списка параметров. Это не весело.

person bartonjs    schedule 01.06.2017
comment
Спасибо! Я имел большой успех с этим. Когда у меня просто есть значение NCRYPTBUFFER_PKCS_SECRET, вывод идентичен CngKey.Export(). Казалось бы, мне также нужно предоставить NCRYPTBUFFER_PKCS_ALG_OID и, возможно, NCRYPTBUFFER_PKCS_ALG_PARAM. Но я нигде не могу найти, что я должен использовать для этих параметров. Я хочу сделать AES256 PKCS8. - person Rowan Smith; 02.06.2017