2012-07-13 127 views
2

我有一个私钥和加密的字符串。实际上,字符串已经使用.NET模块加密。现在我需要解密字符串。我试图在PHP,但它抛出我下面的错误使用私钥的RSA解密

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

我试过在Perl但它需要自己的私钥,但它需要使用自己的私钥,这在我们的服务器上生成。

请在这个问题上建议我克服。 PHP,Ruby,Perl解决方案会更有帮助。

$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> 
+0

显示你失败的尝试。也许有人可以帮助你解决它。 – 2012-07-13 12:52:24

+1

[在PHP中使用RSA加密和解密文本]的可能重复(http://stackoverflow.com/questions/4484246/encrypt-and-crypt-text-with-rsa-in-php) – 2016-03-06 18:48:37

回答

3

你需要转换的关键和实际使用它:

$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"**; 
+0

它已被公开加密键。 – Pavunkumar 2012-07-13 12:58:15

2

一种解决方案是生成格式PHP需要一个键(.pem文件,我觉得格式被称为DER ASN.1,但我不知道),使用OpenSSL的(linux下通常),和然后使用OpenSSL将其转换为.NET可以读取的格式。有关更多详细信息,请参见this SO answer

在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/[email protected]' -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));