C# BouncyCastle私钥至X509Certificate2私钥(ECC)

C# BouncyCastle私钥至X509Certificate2私钥(ECC),c#,.net,cryptography,certificate,bouncycastle,C#,.net,Cryptography,Certificate,Bouncycastle,使用.NET Core 3.1和BouncyCastle 我有Pkcs12的专用ECC密钥。我如何将其存储在X509Certificate2私钥中? 我尝试这种方式的原因是,当我将Pkcs12作为X509Certificate2加载时,X509Certificate2.PrivateKey方法抛出一个“未实现/算法不支持的异常” 这就是我到目前为止所做的: using var stream = new MemoryStream(myPkcs12); Pkcs12

使用.NET Core 3.1和BouncyCastle

我有Pkcs12的专用ECC密钥。我如何将其存储在X509Certificate2私钥中? 我尝试这种方式的原因是,当我将Pkcs12作为X509Certificate2加载时,
X509Certificate2.PrivateKey
方法抛出一个“未实现/算法不支持的异常”

这就是我到目前为止所做的:

        using var stream = new MemoryStream(myPkcs12);

        Pkcs12Store pstore = new Pkcs12Store(stream, password.ToCharArray());
        
        var name = "";
        foreach (string alias in store.Aliases)
        {
            if (pstore.IsKeyEntry(alias))
            {
                name = alias;
            }
        }

        var key = pstore.GetKey(name);

            var cert = new X509Certificate2(myPkcs12, "mypassword", X509KeyStorageFlags.EphemeralKeySet | X509KeyStorageFlags.Exportable);
          
                cert.PrivateKey = // key? I imagine it is incorrect to use  DotNetUtilities.ToRSA()?
谢谢大家!

更新:

此帖子的原因是由于以下问题:

private const string EccTestCert = "MIINbQIBAzCCDSkGCSqGSIb3DQEHAaCCDRoEgg0WMIIN.... 9wQUpQgYbgB7yknIW7Oaz3hogAVihJoCAgfQ";
var cert = new X509Certificate2(Convert.FromBase64String(EccTestCert), "1");

//  If you inspect it, the PrivateKey throws an exception.  Whilst with an RSA cert, it will not.

源代码显示,根据您运行的平台,会引发异常

开关(GetKeyAlgorithm())
{
案例1.Rsa:
_lazyprovatekey=Pal.getrsaprovatekey();
打破
病例:Dsa:
_lazyprovatekey=Pal.GetDSAPrivateKey();
打破
违约:
//这包括ECDSA,因为可以使用Oids.EcPublicKey密钥
//许多不同的算法种类,不一定是互斥的。
//
//另外,.NET Framework在此属性中仅支持RSA和DSA。
抛出新的NotSupportedException(SR.NotSupported_-KeyAlgorithm);
}

私钥的类型为
非对称gorithm
,需要将其强制转换为RSA或ECDsa。我记得@bartonjs说过应该使用
GetXXXPrivateKey()
方法。所以你可以自己做:

string EccTestCert=“{base64-pkcs-12-here}”;
var cert=新的X509Certificate2(将.FromBase64String(ECCTESCERT)转换为“1”);
如果(cert.HasPrivateKey){
变量键=
(非对称算法)证书GetRSAPrivateKey()
??证书GetECDsaPrivateKey()
?抛出新的NotSupportedException(“谁仍在使用DSA?”);
if(键为ECDsa ECDsa){
var ecdsaSignature=ecdsa.SignData(新字节[]{0x00},HashAlgorithmName.SHA256);
}else if(密钥为RSA){
var rsaSignature=rsa.SignData(新字节[]{0x00},HashAlgorithmName.SHA256,rsasignatureadding.Pkcs1);
}否则{
抛出新的NotSupportedException(“谁还在使用DSA?”);
}
}

源代码显示,根据您运行的平台,会引发异常

开关(GetKeyAlgorithm())
{
案例1.Rsa:
_lazyprovatekey=Pal.getrsaprovatekey();
打破
病例:Dsa:
_lazyprovatekey=Pal.GetDSAPrivateKey();
打破
违约:
//这包括ECDSA,因为可以使用Oids.EcPublicKey密钥
//许多不同的算法种类,不一定是互斥的。
//
//另外,.NET Framework在此属性中仅支持RSA和DSA。
抛出新的NotSupportedException(SR.NotSupported_-KeyAlgorithm);
}

私钥的类型为
非对称gorithm
,需要将其强制转换为RSA或ECDsa。我记得@bartonjs说过应该使用
GetXXXPrivateKey()
方法。所以你可以自己做:

string EccTestCert=“{base64-pkcs-12-here}”;
var cert=新的X509Certificate2(将.FromBase64String(ECCTESCERT)转换为“1”);
如果(cert.HasPrivateKey){
变量键=
(非对称算法)证书GetRSAPrivateKey()
??证书GetECDsaPrivateKey()
?抛出新的NotSupportedException(“谁仍在使用DSA?”);
if(键为ECDsa ECDsa){
var ecdsaSignature=ecdsa.SignData(新字节[]{0x00},HashAlgorithmName.SHA256);
}else if(密钥为RSA){
var rsaSignature=rsa.SignData(新字节[]{0x00},HashAlgorithmName.SHA256,rsasignatureadding.Pkcs1);
}否则{
抛出新的NotSupportedException(“谁还在使用DSA?”);
}
}

PKCS#12包含证书和私钥。因此,当导入带有
新X509Certificate2(myPkcs12…
的pkcs12时,实例是一个带有私钥的证书-因此您可以用它签名或解密。@DanielFisherlennybacon您好,当我尝试使用ECC证书时,X509Certificate无法返回私钥供我使用。我将使用示例Pkcs12进行更新。Pkcs12包含证书和私钥。因此,当导入带有
新X509Certificate2(myPkcs12…
的pkcs12时,实例是一个带有私钥的证书-因此您可以用它签名或解密。@DanielFisherlennybacon您好,当我尝试使用ECC证书时,X509Certificate无法返回私钥供我使用。我将更新一个Pkcs12示例。@Pkcs12如果这是你投的赞成票,它回答了你的问题,你能接受它吗?谢谢。您介意移除或扰乱Pkcs12吗?欢迎。数据替换为占位符。“我记得@bartonjs说过应该使用GetXXXPrivateKey()方法。”耶,我终于让人们明白了!到目前为止,我们的道路已经相交不止一次:-)@PKCS12如果是你投了赞成票,它回答了你的问题,你能接受它吗?谢谢。您介意移除或扰乱Pkcs12吗?欢迎。数据替换为占位符。“我记得@bartonjs说过应该使用GetXXXPrivateKey()方法。”耶,我终于让人们明白了!到目前为止,我们的道路已经相交不止一次:-)