我使用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-----
答案 0 :(得分:1)
一些评论。
您可能会发现此页面有帮助:
http://phpseclib.sourceforge.net/interop.html#rsaencpkcs1,p1phpseclib,p2openssl
我在先前的回答中建议您进行$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模式时才执行任何操作,而您不在。
您张贴的内容是您在做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
,然后连接每个连续的密文。我的猜测是您的情况正在发生。因此,要么需要加密较少的数据,要么想出另一种方法。例如。加密对称密钥,然后使用对称密钥对数据进行加密。