我有一个问题是解密消息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是“mypassword”。
我的问题是当我想解密使用c#中的先前证书加密的邮件时。
我发现了这个类http://blog.shutupandcode.net/?p=660,但是在 X509Decrypt 方法中,PrivateKey一直是null。
public static byte[] X509Decrypt(byte[] data, string certificateFile, string password) { // load the certificate and decrypt the specified data using (var ss = new System.Security.SecureString()) { foreach (var keyChar in password.ToCharArray()) ss.AppendChar(keyChar); // load the password protected certificate file 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属性为null。
有人可以指导我使用pvk文件解密邮件吗?
谢谢,
何
答案 0 :(得分: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文件进行解密。
答案 1 :(得分:0)
我认为您应该使用“-sky exchange”来生成公钥/私钥对。