У меня есть PHP-скрипт, который выполняет базовое шифрование строки с помощью метода ниже:
<?php $key = 'secretkey'; $string = $_GET['str']; if ($_GET['method'] == "decrypt") { $output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); } if ($_GET['method'] == "encrypt") { $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); } echo $output; ?>
Пример URL-адреса для шифрования строки будет выглядеть так:
Encrypt.php? Method = encrypt & str = быстрая лиса
Что бы вернуть это как зашифрованную строку:
LCuT / ieVa6cl3 / 4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =
Теперь для дешифрования строки все, что вам нужно сделать, это изменить запрос метода на «расшифровать», например:
Encrypt.php? Метод = дешифровать & ул = LCuT / ieVa6cl3 / 4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =
Единственная проблема заключается в том, что когда эта зашифрованная строка расшифровывается, она возвращает это:
¬ƒ§rYV} ̳5Äš · НИСС (ñïX8Þ; б
Я сузил проблему до знака плюса, который находится в зашифрованной строке. Метод GET PHP, похоже, переводит знак плюса в пустое пространство. Я искал эту ошибку и узнал, что она уже подана здесь . Я пробовал разные методы, перечисленные на этой странице, и другие без успеха. Самое близкое, что я получил, это:
$fixedstring = str_replace(" ", "+", $string);
а затем используя $ fixedstring в методах шифрования, проблема заключается в том, что при расшифровке все пробелы преобразуются в знаки плюс. Есть идеи?
Я знаю, что использование POST имеет смысл, но я использую GET по определенным причинам. Я пощажу детали.
Если вы прочитаете весь отчет об ошибке, вы увидите ссылку на RFC 2396 . Что означает, что + зарезервировано . PHP корректен при переводе знака unencoded + в пробел.
Вы можете использовать urlencode () зашифрованный текст, когда возвращаете его пользователю. Таким образом, когда пользователь отправляет шифрованный текст для дешифрования, вы можете urldecode () его. PHP будет делать это автоматически для вас, если он входит через строку GET.
Итог: + должен быть отправлен на PHP в виде закодированного значения:% 2B
Я понимаю, что это старый вопрос, но я искал решение аналогичной проблемы с + знаками в строке GET. Я натыкаюсь на эту страницу и думаю, что поделюсь решением, которое я придумал.
<?php $key = 'secretkey'; $string = $_GET['str']; if ($_GET['method'] == "decrypt") { $string = urlencode($string); $string = str_replace("+", "%2B",$string); $string = urldecode($string); $output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); } if ($_GET['method'] == "encrypt") { $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); } echo $output; ?>
Вы должны использовать urlencode()
перед тем, как поместить зашифрованную строку в строку запроса, которая « urldecode()
» от любых специальных символов (включая +
), а затем вызовет urldecode()
перед расшифровкой, чтобы вернуть их обратно в исходную форму.