繁体   English   中英

RSA解密C#(.NET 3.5)中的数据,该数据在php 5.3.2中使用openssl加密

[英]RSA decrypting data in C# (.NET 3.5) which was encrypted with openssl in php 5.3.2

也许有人可以让我知道。 我一直在冲浪这一段时间。

步骤1:创建根证书

 1) openssl req -x509 -nodes -days 3650 -newkey rsa:1024 -keyout privatekey.pem -out mycert.pem 2) openssl rsa -in privatekey.pem -pubout -out publickey.pem 3) openssl pkcs12 -export -out mycertprivatekey.pfx -in mycert.pem -inkey privatekey.pem -name "my certificate" 

步骤#2:根证书是否适用于php:YES

我使用publickey.pem将其读入php:

$server_public_key = openssl_pkey_get_public(file_get_contents("C:\publickey.pem"));
// rsa encrypt
openssl_public_encrypt("123", $encrypted, $server_public_key);

//and the privatekey.pem to check if it works:
openssl_private_decrypt($encrypted, $decrypted, openssl_get_privatekey(file_get_contents("C:\privatekey.pem")));

echo $decrypted;  // "123"

要么

 $server_public_key = openssl_pkey_get_public(file_get_contents("C:\\publickey.pem")); // rsa encrypt openssl_public_encrypt("123", $encrypted, $server_public_key); //and the privatekey.pem to check if it works: openssl_private_decrypt($encrypted, $decrypted, openssl_get_privatekey(file_get_contents("C:\\privatekey.pem"))); echo $decrypted; // "123" 

得出结论,加密/解密在php端使用这些openssl根证书文件正常工作。


步骤3:根证书是否适用于.NET:是的

以同样的方式,我将密钥读入.net C#控制台程序:

 X509Certificate2 myCert2 = null; RSACryptoServiceProvider rsa = null; try { myCert2 = new X509Certificate2(@"C:\\mycertprivatekey.pfx", "password"); rsa = (RSACryptoServiceProvider)myCert2.PrivateKey; } catch (Exception e) { Console.writeln(e.message); // because I left a blank catch block, I did not realize there was an exception! I missed the password for the certificate. } byte[] test = {Convert.ToByte("123")}; string t = Convert.ToString(rsa.Decrypt(rsa.Encrypt(test, false), false)); 

说到这一点,加密/解密在c#端使用这些openssl根证书文件正常工作。


第四步:在php中解密并在.NET中解密:是的

 $onett = "123" .... openssl_public_encrypt($onett, $encrypted, $server_public_key); $onettbase64 = base64_encode($encrypted); 

复制 - 粘贴$ onettbase64( “LkU2GOCy4lqwY4vtPI1JcsxgDgS2t05E6kYghuXjrQe7hSsYXETGdlhzEBlp + qhxzTXV3pw + AS5bEg9CPxqHus8fXHOnXYqsd2HL20QSaz + FjZee6Kvva0cGhWkFdWL + ANDSOWRWo / OMhm7JVqU3P / 44c3dLA1eu2UsoDI26OMw =”)到C#程序:

 byte[] transfered_onett = rsa.Decrypt(Convert.FromBase64String("LkU2GOCy4lqwY4vtPI1JcsxgDgS2t05E6kYghuXjrQe7hSsYXETGdlhzEBlp+qhxzTXV3pw+AS5bEg9CPxqHus8fXHOnXYqsd2HL20QSaz+FjZee6Kvva0cGhWkFdWL+ANDSOWRWo/OMhm7JVqU3P/44c3dLA1eu2UsoDI26OMw="), false); string result = System.Text.Encoding.UTF8.GetString(transfered_onett); // "123" 

没问题。

您需要使用专为PFX(aka pkcs#12)文件设计的X509Certificate2构造函数之一。 这些采用密码参数。 在您的原始示例中,您默默地吞下所有异常,因此您错过了错误。

这解决了。 我忘了填补catch块,所以我没有意识到c#端的证书读取有异常。 使用读取证书,解密现在没有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM