2015-12-09 4 views
2

Я пытаюсь воспроизвести Java-шифрование, используя Cipher cipher = Cipher.getInstance("RSA"); с PHP и phpseclib.Phpseclib эквивалент Java RSA Encryption

Я попытался это и так много вещей, но мне кажется, что данные не правильно шифруется

$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'); 

без успеха.

Я что-то упустил?

ответ

3

Не когда-либо использовать неполный шифр строки, как это:

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 (meaning):

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); 
+0

Спасибо за ваш ответ, к сожалению, у меня нет доступа к коду Java: /. Я уже пробовал с «CRYPT_RSA_ENCRYPTION_PKCS1» без успеха. – Kevlys

+0

Когда я пытаюсь использовать 'CRYPT_RSA_ENCRYPTION_PKCS1',' $ enciphertext' уже тот же, тогда как Java-код каждый раз производит разные ключи. Я полагаю, что 'Cipher.getInstance (« RSA »);' использует OAEP? – Kevlys

+1

Прокладки обычно рандомизированы. Существует вариант 1 варианта дополнения PKCS # 1 v1.5, который не использует рандомизацию, поэтому каждый зашифрованный текст будет одинаковым для одного и того же ключа и открытого текста. Если вы хотите проверить совместимость рандомизированных версий, вам необходимо зашифровать в Java и расшифровать в PHP и наоборот. –