3

我加解密成功,但是当我解密值的时候,字符串末尾出现了奇怪的字符,“���”。首字母$_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);
4

5 回答 5

6

它只是根据使用的块大小填充结果。如果您使用 rtrim(),您将摆脱它们。

于 2010-09-28T15:57:19.520 回答
3

这些是 unicode 实体。在输出上尝试 utf8_decode()。

还有一个相关的已关闭 PHP Bug

mcrypt 生成的二进制输出既不是 iso-8859-1 也不是 utf-8,因此您应该告诉数据库该数据是二进制数据,而不是文本数据。

我还在mcrypt 示例页面上找到了此信息。

我可以在 VB 和 PHP 中加密/解密就好了但是当我尝试在 VB 中加密一个并在 PHP 中解密时,我单独使用 mcrypt 函数得到了错误的值

我发现至少在 VB9 中,流加密使用 UTF 字符,这是 8 位流中剩余的丢失字节数的值。

因此,如果您加密 1234,它将添加 chr(4) 四次(丢失字节的数量)在 php 中使用 chr,否则大多数浏览器/客户端无法读取它。我不擅长解释事情,但我想出的 php 代码如下。

于 2009-06-22T09:15:39.943 回答
1

尝试切换到 cfb 而不是 ecb 模式,然后重写函数以使用相同的 IV 进行加密和解密。一种简单的方法是将 IV 与加密数据一起传递(我假设您在函数末尾有类似“return $encrypted_data”的内容,您可以返回 $iv.$encrypted_data 而不是 $encrypted_data 本身,并且然后用 substr() 取回 IV)。为我工作。

于 2010-04-11T19:25:14.080 回答
0

对解密的文本使用以下函数。

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);
}
于 2010-04-06T15:32:13.240 回答
-1

Not来自 VB 来自 PHP(加密)和 PHP(解密),页面为 UTF-8,数据库为 UTF-8,连接为 UTF-8。

Not来自所有。我加密了两个密码。第一个有奇怪的字符,最后一个没有。所有值都是来自同一个 POST <form>

于 2009-06-22T09:38:17.793 回答