簡體   English   中英

如何將 ECDsa 私鑰轉換為 AsymmetricKeyParameter 類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM