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
успешно расшифровывает зашифрованный текст.