mcrypt_decrypt在解密文本末尾添加null

时间:2016-01-06 07:01:30

标签: php mcrypt

我使用Rijndael算法来加密和解密我的数据库密码。我将编码密码保存在另一个文件中。在这里,我减少了代码以获得相关性:

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, PASSWORD_SALT, 'mypassword', MCRYPT_MODE_ECB);    
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, PASSWORD_SALT, $encrypted, MCRYPT_MODE_ECB);
// !! The value of $decrypted is "mypassword      " i.e. "mypasswordNULLNULLNULLNULLNULL"

'mypassword'已转换为'mypassword' + 6xNULL。解密的代码包含null。

我在1年前写过这段代码,一切都运转良好。但现在,当所有技术的版本发生变化时,我遇到了问题。

2 个答案:

答案 0 :(得分:2)

总是如此。

根据文件:

  

将使用给定的密码和模式解密的数据。如果数据大小不是n * blocksize,则数据将用'\ 0'填充。

因此,您要么使用\0修剪数据,要么必须将原始长度存储在任何位置,然后将填充0关闭。

答案 1 :(得分:2)

使用Rijndael-128算法mcrypt_encrypt()将始终返回16个字节的倍数。如果您的纯文本不是16字节的精确倍数,则数据将以零字节填充,因此它将是16的倍数。

这些零字节也会出现在解密文本中。您必须使用以下命令删除它们:

$decrypted = rtrim($decrypted, "\0");

注1 :Rijndael是一种块加密算法,可在固定大小的块上运行。这就是填充可能是必要的原因。

注意2 :加密仅适用于永远不会以值00h结束的编码输入(因为默认的零填充)。取自http://php.net/manual/en/function.mcrypt-encrypt.php

的示例代码
相关问题