Я пытаюсь воспроизвести шифрование 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');
безуспешно.
Я что-то пропустил?
Никогда не используйте неполные строки шифра, как эта:
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);
Других решений пока нет …