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.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
Прокладки обычно рандомизированы. Существует вариант заполнения PKCS#1 v1.5 типа 1, в котором не используется рандомизация, поэтому каждый зашифрованный текст будет одинаковым для одного и того же ключа и открытого текста. Если вы хотите проверить совместимость между рандомизированными версиями, вам нужно зашифровать в Java и расшифровать в PHP, и наоборот. - person Artjom B.; 10.12.2015