使用私钥 X.509 证书解密。

7

我有一个问题,需要使用X.509证书解密消息。

我使用makecert生成了我的证书,并使用以下选项:

makecert -r -pe -n "CN=MyCertificate" -ss CA -sr CurrentUser -a sha1 -sky signature -cy authority -sv CA.pvk CA.cer

私钥是"mypassword"。

我的问题是,当我想要解密使用先前证书加密的消息时,在c#中。

我找到了这个类http://blog.shutupandcode.net/?p=660,但在X509Decrypt方法中,PrivateKey始终为空。

public static byte[] X509Decrypt(byte[] data, string certificateFile, string password)
{
    // 加载证书并解密指定的数据
    using (var ss = new System.Security.SecureString())
    {
        foreach (var keyChar in password.ToCharArray())
            ss.AppendChar(keyChar);
// 加载受密码保护的证书文件 X509Certificate2 cert = new X509Certificate2(certificateFile, ss);
using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey) { return rsa.Decrypt(data, true); } } }

我尝试传递证书文件(.cer)

X509DecryptString(token, @"c:\CA.cer", "mypassword");

和传递pvk文件(.pvk)

使用X509DecryptString(token, @"c:\CA.pvk", "mypassword")方法时,始终会出现PrivateKey属性为空的情况。
有没有人能指导我如何使用pvk文件解密消息?
谢谢,
Jose
2个回答

12

证书本身只包含公钥(加上一些数据),而不包含私钥。(RSA私钥很少会是“mypassword”。保护您的私钥的密码可能是“mypassword”,但是私钥本身(更具体地说是RSA中的私有指数)将是一个相当长的数字。)

因此(因为CA.cer仅包含证书),X509DecryptString(token,@“c:\ CA.cer”,“mypassword”)几乎肯定无法工作。

X509DecryptString(token,@“c:\ CA.pvk”,“mypassword”);原则上可以工作,但您从中创建了一个X509Certificate2对象,它仍然需要证书和私钥。您应该能够从PKCS#12容器(.p12 / .pfx)中加载它们。

要创建此容器,您可以使用pvk2pfx

pvk2pfx -spc CA.cer -pvk CA.pvk -pfx CA.pfx

如果您没有指定 -pfx CA.pfx,它将启动交互式界面,在这种情况下,您需要勾选框以导出私钥。

然后,尝试使用该 pfx/p12 文件进行解密。


我错了。"mypassword" 不是私钥。感谢您的评论,它非常有帮助。有了新的 pfx 文件,我可以解密消息了。 - jomarmen

0

我认为你应该使用“-sky exchange”生成公钥/私钥对。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接