[英]How to convert ECDsa private key to AsymmetricKeyParameter type?
我使用下面的代碼將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 重新導入私鑰並修復導出策略(您需要在AllowPlaintextExport
中有dotNetPrivateKey.Key.ExportPolicy
)。 如果有,請跳過此步驟。
其次是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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.