Расшифровка phpseclib RSA с помощью openssl - PullRequest
0 голосов
/ 07 сентября 2018

Я использовал 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 голосов
/ 08 сентября 2018

Несколько комментариев.

  1. Вы можете найти эту страницу полезной:

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

  2. В моем предыдущем ответе я предлагал вам сделать $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);. Ваше последнее отредактированное сообщение все еще не заставляет вас делать это:

    $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

Вот вывод, который я получил:

...
0 голосов
/ 07 сентября 2018

Во-первых, phpseclib по умолчанию выполняет заполнение OAEP. Это более безопасно, но менее распространено. Попробуйте сделать $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);.

Во-вторых, RSA имеет верхнюю границу размера данных, которые могут быть зашифрованы. Для PKCS1 это размер по модулю - 11 (например, ($rsa->getSize() >> 3) - 11). Я знаю, насколько большие данные вы пытаетесь зашифровать, но я думаю, что они больше, чем это. Итак, что phpseclib делает в этой ситуации, так это то, что он будет str_split обрабатывать его, а затем объединять каждый последующий зашифрованный текст. Я думаю, что это то, что происходит в вашем случае. Поэтому вам нужно либо шифровать меньше данных, либо придумать другой подход. например. зашифруйте симметричный ключ, а затем используйте симметричный ключ для шифрования данных.

...