7

我在解密消息时遇到问题 usgin X.509 证书。

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

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

PrivateKey 是“我的密码”。

我的问题是当我想解密用 c# 中以前的证书加密的消息时。

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

public static byte[] X509Decrypt(byte[] data, string certificateFile, string password)
{
    // 加载证书并解密指定数据
    使用 (var ss = new System.Security.SecureString())
    {
        foreach (var keyChar in password.ToCharArray())
            ss.AppendChar(keyChar);

        // 加载受密码保护的证书文件
        X509Certificate2 证书 = 新 X509Certificate2(certificateFile, ss);

        使用 (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey)
        {
            返回 rsa.Decrypt(数据,真);
        }    
    }
}

我尝试通过证书文件(.cer)

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

并传递 pvk 文件 (.pvk)

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

但总是有 PrivateKey 属性为空。

谁能指导我使用 pvk 文件解密消息?

谢谢,

何塞

4

2 回答 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 文件进行解密。

于 2010-11-04T14:45:12.070 回答
0

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

于 2010-11-04T18:49:13.863 回答