gpt4 book ai didi

.net - 从 BouncyCaSTLe 导出 EC 私钥并导入到 CngKey 或 ECDsaCng 中?

转载 作者:行者123 更新时间:2023-12-02 00:32:20 34 4
gpt4 key购买 nike

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

CngKey.Import 支持 PKCS#8 格式,因此如果您可以将 key 放入有效的 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.CryptographicException: ASN1 bad tag value met.

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

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

最佳答案

经过一番绞尽脑汁、阅读 RFC 并研究 BouncyCaSTLe 和 CngKey.Export 生成的字节数组后,我找到了答案。

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

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

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

AsymmetricCipherKeyPair keyPair = pGen.GenerateKeyPair();

可以通过使用 Der 编码字节导入 key 来创建 CngKey:

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

关于.net - 从 BouncyCaSTLe 导出 EC 私钥并导入到 CngKey 或 ECDsaCng 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9414125/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com