来自mdecrypt_generic的结果不一致

时间:2013-03-18 14:31:16

标签: php encryption

我正在尝试使用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(初始值)就像一个计数器,必须在解密每个块后增加。

0 个答案:

没有答案