在PHP中,我是RSA加密要由.NET应用程序解密的消息......但我不断从.NET获得“坏键”异常....
对于RSA加密,我使用的是PEAR类Crypt_RSA->用.NET中的工作加密系统获得的公钥(模数,指数对)进行加密...
我想最容易的问题是 - > “坏键”是否意味着它无法解密任何消息? IE,它没有正确加密?
更难的问题是 - >有没有什么特别的RSA加密导致.NET和PHP之间的怪癖?
答案 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。