我正在尝试使用 PHP“动态”解密文件。我正在使用 mdecrypt_generic 函数,并且我正在分块解密文件,而不是一次解密整个文件。我正在解密的文件托管在远程服务器上。我使用 cURL 以块的形式检索文件并解密并输出每个块。当我从第一个块开始时,这很好用。但是,如果我从不同的块(例如第二个)开始,mdecrypt_generic 会为该块返回不同的结果。现在 PHP 手册说在每次调用 mdecrypt_generic 之前必须重新初始化加密缓冲区。然而,这只会让事情变得更糟,因为当我这样做时,它无法解密除第一个之外的所有块(即使我从第一个开始)。我的代码如下所示:
$td = mcrypt_module_open('rijndael-128', '', 'ctr', '');
$init = mcrypt_generic_init($td, $key, $iv);
foreach($chunks as $chunk=>$size){
$data = get_chunk($chunk,$size);
echo mdecrypt_generic($td, $data);
}
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
正如我所提到的,我不会在每次调用 mdecrypt_generic 之前重新初始化加密缓冲区,因为那样会完全破坏它。
编辑 1(找到问题): 我找到了问题,但没有找到解决方案。问题是,文件正在被分块解密,这意味着描述符($td)正在记住当前位置。但是,我想解密文件而不必从第一个块开始,但我必须修改描述符才能做到这一点,但据我所知,没有这样的选项。我使用的“临时”解决方案是从解密长度等于先前块的随机数据开始,以获得正确的描述符位置。但是因为有些文件非常大,所以这是一个有限的解决方案。
编辑2(找到解决方案): 文件以ctr模式加密,$iv(初始值)就像一个计数器,必须在每个块解密后增加。