openssl - не удалось расшифровать данные, сгенерированные PHP - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь использовать openssl в linux bash для расшифровки данных, сгенерированных PHP-кодом

Я попытался передать -base64 -A и упомянуть -md sha256 после прочтения связанных вопросов по stackoverflow. Но ничего не помогло.

$output = false;
    $encrypt_method = "AES-256-CBC";
    $secret_key = "E@sy#$@|(";
    $secret_iv = "E@sy#$@|(";
    $string = "123456789ABCDEF"; 

   $key = hash('sha256', $secret_key);

    // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
    $iv = substr(hash('sha256', $secret_iv), 0, 16);

        $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);

    echo $output;

?>

NAMQy8pB7ZTjPacExtMBsg==

Затем я попытался расшифровать в linux:

echo "NAMQy8pB7ZTjPacExtMBsg==" |openssl enc -base64 -d -aes-256-cbc -K 905e17d5f5e4939d48bd04ff47f9de906375b87b67068b2ce5d1bbbbc8dca291 -iv 905e17d5f5e4939d -p
salt=0000000000000000
key=905E17D5F5E4939D48BD04FF47F9DE906375B87B67068B2CE5D1BBBBC8DCA291
iv =905E17D5F5E4939D0000000000000000
bad decrypt
140500719368080:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:592:


PHP Version :7.3.10

Openssl version on linux bash: OpenSSL 1.0.2k-fips  26 Jan 2017

Я ожидаю, что он расшифрует данные, когда я передаю тот же ключ / iv. что я тут не так делаю?

1 Ответ

2 голосов
/ 15 октября 2019

PHP-функция hash имеет третий параметр ($raw_output), который управляет форматом, в котором возвращается результат. Если параметр FALSE, результат возвращается в виде шестнадцатеричной строки (в нижнем регистре). Это по умолчанию. Если параметр TRUE, результат возвращается в виде двоичной строки.

Что касается использования параметров $key и $iv в openssl_encrypt -колл, я подозреваю, что результатдолжен быть возвращен в виде двоичной строки. Поэтому текущий PHP-код должен быть изменен, и значение TRUE должно быть передано в качестве 3-го параметра в hash -функции как для ключа, так и для IV.

Для отображения ключа и IV в виде шестнадцатеричных строк (счто касается OpenSSL-оператора), используйте PHP-функцию bin2hex.

Это приводит к:

Key (hex):       d7964f06c187b9ba129b0b9fd3db673fc8f83348e8fde4db339034c1944b89de
IV (hex):        d7964f06c187b9ba129b0b9fd3db673f
Output (Base64): vf6mWjgdOsBS2qE9U3/VCA==

Если вы используете этот результат в OpenSSL-statement:

echo vf6mWjgdOsBS2qE9U3/VCA== | openssl enc -base64 -d -aes-256-cbc -K d7964f06c187b9ba129b0b9fd3db673fc8f83348e8fde4db339034c1944b89de -iv d7964f06c187b9ba129b0b9fd3db673f 

расшифровка успешна.

Обновление:

Если код PHP не может быть изменен, введите иIV, используемый в выражении OpenSSL, должен быть изменен: в размещенном коде ключ 32 байта выражается в виде шестнадцатеричной строки, то есть с 64 символами или 64 байтами. Из них openssl_encrypt учитывает только первые 32 байта, т. Е. фактическая клавиша:

$key = substr(hash('sha256', $secret_key), 0, 32);

IV по-прежнему:

$iv = substr(hash('sha256', $secret_iv), 0, 16);

Для отображенияключ и IV в виде шестнадцатеричных строк (относительно оператора OpenSSL) bin2hex должен использоваться как и прежде, и это приводит к:

Key (hex):       6437393634663036633138376239626131323962306239666433646236373366
IV (hex):        64373936346630366331383762396261
Output (Base64): NAMQy8pB7ZTjPacExtMBsg==

Оператор OpenSSL:

echo NAMQy8pB7ZTjPacExtMBsg== | openssl enc -base64 -d -aes-256-cbc -K 6437393634663036633138376239626131323962306239666433646236373366 -iv 64373936346630366331383762396261

успешно расшифровывает зашифрованный текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...