У меня есть 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 =
Теперь, чтобы расшифровать строку, все, что вам нужно сделать, это изменить запрос «method» на «decrypt», вот так:
Encrypt.php? Метод = дешифровать ул = LCuT / ieVa6cl3 / 4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q = &
Единственная проблема в том, что когда эта зашифрованная строка расшифровывается, она возвращает следующее:
¬ƒ§rYV} ̳5Äš · НИСС (ñïX8Þ; б
Я сузил проблему до знака плюс, который находится в зашифрованной строке. Похоже, что PHP-метод GET переводит знак плюс в пустое пространство. Я искал эту ошибку и обнаружил, что она уже была зарегистрирована здесь . Я пробовал разные методы, перечисленные на этой странице и другие, но безуспешно. Самое близкое, что я получил, это:
$fixedstring = str_replace(" ", "+", $string);
и затем, используя $ fixedstring в методах шифрования, проблема заключается в том, что при расшифровке все пробелы преобразуются в знаки плюс. Есть идеи?
Я знаю, что использование POST имело бы больше смысла, но я использую GET по определенным причинам. Я сэкономлю детали.