Расшифровка генерируемой PHP строки OpenSSL в терминале

Этот вопрос помогает во второй части моего предыдущего вопроса .
Я столкнулся с другими темами с похожими вопросами, но из-за недавних изменений в PHP (т. Е. Удаления mcrypt), я ищу несколько советов относительно того, как мне лучше всего это делать, используя OpenSSL в 2017/18.

Я разработал следующую функцию в скрипте PHP. Он принимает текстовую строку и шифрует ее.

<?php function encrypt( $myString) { $data = $myString; $key = 'B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF'; $iv = '61736466673534336173646667353433'; $encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, 0, hex2bin($iv)); return $encrypted; } ?> 

Возвращает: 6Q7DM7VGEeJdnGf2h9k1Kg ==

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

До сих пор я мог использовать следующие команды терминала в AppleScript (для более быстрой манипуляции с переменными), но содержимое do shell script – это код терминала:

 set encKey to "B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF" set encIV to "61736466673534336173646667353433" set stringToEnc to "my plain text string" set encrypted to (do shell script "echo '" & stringToEnc & "' | openssl enc -aes-256-cbc -a -K " & encKey & " -iv " & encIV) set decrypted to (do shell script "echo '" & encrypted & "' | openssl enc -aes-256-cbc -a -d -K " & encKey & " -iv " & encIV) 

Тем не менее, хотя это работает так, как если бы, encrypted (в сценарии выше) вывод функции PHP, он выдает ошибку:

bad decrypt 140735624655752: error: 06065064: цифровые конверты: EVP_DecryptFinal_ex: плохой расшифровать: /BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22/libressl/crypto/evp/evp_enc.c: 529:

Изучив это , что и подобные вопросы здесь на SO, я озадачен тем, почему ошибка продолжает происходить. Я считаю, что это из-за кодирования key и iv (обратите внимание, что я использовал hex2bin() в PHP), что даст другой результат, если не используется.

Что отсутствует в моей команде Terminal? Если кто-то может помочь мне разработать эквивалент расшифровки, я бы очень признателен за помощь.

Как и ваш последний вопрос, вы немного боретесь с кодировками. Если вы внимательно проконсультируетесь с документацией для openssl_encrypt , вы заметите, что и ключ, и IV должны быть переданы как необработанные значения, а не hex.

Вы сделали это правильно в своем коде с помощью IV, но не с ключом. Вы передали ключ как шестнадцатеричное значение, а это значит, что он в два раза дольше, чем нужно. Используются только первые 256 бит ключа, в данном случае B374A26A71490437AA024E4FADD5B497 , так как вы передали 512 бит основного материала в целом.

Поэтому мы знаем, что наш необработанный ключ, когда кодируется ASCII, является B374A26A71490437AA024E4FADD5B497 , который составляет ровно 256 бит. Тем не менее, флаг OpenSSL -K, который я обсуждал в вашем первом вопросе, требует, чтобы ключ был передан в шестнадцатеричном кодировании, а это значит, что нам нужно кодировать шестнадцатеричный ключ. Таким образом, мы кодируем код B374A26A71490437AA024E4FADD5B497 чтобы получить 4233373441323641373134393034333741413032344534464144443542343937 , который является фактическим ключом шифрования с шестнадцатеричным кодированием.

Итак, в заключение, заключительная команда – это то, что дает результат только байта 0x70, который, как я полагаю, верен:

 openssl enc -d -K 4233373441323641373134393034333741413032344534464144443542343937 -iv 61736466673534336173646667353433 -in input.bin -out out.bin 

Это предполагает, что input.bin является двоичным кодом base64 для кодированного текста base64, который вы предоставили.