Отправка строкой, закодированной в mcrypt, с помощью параметра URL – декодированный текст искажается

Я возился с простой схемой авторизации. Я думаю, что самый простой способ сделать это без SSL или другого HTTP-аутентификации – это шифрование с общим ключом. Адаптируя простой пример из руководства PHP, я придумал следующее:

$text = "boggles the invisible monkey will rule the world"; $key = "This is a very secret key"; $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_ECB, $iv); $iv = base64_encode($iv); $enc = base64_encode($enc); echo '<a href="temp2.php?iv='.$iv.'&text='.$enc.'">link</a><br />'; 

Страница, получающая этот запрос (temp2.php), выглядит следующим образом:

 $key = "This is a very secret key"; $iv = base64_decode($_GET["iv"]); $enc = base64_decode($_GET["text"]); $crypttext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB, $iv); echo "$crypttext<br>"; 

Это очень близко, но оно не декодируется должным образом – это эхо

boggles the invisible monkey will rule t—;eôügJë

Я не уверен, что такое зависание, я пробовал urlencode / urldecode и htmlentities, думая, что персонаж был искажен в запросе, но никакой разницы.

Есть что-то еще, что мне не хватает? Возможно, заполнение?

благодаря

Solutions Collecting From Web of "Отправка строкой, закодированной в mcrypt, с помощью параметра URL – декодированный текст искажается"

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

 Z5DlBqT8yEB4HKLkAlvfJoWaHgnNVLFh7jls6L85sLriedc82uFQxm+M62I41oB7 

Видишь, что знак плюса? Плюс знаки в URL-адресах превращаются в пробелы.

При ручном преобразовании знака «плюс» в пробел и дешифрации результата вывод является поврежденным нежелательным файлом, который вы видели.

Вы должны запускать как IV, так и зашифрованный текст через rawurlencode ( не urlencode ), прежде чем вставлять его в ссылку. Это будет правильно кодировать знак плюса, который сохранит его в процессе. Вам не нужно (и не должно) urldecode строку с другой стороны – PHP сделает это за вас.