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

发布于 2024-07-25 01:48:09 字数 761 浏览 9 评论 0原文

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

I encrypt and decrypt successfully, but when I decrypt the value, there appears strange characters at the end of the string, "���".
The initial $_POST['value'] do not have any blank space or any strange character.

How can I solve this?

I encrypt with this:

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

I decrypt with this:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

只是在用心讲痛 2024-08-01 01:48:09

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

It is just padding the result based on the block size used. If you use rtrim(), you will get rid of them.

ま柒月 2024-08-01 01:48:09

这些是 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 代码如下。

These are unicode entities. Try utf8_decode() on the output.

There is also a related closed PHP Bug

mcrypt produces binary output which is neither iso-8859-1 nor utf-8
therefore you should tell your database that that data is binary stuff,
not text data.

I also found this info on the mcrypt example page.

I could En/Decrypt within VB and PHP just fine
But when I tried to encrypt one in VB and decrypt in PHP
I got the wrong values with the mcrypt function alone

I found that at least with VB9 that the stream encryption uses a UTF char that is the value for how many missing bytes left in the 8 bit stream.

So if you encrypt 1234 it will add chr(4) four times (the amount of missing bytes)
In php use chr otherwise most browsers/client cant read it.
Im not good at explaining things but the php code I figured out is below.

七月上 2024-08-01 01:48:09

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

Try to switch to cfb instead of ecb mode, then rewrite the functions to use the same IV for both encryption and decryption.
An easy way to do that is passing IV along with the encrypted data (I assume you've got something like "return $encrypted_data" at the end of your function, you may return $iv.$encrypted_data instead of $encrypted_data itself, and then get the IV back with substr() ).
Worked for me.

懷念過去 2024-08-01 01:48:09

使用以下函数来解密文本。

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

Use the following function for decrypted text.

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);
}
芯好空 2024-08-01 01:48:09

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

Not 是来自所有人。 我加密了两个密码。 第一个有奇怪的字符,最后一个没有。 所有值均来自同一

Not is from VB is from PHP(encrypt) and PHP(decrypt) and the page is UTF-8 and the database is UTF-8 and the connection is UTF-8.

Not is from all. I encrypt two passphrases. The first have strange characters and the last doesn't have. All values are POST from the same <form>.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文