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

C# C上的证书加密/解密错误,c#,cryptography,certificate,rsa,public-key-encryption,C#,Cryptography,Certificate,Rsa,Public Key Encryption,以下命令用于生成名为myalias.p12的密钥库,并导出名为myalias2.cer的证书 JavaKeyTool是一个密钥和证书管理实用程序。它允许用户管理自己的公钥/私钥对和证书 E:\>keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias myalias2 -keystore myalias.p12 -storetype pkcs12 -dname "cn=w

以下命令用于生成名为myalias.p12的密钥库,并导出名为myalias2.cer的证书 JavaKeyTool是一个密钥和证书管理实用程序。它允许用户管理自己的公钥/私钥对和证书

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行执行解密时发现了一些错误:

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);
类型的第一次机会例外 “System.NullReferenceException” 在线程的CertTest.exe中发生 0xcc8已退出 代码为0 0x0。在 CertTest.Program.DecryptString数据 在里面 D:\vsworkspace\CertTest\CertTest\Program.cs:line 46在 CertTest.Program.MainString[]参数 在里面 D:\vsworkspace\CertTest\CertTest\Program.cs:line 二十九

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

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

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

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

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
有几个X509Certificate[2]构造函数将接受密码并自动解密私钥。从.p12文件加载后,您的代码将收到一个有效的非空RSACryptServiceProvider实例,您将能够解密数据

顺便说一句,您不应该使用RSA以这种方式加密字符串或数据:-
有关更多详细信息,请阅读

您的buffer2为空,可能是因为您的数据为空,所以在第46行设置断点并进行检查。最有可能的情况是,您的证书不包含私钥,因此provider2为空。检查myCertificate.PrivateKey是否为空。