【问题标题】:Decrypt with PrivateKey X.509 Certificate使用 PrivateKey X.509 证书解密
【发布时间】:2011-05-05 02:15:29
【问题描述】:

我在使用 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 文件解密消息?

谢谢,

何塞

【问题讨论】:

    标签: c# .net certificate private-key


    【解决方案1】:

    证书本身只包含公钥(+一些数据),但不包含私钥。 (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 文件进行解密。

    【讨论】:

    • 我错了。 “我的密码”不是私钥。感谢您的评论,它很有帮助。使用新的 pfx 文件,我可以解密消息。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2012-07-22
      • 1970-01-01
      • 2011-09-21
      相关资源
      最近更新 更多