Почему моя пара шифрование / дешифрование лишь иногда возвращает исходный открытый текст? - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь зашифровать идентификатор пользователя в формате = LETTERS1234, он может содержать набор букв слева и будет содержать по крайней мере 1 цифру

Я сделал простой тестовый сайт, используя этот код:

<?php
    $key = 'rsZOkGnJiQKf6zkZ';
    $token = $_REQUEST['c'];
    if(!$token){
        $string = 'bgoogl1';
        $enc = urlencode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key),
                                        strtolower($string), MCRYPT_MODE_CBC,
                                        md5(md5($key))));
        header('Location: http://website.com/test.php?c='.$enc);
    } else {
        echo rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key),
                                  urldecode($token), MCRYPT_MODE_CBC,
                                  md5(md5($key))),"\0");
    }
?>

Результат даст мне большую часть времени правильного вывода для любого $string, но для этого случая и некоторых других $string случаев, он потерпит неудачу и выдаст что-то вроде этого:

Ia$ÿ/ckY@Š«° =Û™¼îa¸ï³éð1œ_¹0Àã ¼/÷d‡¬ÐöT¨i“\M~¯D”¯“ÚÍ

Как я могу это исправить?

PS Я пробовал использовать rawurlencode и base64_encode, а также декодировать.

1 Ответ

1 голос
/ 14 декабря 2011

Вообще говоря, если вы хотите передать двоичные данные в HTTP-запрос, вы вместо этого преобразуете их в шестнадцатеричное :

$data = mcrypt_encrypt(MCRYPT_RIJNDAEL_256,md5($key),strtolower($string),MCRYPT_MODE_CBC,md5(md5($key)));
$hex = bin2hex($data);

Затем вы можете pack обратно в двоичный код:

$bin = pack("H*", $hex);

Примечание : если у вас есть проблемы с конкретным случаем, поможет узнать, какой именно.

...