Phpseclib, еквивалентен на Java RSA криптиране

Опитвам се да възпроизведа криптиране на Java с помощта на Cipher cipher = Cipher.getInstance("RSA"); с PHP и phpseclib.

Опитах това и толкова много неща, но изглежда данните не са правилно криптирани

$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
$rsa->loadKey($pub_key);
$ciphertext = $rsa->encrypt($plaintext);

Пробвах различни комбинации като

$rsa->setMGFHash('sha512');
$rsa->setHash('sha512');
//$rsa->setMGFHash('sha256');
//$rsa->setHash('sha256');

без успех.

Изпускам ли нещо?


person Kevlys    schedule 09.12.2015    source източник


Отговори (1)


Никога не използвайте непълни низове на Cipher като този:

Cipher cipher = Cipher.getInstance("RSA");

Това не определя подложката и следователно зависи от това коя подложка предпочита доставчикът на защита по подразбиране. Това вероятно ще бъде по подразбиране:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

Това би било съвместимо с

$rsa = new Crypt_RSA();
$rsa->loadKey($pub_key);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$ciphertext = $rsa->encrypt($plaintext);

Но вече не трябва да използвате подложка PKCS#1 v1.5. Наистина трябва да използвате OAEP (което означава):

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");

и еквивалентът на phpseclib трябва да бъде

$rsa = new Crypt_RSA();
$rsa->loadKey($pub_ley);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
$rsa->setHash('sha256');
$ciphertext = $rsa->encrypt($plaintext);
person Artjom B.    schedule 09.12.2015
comment
Благодаря за отговора, за съжаление нямам достъп до Java кода :/. Вече опитах с CRYPT_RSA_ENCRYPTION_PKCS1, но вече без успех. - person Kevlys; 10.12.2015
comment
Когато опитам с CRYPT_RSA_ENCRYPTION_PKCS1, $ciphertext вече е същият, докато Java кодът произвежда различен ключ всеки път. Предполагам, че „Cipher.getInstance(RSA);“ използва OAEP? - person Kevlys; 10.12.2015
comment
Подложките обикновено са рандомизирани. Има вариант тип 1 на PKCS#1 v1.5 подпълване, който не използва рандомизация, така че всеки шифрован текст ще бъде един и същ за един и същи ключ и обикновен текст. Ако искате да проверите съвместимостта между рандомизираните версии, тогава трябва да шифровате в Java и да дешифрирате в PHP и обратно. - person Artjom B.; 10.12.2015