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

Chr*_*ski 6 php encryption padding mcrypt

使用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 );
}
Run Code Online (Sandbox Code Playgroud)

当我使用反函数解密它时,我最终得到:

功能:

    public function decrypt( $text )
    {
        $text = base64_decode( $text );
        return mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
    }
Run Code Online (Sandbox Code Playgroud)

结果:

foo%00%00%00%00%00%00%00%00%00%00%00%00%00%00

编辑:

再看一下,我意识到它实际上是对%00的URL编码,这意味着我的字符串以某种方式被空字符填充?所以我目前正在使用trim()来摆脱它们,但我想了解为什么会发生这种情况.

Ano*_*mie 6

Rijndael是一个块密码,这意味着它运行在特定长度的数据块上(在这种情况下为128位).这意味着如果输入文本的长度不是块大小的倍数,则必须将其填充以适合.在这种情况下,填充为零; 有许多其他可能的填充方案可以使用,但如果你想要它们与PHP的mcrypt你必须手动应用它们.

  • 默认填充(以及内部`mcrypt`唯一支持的填充)是一个"NULL"填充(不是"0").'%00`是一个URL编码的`NULL`字符`x00`. (5认同)