我查看了此条目并测试了一些建议: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