mcrypt加密将一串'%00'添加到字符串的末尾

|| 使用OAuth并使用以下函数(使用我们称为\'foo \'的字符串)加密密钥(实际上是OAuth令牌)
public function encrypt( $text )
{
    // add end of text delimiter
    $data = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
    return base64_encode( $data );
}
当我使用逆函数对其进行解密时,最终得到: 功能:
    public function decrypt( $text )
    {
        $text = base64_decode( $text );
        return mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
    }
结果:
foo%00%00%00%00%00%00%00%00%00%00%00%00%00%00
编辑: 多看一点,我意识到它实际上是URL编码为%00,这意味着我的字符串以某种方式被空字符填充了吗?所以我目前正在使用trim()摆脱它们,但是我想了解为什么会这样。     
已邀请:
Rijndael是一个块密码,这意味着它可以处理特定长度的数据块(在这种情况下为128位)。这意味着,如果输入文本的长度不是块大小的倍数,则必须将其填充以适合。在这种情况下,填充为零;还有许多其他可能的填充方案可以使用,但是如果要使用PHP的mcrypt进行填充,则必须手动应用它们。     
您可以使用此方法修复它,以消除填充字符:在本例中,我们使用的是Zend。
$filter = new Zend_Filter_Decrypt(array(\'adapter\' => \'mcrypt\'));
$filter->setVector($lpt->_seed);
str_replace(\"\\x0\", \'\', trim($filter->filter(base64_decode($textToDecrypt))));
    
MCRYPT_MODE_ECB
表示您正在使用ECB(块密码操作模式)。可以针对块密码操作模式或针对流密码操作模式来处理分组密码。常见的分组密码模式是ECB和CBC,常见的流密码模式是CTR,通常称为计数器模式操作。 “ 5”是AES的实现。 AES是Rijndael密码,具有128位的块大小,以及三种可能的密钥大小:128、192和256位。因此,如果您使用分组密码模式的加密,则需要将每个128位(16个字节)的纯文本分开。当然,这给您留下了一个问题,即当最后一个块不是16个字节时该怎么办。 PHP的ѭ6或多或少由用户自己决定。如果块未满到块大小,则使用“ 7”个有值字符填充。如果输入是字符串,这很好;您可以简单地从返回的字符串中将
00
字符减去
trim
。但是,如果输入是以
00
字符结尾的二进制数据,则该字符将丢失(+当然是从字符串的开头和结尾开始的任何其他字符)。当然,您也可以将加密后的字符串的长度与明文一起发送。 对于更好的方案,您只需要查看PKCS#7填充。可以在ѭ6comments的注释部分找到用于实现填充的多个代码段。
mcrypt_encrypt
当前似乎不支持AES的流模式,因此,如果要保留PHP mcrypt库,则不选择该选项。     

要回复问题请先登录注册