C# 为什么自签名PFX X509Certificate2私钥会引发NotSupportedException?

C# 为什么自签名PFX X509Certificate2私钥会引发NotSupportedException?,c#,encryption,rsa,x509certificate,x509certificate2,C#,Encryption,Rsa,X509certificate,X509certificate2,我创建了一个自签名的PFX X509Certificate2(使用),但由于某种原因,证书的私钥抛出了NotSupportedException,而不是真正的HasPrivateKey属性 string password = "MyPassword"; ECDsa ecdsa = ECDsa.Create(); CertificateRequest certificateRequest = new CertificateRequest("cn=foobar", ecdsa, HashAlgor

我创建了一个自签名的PFX X509Certificate2(使用),但由于某种原因,证书的私钥抛出了NotSupportedException,而不是真正的HasPrivateKey属性

string password = "MyPassword";

ECDsa ecdsa = ECDsa.Create();
CertificateRequest certificateRequest = new CertificateRequest("cn=foobar", ecdsa, HashAlgorithmName.SHA256);
X509Certificate2 cert = certificateRequest.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(5));

File.WriteAllBytes("e:\\mycert.pfx", cert.Export(X509ContentType.Pfx, password));

//I tried to load the with every flag without success...
X509Certificate2 loadedCert = new X509Certificate2("e:\\mycert.pfx", password);
if (loadedCert.HasPrivateKey)
{
    //loadedCert.HasPrivateKey is true but loadedCert.PrivateKey raise a NotSupportedException... 
    using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)loadedCert.PrivateKey)
    {
        byte[] encryptedBytes = rsa.Encrypt(Encoding.UTF8.GetBytes("Hello"), false);
        byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, false);
        string result = Encoding.UTF8.GetString(decryptedBytes);
    }
}

有人提到,调用证书的导出将修复私钥,但这对我不起作用。我可能错过了什么,但我不知道会是什么。是否缺少某个参数?

您正在创建ECDSA密钥对,而
X509Certificate2。PrivateKey
仅支持存储在旧版加密服务提供商(CSP)中的DSA和RSA私钥。ECDSA始终存储在此属性不支持的密钥存储提供程序(KSP)中。相反,您必须使用
GetECDsaPrivateKey
扩展方法:

您正在创建ECDSA密钥对,而
X509Certificate2。PrivateKey
仅支持存储在传统加密服务提供商(CSP)中的DSA和RSA私钥。ECDSA始终存储在此属性不支持的密钥存储提供程序(KSP)中。相反,您必须使用
GetECDsaPrivateKey
扩展方法:

公钥加密有两种算法(RSA和ECC)。问题是您正在创建ECC(即ECDsa),然后试图将其作为RSA私钥获取。这绝对是不对的。这里您应该做的是在两侧使用一个算法。
2.如果您只想加密然后解密一段数据,为什么要使用
X509Certificate2
,请改用AES。有两种公钥密码算法(RSA和ECC)。问题是您正在创建ECC(即ECDsa),然后试图将其作为RSA私钥获取。这绝对是不对的。这里您应该做的是在两侧使用一个算法。
2.如果您只想加密然后解密一段数据,为什么要使用
X509Certificate2
,请改用AES。ECDSA和RSA是完全不同且不兼容的算法。ECDSA和RSA是完全不同且不兼容的算法。有两种以上的方法:)。(整型字段)Diffie-Hellman、RSA、DSA、ECC(可分解为ECDH、ECDSA、EC-MQV、EdDSA等),无论采用哪种GOST算法,晶格都在进行中,等等。有两种以上的方法:)。(整型字段)Diffie-Hellman、RSA、DSA、ECC(可分解为ECDH、ECDSA、EC-MQV、EdDSA等),无论采用哪种GOST算法,晶格都在进行中,等等。