如何将ECDsa私钥转换为AsymmetricKeyParameter类型



我使用以下代码将ECDsa转换为AsymmetricKeyParameter私钥类型。

X509Certificate2 x509Certificate2 = new X509Certificate2(KeyStore, pin, X509KeyStorageFlags.Exportable);
AsymmetricKeyParameter ecdsaprivKey =  x509Certificate2.GetECDsaPrivateKey(); // Error

我在转换ecdsa private key时出错,如何转换?

您需要手动将ECDsa私钥参数从.NET转换为BouncyCastle。我想您使用的是命名曲线,证书不太可能有明确的曲线参数。如果是的话,那么你唯一需要带到BouncyCastle的就是一个私钥D参数+曲线的OID:

using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
namespace EcConverter
{
class Program
{
static void Main(string[] args)
{
var dotNetCertificate = new X509Certificate2("mycert.pfx", "mypassword", X509KeyStorageFlags.Exportable);
var dotNetPrivateKey = (ECDsaCng)dotNetCertificate.GetECDsaPrivateKey();
var dotNetPrivateKeyExportable = UpdateExportPolicies(dotNetPrivateKey);
var dotNetECDsaParameters = dotNetPrivateKeyExportable.ExportParameters(true);
var oid = "1.2.840.10045.3.1.7"; // nistP256Oid
var bouncyCastleD = new BigInteger(dotNetECDsaParameters.D);
var bouncyCastlePrivateKey = new ECPrivateKeyParameters("ECDSA", bouncyCastleD, new DerObjectIdentifier(oid));
}
}
}

这个代码中有几个缺失的部分:

首先是UpdateExportPolicies()。我不知道你的私钥是否可以导出,但该密钥可能没有允许导出私钥参数的正确导出策略。如果这是真的,那么按照这个问题中关于如何从PKCS8 blob重新导入私钥并修复导出策略的说明进行操作(dotNetPrivateKey.Key.ExportPolicy中需要有AllowPlaintextExport(。如果你有,跳过这一步。

第二个是OID。您可以使用dotNetECDsaParameters.Curve.Oid访问OID,但是它可能没有实际的OID代码,而是一个友好的名称。您可以对曲线OID进行硬编码,也可以分析友好名称并将其转换为正确的代码。我已经指定了最常用的曲线nistP256。

第三种是Bouncy Castle使用的BER格式,而不是DER来存储D参数。在大多数情况下,代码都可以工作,但如果私钥字节数组比预期的要短,并且需要截断,则可能会出现问题。BER编码要求使用最小字节数,并在前面插入一个0字节。所以实际的代码看起来是这样的:

var bouncyCastleD = new BigInteger(ConvertToBer(dotNetECDsaParameters.D));
...
private byte[] ConvertToBer(byte[] derByteArray)
{
// trim all zeroes in the beginning of a given array
// add one zero in front
// return the result
}

相关内容

  • 没有找到相关文章

最新更新