Почему эти странные символы появляются в mcrypt? - PullRequest
3 голосов
/ 22 июня 2009

Я успешно шифрую и дешифрую, но когда я дешифрую значение, в конце строки появляются странные символы « ». Начальные $_POST['value'] не имеют пробелов или каких-либо странных символов.

Как я могу решить это?

Я шифрую это:

$key = 'my key';
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);        
$id = mcrypt_generic($td, $_POST['value']);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

Я расшифрую с этим:

$key = 'my key';
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$id = mdecrypt_generic($td, $_COOKIE['value']);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

Ответы [ 5 ]

6 голосов
/ 28 сентября 2010

Это просто заполнение результата в зависимости от используемого размера блока. Если вы используете rtrim (), вы избавитесь от них.

3 голосов
/ 22 июня 2009

Это юникодные объекты. Попробуйте utf8_decode () на выходе.

Существует также связанная закрытая ошибка PHP

mcrypt производит двоичный вывод, который не является ни iso-8859-1, ни utf-8 поэтому вы должны сообщить своей базе данных, что эти данные являются двоичными данными, не текстовые данные.

Я также нашел эту информацию на странице примера mcrypt.

Я мог бы прекрасно использовать En / Decrypt в VB и PHP Но когда я попытался зашифровать один в VB и расшифровать в PHP Я получил неправильные значения только с помощью функции mcrypt

Я обнаружил, что, по крайней мере, в VB9 потоковое шифрование использует символ UTF, который является значением для количества пропущенных байтов, оставшихся в 8-битном потоке.

Так что если вы зашифруете 1234, он добавит chr (4) четыре раза (количество пропущенных байтов) В php используйте chr, иначе большинство браузеров / клиентов не смогут его прочитать. Я не очень хорош в объяснении вещей, но php-код, который я понял, ниже.

1 голос
/ 11 апреля 2010

Попробуйте переключиться в режим cfb вместо режима ecb, затем перепишите функции, чтобы использовать один и тот же IV для шифрования и дешифрования. Самый простой способ сделать это - передать IV вместе с зашифрованными данными (я полагаю, у вас есть что-то вроде «return $ encrypted_data» в конце вашей функции, вы можете вернуть $ iv. $ Encrypted_data вместо самого $ encrypted_data, и затем верните IV с помощью substr ()). Работал на меня.

0 голосов
/ 06 апреля 2010

Используйте следующую функцию для расшифрованного текста.

function pkcs5_unpad($text)
{
    $pad = ord($text{strlen($text)-1});
    if ($pad > strlen($text))
        return false;
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
        return false;
    return substr($text, 0, -1 * $pad);
}
0 голосов
/ 22 июня 2009

Not от VB от PHP (шифрование) и PHP (дешифрование), страница UTF-8, база данных UTF-8 и соединение UTF-8.

Not от всех. Я шифрую две парольные фразы. Первые имеют странные символы, а последние нет. Все значения POST от одного и того же <form>.

...