使用openssl的phpseclib RSA解密

时间:2018-09-07 08:57:45

标签: php encryption openssl phpseclib

我使用phpseclib进行加密,openssl解密存在一些问题

//generate keys
extract($rsa->createKey(1024));
file_put_contents("public.pem",$publickey);
file_put_contents("private.pem",$privatekey);

加密文本

    $rsa->loadKey($public_key); // public key
    $plaintext = '...';
    $ciphertext = $rsa->encrypt($plaintext);
    file_put_contents("ciphertext.txt",$ciphertext);

因此,在Linux中,我正在解密:

xxd -p ciphertext.txt | tr -d '\n' 

最后像下面的命令

openssl rsautl -decrypt -inkey private.pem

遇到此错误:

error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02:rsa_pk1.c:190:
error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed:rsa_eay.c:674:

我正在为phpseclib进行以下设置:

define('CRYPT_RSA_PKCS15_COMPAT', true);

,现在在openssl上收到此错误:

error:04065084:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data too large for modulus:rsa_eay.c:590:

公钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDGCglgIcCG5a8xlZHEDRtQQTc4
kfxENNBtVN8bE4errA06mJ10WavP2Hg+k11NQip71IQPfIF9jlk1CsqT5ZHXOrOq
RmufHFLa3fiuPvFiMB1NjK4F28Gk4LwyZrfTWc2V6S0xpL5XkFeWRW6I69xckOXj
GqkC5dsWv/IlvPeVbwIDAQAB
-----END PUBLIC KEY-----

私钥:

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDGCglgIcCG5a8xlZHEDRtQQTc4kfxENNBtVN8bE4errA06mJ10
WavP2Hg+k11NQip71IQPfIF9jlk1CsqT5ZHXOrOqRmufHFLa3fiuPvFiMB1NjK4F
28Gk4LwyZrfTWc2V6S0xpL5XkFeWRW6I69xckOXjGqkC5dsWv/IlvPeVbwIDAQAB
AoGBAJj1yZYJm8XVg8Kdjs/Je846AOfdweYAkPfRNN2Z8RFEu5cFp5/lXtITlZRn
iAoTT/MDCtlXRkDvALH6Wstu5nvk+Xz5dFlZ6OUmK04YakHc0N5NABMygvCmGdnr
BoTJx70dPVFXqiq/ft5KRLEdxVWvex+odgWunqSJXMperrhxAkEA89/A7jadwCjA
iyaTmGEMqerN4XdTtQj4NpKorTv9FlmU9U9XWmv0wk5ExmUzjo9gs71a06/ecaHc
xJUj3X1O5wJBAM/i2zmAg1vhR/s23b70LPf4O1/d5GdQTJwHhZp4OMzW6qt7qmRR
vIzHHPbljOwvUzNtoXhez3TNsgtWg9XaXDkCQQDujYJgwoYfEP3/X9XiqZREpg2M
LjhwjvyWDXH4OwT/ltNR/rF5Hr8GTp+R3i7HldLHH0O4bIFQcD/PAABcSZYjAkAZ
QxwY1MEhvTKeGIDB37JHP+cXM0O6OkvU+iUGLG3alpNV22VNY5FiGiAu8J47ZVTa
/wuMMRlMvGJSdmT2694hAkBjqYMwpYg+MXhY9zKYM8lGISpirz+pKSpKwB90FASY
4AIuFBFHV5F5iqrSKNU39Rv+alYAKP/UuqPVH84GlWjl
-----END RSA PRIVATE KEY-----

2 个答案:

答案 0 :(得分:1)

一些评论。

  1. 您可能会发现此页面有帮助:

    http://phpseclib.sourceforge.net/interop.html#rsaencpkcs1,p1phpseclib,p2openssl

  2. 我在先前的回答中建议您进行$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);。您最近编辑过的帖子 still 没有让您这样做:

    $rsa->loadKey($public_key); // public key
    $plaintext = '...';
    $ciphertext = $rsa->encrypt($plaintext);
    file_put_contents("ciphertext.txt",$ciphertext);
    

    define('CRYPT_RSA_PKCS15_COMPAT', true);仅在您处于PKCS1模式时才执行任何操作,而您不在。

  3. 您张贴的内容是您在做openssl rsautl -decrypt -inkey private.pem。 idk整个xxd命令应该如何工作,但是正常情况下,在OpenSSL中,您需要通过执行-in ciphertext.txt来指定输入文件,而实际上并没有这样做。

工作代码

使用您的公钥和私钥对我有用:

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

$rsa = new Crypt_RSA();

$public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDGCglgIcCG5a8xlZHEDRtQQTc4
kfxENNBtVN8bE4errA06mJ10WavP2Hg+k11NQip71IQPfIF9jlk1CsqT5ZHXOrOq
RmufHFLa3fiuPvFiMB1NjK4F28Gk4LwyZrfTWc2V6S0xpL5XkFeWRW6I69xckOXj
GqkC5dsWv/IlvPeVbwIDAQAB
-----END PUBLIC KEY-----';
$rsa->loadKey($public_key); // public key
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$plaintext = '...';
$ciphertext = $rsa->encrypt($plaintext);
file_put_contents("ciphertext.txt",$ciphertext);

...以及在CLI上:

openssl rsautl -decrypt -inkey private.pem -in ciphertext.txt

这是我得到的输出:

...

答案 1 :(得分:0)

首先,phpseclib默认执行OAEP填充。它更安全,但不那么常见。尝试做$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

第二,RSA确实对可以加密的数据大小有上限。对于PKCS1,它是模数的大小-11(例如($rsa->getSize() >> 3) - 11)。 idk您要加密的数据量有多大,但我猜想它要大得多。因此,在这种情况下phpseclib会执行str_split,然后连接每个连续的密文。我的猜测是您的情况正在发生。因此,要么需要加密较少的数据,要么想出另一种方法。例如。加密对称密钥,然后使用对称密钥对数据进行加密。