C#上的证书加密/解密错误

时间:2011-07-08 09:45:08

标签: c# cryptography certificate rsa public-key-encryption

以下命令用于创建名为myalias.p12的密钥库,并导出名为myalias2.cer的证书。

Java Keytool 是一个密钥和证书管理实用程序。它允许用户管理自己的公钥/私钥对和证书。

E:\>keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias myalias2 -keystore myalias.p12 -storetype pkcs12 -dname "cn=www.myalias.com, ou=myalias2, o=myalias2, l=tp, st=tp, c=tw" -storepass 123456 -keypass 123456

E:\>keytool -export -alias myalias2 -keystore myalias.p12 -storetype pkcs12 -rfc -file myalias2.cer -storepass 123456

加密:

string input="hello";            
X509Certificate2 myCertificate = GetCertFromCerFile("e:\\myalias2.cer");
RSACryptoServiceProvider provider1 = (RSACryptoServiceProvider)myCertificate.PublicKey.Key;
byte[] buffer1 = Encoding.UTF8.GetBytes(input);
byte[] result = provider1.Encrypt(buffer1, false);
string data= Convert.ToBase64String(result); 

解密:

44.  RSACryptoServiceProvider provider2 = (RSACryptoServiceProvider)myCertificate.PrivateKey;
45.  byte[] buffer2 = Convert.FromBase64String(data);
46.  byte[] result2 = provider2.Decrypt(buffer2, false); // <-- error here
47.  String decryptedMessage = Encoding.UTF8.GetString(result2);

它通常可以执行加密操作。但是,我在第46行发现了一些错误(执行解密):

  

类型的第一次机会异常   'System.NullReferenceException'   发生在CertTest.exe线程中   ''(0xcc8)已经退出   代码为0(0x0)。在   CertTest.Program.Decrypt(字符串数据)   在   d:\ vsworkspace \ CertTest \ CertTest \的Program.cs:行   46点   CertTest.Program.Main(String [] args)   在   d:\ vsworkspace \ CertTest \ CertTest \的Program.cs:行   29

有人有想法吗?因为我不知道如何解决这个问题。 非常感谢!

1 个答案:

答案 0 :(得分:0)

你得到的NullReferenceException是因为PrivateKey为null。这是因为.cer文件只包含一个.X509证书,该证书仅包含公钥。

在这种情况下,这意味着您只能使用证书加密数据。为了解密它,你需要私钥。

您可以使用.p12(或.pfx)文件访问私钥。此PKCS#12文件(通常)包括私钥(受密码保护)和证书。

有几个X509Certificate [2]构造函数将接受密码并自动解密私钥。从.p12文件加载后,您的代码将收到一个有效的(非空)RSACryptoServiceProvider实例,您将能够解密数据。

顺便说一句,你不应该使用RSA以这种方式加密字符串(或数据):-) 有关详细信息,请参阅http://pages.infinit.net/ctech/20031101-0151.html