关于具有可导出私钥的证书的c#:“Bad key”例外

“Bad key” exception for certificates with exportable private key

我正在尝试使用非对称加密来加密和解密文件。我使用makecert创建了一个测试证书,并将其安装到我的个人localmachine存储中。将来,我将不得不在多个服务器上安装此证书,这就是为什么我使用"-pe"标志(即可导出的私钥)创建它的原因。证书已成功创建和安装,我在MMC中看到"您有一个与此证书对应的私钥"说明。

现在,我尝试用.NET 3.5中的rsacryptoseServiceProvider加密数据。它成功了。但是当我试图解密它时,我得到了"坏密钥"异常。

如果我在没有"-pe"选项的情况下创建证书,那么同样的代码在解密时也能很好地工作。代码如下:

1
2
3
RSA rsaKey = (RSA)myCertificate.PrivateKey;
RSACryptoServiceProvider rsaCsp = (RSACryptoServiceProvider)rsaKey;
byte[] plainText = rsaCsp.Decrypt(encryptedText, true);

我还尝试了另一种方法,使用system.security.cryptography.pkcs命名空间:

1
2
3
4
EnvelopedCms envelope = new EnvelopedCms();
envelope.Decode(encryptedText);
envelope.Decrypt();
byte[] plainText = envelope.ContentInfo.Content;

结果是一样的…有人能帮忙吗?


如果使用makecert.exe,请确保使用"-sky exchange"创建了正在使用的密钥。没有这个,您只能使用密钥进行签名和身份验证,而不能使用加密/解密,这是您在这里实现的用例。