1

有没有办法使用Zend_Filter_Encrypt大文件,而不会将内存限制增加到不可接受的数量?

到目前为止,这是我的代码,但是当我必须加密大于 32 MB(这是我的内存限制)的文件时,它会失败,如果我将内存设置为 48MB,它就可以工作:

$vector = 'XX';

$algorithm = 'rijndael-192';

$options = array(
    'adapter'   => 'mcrypt',
    'vector'    => $vector,
    'algorithm' => $algorithm,
    'key'       => $key
);

$encrypt = new Zend_Filter_File_Encrypt($options);
$result = $encrypt->filter($file);
4

1 回答 1

2

不,没有。 Zend_Filter_Encrypt通过一次性加密/解密数据来工作,因此需要完整的数据才能运行。

如果您需要解密大文件,您可以手动分小块进行。

<?php

$key    = 'secret key';
$iv     = 'xxxxxxxxxxxxxxxx';
$cipher = mcrypt_module_open('rijndael-192', '', 'cbc', '');

mcrypt_generic_init($cipher, $key, $iv);

$fp = fopen('/tmp/encrypted.txt', 'r+b');
while (!feof($fp)) {
    $data = fread($fp, 1154);

    $decrypted = mdecrypt_generic($cipher, $data);

    echo $decrypted;
}

fclose($fp);
mcrypt_generic_deinit($cipher);
mcrypt_module_close($cipher);

只需确保您读取的数据量(fread)是算法使用的块大小的倍数,否则结果可能会出乎意料。

于 2012-06-17T06:41:50.690 回答