我需要将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.EccPrivateBlob
到CngKey.Import()
,我得到了 无效的数据异常。
作为.NET,CNG和Cryto的新手,我觉得我忽略了一些东西。任何想法都将不胜感激。
谢谢!
答案 0 :(得分:1)
事实证明,传入CngKey.Import()
方法的私钥的pkcs8内容应编码私钥和公钥,以使方法成功。这与找到的CngKeyBlobFormat.Pkcs8PrivateBlob
属性here
所以新的问题是如何在BouncyCastle中生成包含两个密钥的私钥的pkcs8字节数组编码。由于Pkcs8Generator
没有公钥,AsymmetricKeyParameter
不会这样做。任何帮助将不胜感激。
谢谢!