RSA在PHP中加密以在.NET中解密

时间:2010-04-09 15:07:58

标签: php .net rsa pear

在PHP中,我是RSA加密要由.NET应用程序解密的消息......但我不断从.NET获得“坏键”异常....

对于RSA加密,我使用的是PEAR类Crypt_RSA->用.NET中的工作加密系统获得的公钥(模数,指数对)进行加密...

我想最容易的问题是 - > “坏键”是否意味着它无法解密任何消息? IE,它没有正确加密?

更难的问题是 - >有没有什么特别的RSA加密导致.NET和PHP之间的怪癖?

2 个答案:

答案 0 :(得分:14)

  

安全警告:使用OAEP,not PKCS#1

如果您想使用不需要openssl扩展的解决方案,请尝试使用phpseclib的Crypt_RSA。示例如下:

使用PKCS#1填充解密:

openssl rsautl -inkey privatekey.txt -encrypt -in plaintext.txt -out ciphertext.txt

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
echo $rsa->decrypt(file_get_contents('ciphertext.txt'));
?>

使用PKCS#1填充进行加密:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
$rsa->loadKey($rsa->getPublicKey());
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
echo $rsa->encrypt('1234567890');
?>

openssl rsautl -inkey privatekey.txt -decrypt -in ciphertext.txt -out plaintext.txt

使用OAEP填充解密:

openssl rsautl -inkey privatekey.txt -encrypt -oaep -in plaintext.txt -out ciphertext.txt

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
echo $rsa->decrypt(file_get_contents('ciphertext.txt'));
?>

使用OAEP填充进行加密:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
$rsa->loadKey($rsa->getPublicKey());
echo $rsa->encrypt('1234567890');
?>

openssl rsautl -inkey privatekey.txt -decrypt -oaep -in ciphertext.txt -out plaintext.txt

phpseclib可以从http://phpseclib.sourceforge.net/

下载 祝你好运!

答案 1 :(得分:3)

PEAR上的Crypt_RSA未使用PKCS#1编码。我怀疑这就是为什么.NET会给你一个错误信息。

作为一个破坏的例子,我使用Crypt_RSA创建了一个PHP脚本来加密字符串“1234567”(我将跳过显示密钥加载):

print $rsa_obj->encryptBinary("1234567", $key_pair->getPublicKey());

获取该输出并通过openssl命令行工具进行管道输出会产生以下错误:

$ ./crypt | openssl rsautl -inkey privkey.pem -decrypt
RSA operation error
18437:error:04065084:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data too large for modulus:fips_rsa_eay.c:558:

openssl默认使用PKCS#1填充,但是向openssl添加-raw(无填充)标志也无济于事。

使用php中的openssl扩展名提供正确的填充(默认为PKCS#1,其他可用):

$pem = file_get_contents("pubkey.pem");
$key = openssl_pkey_get_public($pem);

$encrypted = "";
if(openssl_public_encrypt("1234567", $encrypted, $key)) {
  print $encrypted;
} else {
  print "failed\n";
}

php中的解密代码:

$pem = file_get_contents("privkey.pem");
$key = openssl_pkey_get_private($pem);

$enc_data = file_get_contents("openssl.crypted");
$decrypted = "";
if(openssl_private_decrypt($enc_data, $decrypted, $key)) {
  print "$decrypted\n";
} else {
  print "failed\n";
}

RSA上下文中的证书是X.509证书,它们是RSA密钥以及有关这些密钥的数据。 X.509证书在SSL中使用,但不要求使用RSA。