Расшифровка RSA с использованием закрытого ключа

У меня есть закрытый ключ и зашифрованная строка. Фактически строка была зашифрована с использованием .NET-модулей. Теперь мне нужно расшифровать строку. Я пробовал в php, но это бросает мне следующую ошибку

openssl_private_decrypt(): key parameter is not a valid private key 

Я пробовал в perl, но там он берет свой собственный секретный ключ, но ему нужен собственный личный ключ, который был сгенерирован на нашем сервере.

Пожалуйста, предложите мне решить эту проблему. PHP, Ruby, Perl Solution было бы более полезным.

 $crypttext="gKL/n5hkBg4jyjrLRqjQbf9gAS3xnbp1xmCmamPO33fW21JAJtlVQHYR6O1dOw3tfobMe/0uXm/kgivae9zHNey4Wt3UGzPwosUrx7V8zhC97AXya2tuENO1Fmc4Z8l9+UalwtUZxMGtl3Ua9DYuvxLP/TuavgRNpmG6eemGPag="; $fp=fopen("private.pem","r"); $priv_key=fread($fp,8192); fclose($fp); openssl_private_decrypt(base64_decode($crypttext ),$newsource,false ) ; echo "String decrypt : $newsource"**; 

Закрытый ключ

 <BitStrength>1024</BitStrength><RSAKeyValue><Modulus>t2G2WWIal1EinPn54ZPc3S1UgGTDxr6RFc+XEMR723VSg9toU8lSfTD7C26bUcbDxBwP1/1MbdQcx/dKX+7UlB5z79vrwfT89rUZGWeH7VZvuAawtHURgucyGMhqAZ9NxDEAl5Uo3nsNL9j1JlSBfeZf8pU5sf70KezqJTRsfrE=</Modulus><Exponent>AQAB</Exponent><P>82dZbOjQCJ7NV6EuVJXqPlh4FB65LBL1w9696sKFZuIr8refGwTZOY05se6oHbT9mn8OFXVA6A/wmz7oWNPk9w==</P><Q>wN8uixNk73DIF2SHb0aunnW5XxAIq3KxeQKoUTBAzL7BqXmKjk6XDnfxDbybmcT51wGhiO20lGg51zuxnsPXlw==</Q><DP>Kv4+VXZqCJvEOY5G2LoCPjDyRNuIabiPoKFfenARkDKzAJReji81D21am4tENrsZcIiwvCmR5WurXECoWchT0Q==</DP><DQ>qGRzW4O0VYVvfVUNFi9tF/aKwR/boe0CXDfgwvnRKbHGnfP67+JX6o73zFmGtQuQYpMO+OEpD4WsMmnw2z/7ww==</DQ><InverseQ>czq4+xiiVxb63ZtKwkxyJoDLFH0f18YlfFQTrEoAx7UE9HdjOjsJFpZ54g0yK3/S/yVgIXPwMcw6LU1QvqazPg==</InverseQ><D>Ktp/tWWSlzfToeFcvpVCMMGOFK73fTM9Tl6Di9yOoRtKnBuixqmuSCkxEVvYmgSb7PEt1qiPur6ttyEX1VFHhaugTr3aVhUpF+k7ULaHrCb8UymXXW3pp/yl/QOMPWuNKVv/GU3aQ3VTc3WUaYuOnaIkJk7uoYDQn0QqWtxtT60=</D></RSAKeyValue> 

Solutions Collecting From Web of "Расшифровка RSA с использованием закрытого ключа"

phpseclib, простая реализация PHP RSA , поддерживает XML-ключи в этом формате. Пример использования:

 <?php include('Crypt/RSA.php'); $rsa = new Crypt_RSA(); $rsa->loadKey('...'); // private key echo $rsa->decrypt($ciphertext); ?> в <?php include('Crypt/RSA.php'); $rsa = new Crypt_RSA(); $rsa->loadKey('...'); // private key echo $rsa->decrypt($ciphertext); ?> 

вам нужно преобразовать ключ и фактически использовать его:

 $crypttext="gKL/n5hkBg4jyjrLRqjQbf9gAS3xnbp1xmCmamPO33fW21JAJtlVQHYR6O1dOw3tfobMe/0uXm/kgivae9zHNey4Wt3UGzPwosUrx7V8zhC97AXya2tuENO1Fmc4Z8l9+UalwtUZxMGtl3Ua9DYuvxLP/TuavgRNpmG6eemGPag="; $priv_key = openssl_pkey_get_private("file://path/to/private.pem"); openssl_private_decrypt(base64_decode($crypttext ), $newsource, $priv_key ) ; echo "String decrypt : $newsource"**; 

Решение состоит в том, чтобы сгенерировать ключ в формате PHP, который ожидает ( .pem файл, я думаю, что формат называется DER ASN.1 но я не уверен), используя openssl (обычно под Linux), а затем конвертирует его, все еще используя OpenSSL, в формат, который может читать .NET . См. Этот ответ SO для получения более подробной информации.

Под Linux:

 openssl genrsa -out private.pem 1024 openssl rsa -in private.pem -out public.pem -pubout openssl req -nodes -x509 -days 3650 -subj '/CN=www.example.com/emailAddress=info@example.com' -new -key private.pem -out certificate.crt openssl pkcs12 -export -out certificate.pfx -inkey private.pem -in certificate.crt 

В .NET:

 // Get the public key X509Certificate2 pubCertificate = new X509Certificate2("certificate.crt", "passphrase", X509Certificates.X509KeyStorageFlags.Exportable); RSACryptoServiceProvider public = (RSACryptoServiceProvider)(pubCertificate.PublicKey.Key); System.Console.WriteLine(public.ToXmlString(false)); // Get the private key X509Certificate2 privCertificate = new X509Certificate2("certificate.pfx", "passphrase", X509Certificates.X509KeyStorageFlags.Exportable); RSACryptoServiceProvider private = (RSACryptoServiceProvider)(privCertificate .PrivateKey); System.Console.WriteLine(private.ToXmlString(true));