Этот вопрос помогает во второй части моего предыдущего вопроса .
Я столкнулся с другими темами с похожими вопросами, но из-за недавних изменений в 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, который вы предоставили.