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

Posted by panny on Stack Overflow See other posts from Stack Overflow or by panny
Published on 2010-06-05T06:59:48Z Indexed on 2010/06/05 12:12 UTC
Read the original article Hit count: 1287

Filed under:
|
|
|
|

Maybe someone can clear me up. I have been surfing on this a while now.

Step #1: Create a root certificate

Key generation on unix
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"

Step #2: Does root certificate work on php: YES

PHP side

I used the publickey.pem to read it into php:

$publicKey = "file://C:/publickey.pem";
$privateKey = "file://C:/privatekey.pem";
$plaintext = "123";

openssl_public_encrypt($plaintext, $encrypted, $publicKey);
$transfer = base64_encode($encrypted);
openssl_private_decrypt($encrypted, $decrypted, $privateKey);

echo $decrypted;  // "123"

OR

$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"

Coming to the conclusion, that encryption/decryption works fine on the php side with these openssl root certificate files.


Step #3: Does root certificate work on .NET: YES

C# side

In same manner I read the keys into a .net C# console program:

X509Certificate2 myCert2 = new X509Certificate2();
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

try
{
    myCert2 = new X509Certificate2(@"C:\mycertprivatekey.pfx");
    rsa = (RSACryptoServiceProvider)myCert2.PrivateKey;
}
catch (Exception e)
{
}

byte[] test = {Convert.ToByte("123")};

string t = Convert.ToString(rsa.Decrypt(rsa.Encrypt(test, false), false));

Coming to the point, that encryption/decryption works fine on the c# side with these openssl root certificate files.


Step #4: Enrypt in php and Decrypt in .NET: !!NO!!

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

copy - paste $onettbase64 ("LkU2GOCy4lqwY4vtPI1JcsxgDgS2t05E6kYghuXjrQe7hSsYXETGdlhzEBlp+qhxzTXV3pw+AS5bEg9CPxqHus8fXHOnXYqsd2HL20QSaz+FjZee6Kvva0cGhWkFdWL+ANDSOWRWo/OMhm7JVqU3P/44c3dLA1eu2UsoDI26OMw=") into c# program:

C# side
byte[] transfered_onettbase64 = Convert.FromBase64String("LkU2GOCy4lqwY4vtPI1JcsxgDgS2t05E6kYghuXjrQe7hSsYXETGdlhzEBlp+qhxzTXV3pw+AS5bEg9CPxqHus8fXHOnXYqsd2HL20QSaz+FjZee6Kvva0cGhWkFdWL+ANDSOWRWo/OMhm7JVqU3P/44c3dLA1eu2UsoDI26OMw=");

string k = Convert.ToString(rsa.Decrypt(transfered_onettbase64, false)); // Bad Data exception

==> Exception while decrypting!!! Any ideas?

© Stack Overflow or respective owner

Related posts about c#

Related posts about .NET