C#中CngKey的EC私钥

时间:2017-07-14 20:52:07

标签: c# .net bouncycastle cng

我需要将BouncyCastle生成的EC私钥转换为C#中的CngKey。最后,我尝试创建一个可以导入到Windows密钥库中的PKCS12,并且遵循找到的here信息和代码示例。

EC密钥对生成如下:

    var ecKeyPairGenerator = new ECKeyPairGenerator("ECDSA");
    ECKeyGenerationParameters ecKeyGenParams = new ECKeyGenerationParameters(SecObjectIdentifiers.SecP384r1, new SecureRandom());
    AsymmetricCipherKeyPair pair = ecKeyPairGenerator.GenerateKeyPair();

创建CngKey:

PrivateKeyInfo privKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(pair.Private);
CngKey cngPrivKey = CngKey.Import(privKeyStruct.GetDerEncoded(), CngKeyBlobFormat.Pkcs8PrivateBlob);

在网络上搜索,上述内容应该有效,例如,请参阅here。相反,我收到了一个未知错误异常

  

(CryptographicException)at   System.Security.Cryptography.NCryptNative.ImportKey()。如果我通过   CngKeyBlobFormat.EccPrivateBlobCngKey.Import(),我得到了   无效的数据异常。

作为.NET,CNG和Cryto的新手,我觉得我忽略了一些东西。任何想法都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

事实证明,传入CngKey.Import()方法的私钥的pkcs8内容应编码私钥和公钥,以使方法成功。这与找到的CngKeyBlobFormat.Pkcs8PrivateBlob属性here

的评论一致

所以新的问题是如何在BouncyCastle中生成包含两个密钥的私钥的pkcs8字节数组编码。由于Pkcs8Generator没有公钥,AsymmetricKeyParameter不会这样做。任何帮助将不胜感激。

谢谢!