Почему AES не может расшифровать, PHP.Openssl - PullRequest
0 голосов
/ 28 февраля 2019

У меня проблемы с расшифровкой. У меня есть

 $key="Gwu078980";
 $cipher="aes-128-gcm";
 $iv=md5($cipher);
 $text="yaw0";
 $tag="";
 echo $encrypted=openssl_encrypt($text, $cipher, $key, 0, $iv, $tag);

 echo $de_ciphertext=openssl_decrypt($encrypted, $cipher, $key, 0, $iv, $tag);

Вывод

ELRmWQ==
yaw0

Так что необработанный текст равен yaw0, а зашифрованный равен ELRmWQ==, а расшифрованный настолько совершенен yaw0.

Но когда я вручную копирую зашифрованный текст и использую его как

$encrypted ="ELRmWQ==";

И я запускаю расшифровку, расшифровка возвращает ноль.Заранее спасибо всем, кто выручил меня.

1 Ответ

0 голосов
/ 28 февраля 2019

Ваше сообщение openssl_encrypt изменяет $tag по ссылке, поскольку вы используете aes-128-gcm.

Этот параметр требуется для openssl_decrypt также (при использовании AEAD - Authenticated Encryption and Decryption) и являетсявероятно, пустая строка в вашем случае, когда вы пропускаете вызов openssl_encrypt.

См. Пример 1 в документации:

Комментарий о сохранении $cipher, $iv, and $tag - этоважная часть:

<?php
//$key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
    //store $cipher, $iv, and $tag for decryption later
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}
?>
...