Отправка строкой, закодированной в 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, думая, что персонаж был искажен в запросе, но никакой разницы.
Есть ли что-то еще, что мне не хватает? Возможно, дополнение?
Спасибо
Ответы
Ответ 1
Случается, что ваш зашифрованный текст будет выглядеть примерно так:
Z5DlBqT8yEB4HKLkAlvfJoWaHgnNVLFh7jls6L85sLriedc82uFQxm+M62I41oB7
Увидите этот знак плюса? Плюс знаки в URL-адресах превращаются в пробелы.
При ручном преобразовании знака "плюс" в пробел и дешифровании результата результат - поврежденный мусор, который вы видели.
Перед тем, как вставлять его в ссылку, вы должны запускать как IV, так и зашифрованный текст rawurlencode
(не urlencode
). Это будет правильно кодировать знак плюса, который сохранит его в процессе. Вам не нужно (и не должно) urldecode
строку с другой стороны - PHP сделает это для вас.