Php 为什么这些奇怪的角色出现在mcrypt中?

Php 为什么这些奇怪的角色出现在mcrypt中?,php,mcrypt,mojibake,Php,Mcrypt,Mojibake,我成功地加密和解密,但当我解密该值时,字符串末尾会出现奇怪的字符,”���". 首字母$\u 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($

我成功地加密和解密,但当我解密该值时,字符串末尾会出现奇怪的字符,”���". 首字母
$\u 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);
我用这个解密:

$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);

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

还有一个

mcrypt产生既不是iso-8859-1也不是utf-8的二进制输出 所以你应该告诉你的数据库数据是二进制的, 不是文本数据

我在网上也找到了这个信息

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

我发现,至少在VB9中,流加密使用UTF字符,该字符表示8位流中剩余的缺失字节数

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


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


Not
来自all。我加密了两个密码短语。第一个密码短语有奇怪的字符,而最后一个密码短语没有。所有值都来自同一个

对解密文本使用以下函数

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);
}

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

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