mcrypt_decrypt:在少量数据上生成IV会导致损坏结果

时间:2015-06-25 17:46:24

标签: php cakephp encryption

我查看了此条目并测试了一些建议:recieving error Warning: mcrypt_decrypt(): The IV parameter must be as long as the blocksize

我有一个非常小的pdf文件(141.06 kb),它是使用wkhtmltopdf从网页创建的,并使用此功能加密:

public function encrypt($data) {
    if ($data !== '') {

        $iv = mcrypt_create_iv($this->iv_size, MCRYPT_DEV_URANDOM);

        $plaintext_utf8 = utf8_encode($data);
        return base64_encode($iv) . base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, Configure::read('Cryptable.key'), $plaintext_utf8, MCRYPT_MODE_CBC, $iv));
    } else {
        return '';
    }
}

正如我上面提到的,我在SO帖子上测试了一些建议并发现了这个:

iv_size = 16

长度iv = 18

使用相同功能加密的任何其他大型文档都会正确解密,因此我想要解决的是如何处理非常小的文件。可能是因为在计算少量数据时,结果可能无法预测?

这是解密功能:

public function decrypt($data, $data2 = null) {
    if (is_object($data)) {
        unset($data);
        $data = $data2;
    }

    if ($data != '') {
        $iv = base64_decode(substr($data, 0, strlen(base64_encode(mcrypt_create_iv($this->iv_size, MCRYPT_DEV_URANDOM)))));
        $data = base64_decode(substr($data, strlen(base64_encode(mcrypt_create_iv($this->iv_size, MCRYPT_DEV_URANDOM)))));

        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, Configure::read('Cryptable.key'), $data, MCRYPT_MODE_CBC, $iv));
    } else {
        return '';
    }
}

IV大小计算如下:

$this->iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

在我忘记之前,我正在使用CakePHP 2.6.4

0 个答案:

没有答案