.net 从BouncyCastle导出EC私钥并导入CngKey或ECDsaCng?

.net 从BouncyCastle导出EC私钥并导入CngKey或ECDsaCng?,.net,cryptography,bouncycastle,elliptic-curve,.net,Cryptography,Bouncycastle,Elliptic Curve,我已经使用BouncyCastle为椭圆曲线DSA签名创建了密钥对,并根据使用XMLString将公钥导入ECDsaCng。现在我还想移动私钥,但还没有找到解决方案。我得到的最接近的是使用CngKey.Import Import支持PKCS#8格式,因此如果您可以将密钥转换为有效的pkcs8,那么它应该可以工作。不幸的是,下面的代码不太有效 var privatekey = (ECPrivateKeyParameters) keyPair.Private; var pkinfo = Priva

我已经使用BouncyCastle为椭圆曲线DSA签名创建了密钥对,并根据使用XMLString将公钥导入ECDsaCng。现在我还想移动私钥,但还没有找到解决方案。我得到的最接近的是使用CngKey.Import

Import支持PKCS#8格式,因此如果您可以将密钥转换为有效的pkcs8,那么它应该可以工作。不幸的是,下面的代码不太有效

var privatekey = (ECPrivateKeyParameters) keyPair.Private;

var pkinfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privatekey);

byte[] pkcs8Blob = pkinfo.GetDerEncoded(); 

var importedKey = CngKey.Import(pkcs8Blob, CngKeyBlobFormat.Pkcs8PrivateBlob);
这会引发一个异常:

System.Security.Cryptography.Cryptography异常:满足ASN1错误标记值

据我所知,GetDeRecoded应该返回一个有效的Pkcs8 blob


如何在ECDsaCng对象中使用BouncyCastle创建的私钥?

经过多次梳理、读取RFC并研究BouncyCastle和CngKey生成的字节数组。导出我找到了答案

问题在于BouncyCastle如何将EC密钥编码为DER/Pkcs8格式。与此特定问题相关的两个RFC是RFC5915(不是标准,而是共识文件)和RFC5480。它们声明必须使用RFC5480中引用的命名曲线指定曲线参数。使用错误的生成器参数创建AsymmetricipherKeypair时,PKCS8/DER导出的BouncyCastle实现将导出不符合这两个规范的整个曲线规范(隐式曲线)。必须使用指定命名曲线的ECKeyGenerationParameters

在BouncyCastle中创建可互操作密钥时,必须使用以下内容(据我所知):

string namedCurve = "prime256v1";
ECKeyPairGenerator pGen = new ECKeyPairGenerator();
ECKeyGenerationParameters genParam = new ECKeyGenerationParameters(
  X962NamedCurves.GetOid(namedCurve)   
  new SecureRandom());
pGen.Init(genParam);

AsymmetricCipherKeyPair keyPair = pGen.GenerateKeyPair();
可以通过使用Der编码字节导入密钥来创建CngKey:

var bcKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keyPair.Private);
var pkcs8Blob = bcKeyInfo.GetDerEncoded();
var importedKey = CngKey.Import(pkcs8Blob, CngKeyBlobFormat.Pkcs8PrivateBlob);