Отправка строки с шифрованием mcrypt через параметр URL - декодированный текст искажен - PullRequest
11 голосов
/ 22 апреля 2011

Я возиться с простой схемой авторизации.Я думаю, что самый простой способ сделать это без 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>";

Thisстановится очень близко, но он не декодируется должным образом - он повторяет

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

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

Что-то еще мне не хватает?Возможно набивка?

Спасибо

1 Ответ

29 голосов
/ 22 апреля 2011

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

Z5DlBqT8yEB4HKLkAlvfJoWaHgnNVLFh7jls6L85sLriedc82uFQxm+M62I41oB7

Видите этот знак плюс там?Знаки плюса в URL-адресах превращаются в пробелы.

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

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

...