为什么这些奇怪的字符出现在mcrypt中?

时间:2009-06-22 09:11:52

标签: php mcrypt mojibake

我成功加密和解密,但是当我解密该值时,字符串末尾会出现奇怪的字符“ ”。 最初的$_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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

还有related closed PHP Bug

  

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

我还在mcrypt example page.

上找到了此信息
  

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

     

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

     

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

答案 2 :(得分:1)

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

答案 3 :(得分: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);
}

答案 4 :(得分:-1)

来自VB的

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

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