Я столкнулся с другими темами с похожими вопросами, но из-за недавних изменений в PHP (т. Е. Удаления mcrypt ), я ищу советы относительно того, как мне лучше всего это делать с использованием OpenSSL в 2017/18 году.
Использование echo 'this string will be encrypted' | openssl enc -aes-256-cbc -a -pass pass:123
echo 'this string will be encrypted' | openssl enc -aes-256-cbc -a -pass pass:123
в терминале Mac, я смог пароль шифровать строку и теперь хотел бы передать это (как параметр) в серверную PHP-функцию для расшифровки.
Изучив этот вопрос, я вижу, что это возможно, но он использует теперь удаленную функцию mcrypt . Дальнейшее чтение в руководстве по PHP , я не ближе к выяснению, как отменить эту команду шифрования на свой эквивалент расшифровки PHP.
Этот недавний ответ – это то, что я реализовал до сих пор, но опять же, он просто не будет работать с созданным терминалом шифрованием, только тот, который был создан в PHP (не показано здесь).
<?php $encrypted_string = $_GET['data']; $password = '123'; $decrypted_data = openssl_decrypt($encrypted_string, "AES-256-CBC", $password); print "Decrypted Data: <$decrypted_data>\n"; ?>
В руководстве OpenSSL PHP указано, что либо строчные текстовые, либо закодированные в base64 строки могут быть переданы и дешифрованы. Поскольку я использовал флаг -a
во время шифрования, я ожидал бы, что base64 будет передан, что позволит исключить источник как потенциальную причину, по которой не будут возвращены дешифрованные данные.
Я позаботился о кодировке URL, так что любые символы +, созданные алгоритмом шифрования, заменяются их эквивалентом – % 2B – URL-Safe, поскольку в противном случае они были бы превращены в пробельный символ, тем самым нарушив строку параметров. Это дополнительно гарантирует, что кодированная входная строка правильно адресуется алгоритмом дешифрования.
Вопросы: Почему моя функция PHP не расшифровывает строку, сгенерированную командой терминала, хотя оба используют один и тот же метод и пароль? Что не хватает в моем PHP-коде, который бы позволил этому работать?
Приветствует всех.
ОБНОВИТЬ
Теперь я использую команду Terminal:
echo 'blah' | openssl enc -aes-256-cbc -a -K B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF -iv 64299685b2cc8da5
echo 'blah' | openssl enc -aes-256-cbc -a -K B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF -iv 64299685b2cc8da5
который шифрует: Y4xelTtEJPUHytB5ARwUHQ==
Я передаю это PHP, используя www.example.com/?data=Y4xelTtEJPUHytB5ARwUHQ==
PHP должен принимать параметры данных и расшифровывать. В настоящее время эта функция выглядит так:
<?php $encrypted_string = base64_decode($_GET['data']); $key = 'B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF'; $iv = '64299685b2cc8da5'; $output = openssl_decrypt($encrypted_string, 'AES-256-CBC', hex2bin($key), OPENSSL_RAW_DATA, hex2bin($iv)); print "Decrypted Data: <$output>\n"; ?>
OpenSSL использует проприетарный KDF, который, вероятно, не хочет пытаться воспроизвести в PHP-коде. Тем не менее, вы можете передать свой ключ как чистый шестнадцатеричный вместо этого, избегая KDF, используя флаг -K
:
echo 'blah' | openssl enc -aes-256-cbc -K 0000000000000000000000000000000000000000000000000000000000000000
Здесь большая шестнадцатеричная строка – это ваш 256-битный ключ, с шестнадцатеричным кодированием. Эта операция шифрования будет совместима с вашим PHP.