RSA-расшифровка данных в C # (.NET 3.5), которая была зашифрована с помощью openssl в php 5.3.2

Может, кто-то может меня убрать. Сейчас я занимаюсь серфингом.

Шаг №1: Создайте корневой сертификат

Генерация ключей на 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" 

Шаг №2: Работает ли корневой сертификат на php: ДА

Сторона PHP

Я использовал publickey.pem для чтения в 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" 

ИЛИ

 $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 с этими файлами сертификатов rootsls openssl.


Шаг №3: Работает ли корневой сертификат на .NET: ДА

C # сторона

Таким же образом я читаю ключи в консольной программе .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 # с этими файлами сертификатов rootsls openssl.


Шаг 4: Enrypt в php и расшифровать в .NET: YES

Сторона PHP

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

копия – паста $ onettbase64 ( "LkU2GOCy4lqwY4vtPI1JcsxgDgS2t05E6kYghuXjrQe7hSsYXETGdlhzEBlp + qhxzTXV3pw + AS5bEg9CPxqHus8fXHOnXYqsd2HL20QSaz + FjZee6Kvva0cGhWkFdWL + ANDSOWRWo / OMhm7JVqU3P / 44c3dLA1eu2UsoDI26OMw =") в C # программы:

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" 

Нет проблем.

Вам нужно использовать один из конструкторов X509Certificate2, предназначенных для файлов PFX (aka pkcs # 12). Они принимают аргумент пароля. В вашем первоначальном примере вы молча проглотили все исключения, чтобы вы пропустили ошибку.

Это решено. Я забыл заполнить блок catch, поэтому я не понимал, что существует исключение с показанием сертификата на стороне c #. С сертификатом чтения расшифровка теперь не проблема.