以下命令用于创建名为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
有人有想法吗?因为我不知道如何解决这个问题。 非常感谢!
答案 0 :(得分:0)
你得到的NullReferenceException是因为PrivateKey为null。这是因为.cer文件只包含一个.X509证书,该证书仅包含公钥。
在这种情况下,这意味着您只能使用证书加密数据。为了解密它,你需要私钥。
您可以使用.p12(或.pfx)文件访问私钥。此PKCS#12文件(通常)包括私钥(受密码保护)和证书。
有几个X509Certificate [2]构造函数将接受密码并自动解密私钥。从.p12文件加载后,您的代码将收到一个有效的(非空)RSACryptoServiceProvider实例,您将能够解密数据。
顺便说一句,你不应该使用RSA以这种方式加密字符串(或数据):-) 有关详细信息,请参阅http://pages.infinit.net/ctech/20031101-0151.html