Я пытаюсь написать программу, которая расшифровывает файлы AES на лету с помощью phpseclib. Файлы большие, поэтому я получаю сообщение об ошибке нехватки памяти, если использую file_get_contents($f) или fread(filesize($f)) для чтения входного файла.
По какой-то причине такой цикл создает поврежденные выходные файлы. ЗАЧЕМ!? знак равно
Например, входной файл размером 296 155 408 байт имеет размер 18 805 826 байт. ПРИМЕЧАНИЕ. Это работает, если весь файл может быть прочитан за одну итерацию цикла.
define('MY_BUFFER_SIZE', 128 * 1024);
$sessionKey = '....';
$filenameIn = $argv[1];
$fileIn = fopen($filenameIn, 'rb');
$filenameOut = dirname($argv[1]) . DIRECTORY_SEPARATOR . basename($argv[1], '.tar.gz') . '-decrypted.tar.gz';
$fileOut = fopen($filenameOut, 'wb');
// Setup cipher for continuous buffering and copy between files.
$aesCipher = new Crypt_AES(CRYPT_AES_MODE_CBC);
$aesCipher->setKey($sessionKey);
$aesCipher->setIV("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00");
$aesCipher->enableContinuousBuffer();
while (!feof($fileIn)) {
$packet = fread($fileIn, MY_BUFFER_SIZE); // @TODO: Streaming not working.
fwrite($fileOut, $aesCipher->decrypt($packet));
}
fclose($fileIn);
fclose($fileOut);
$aesCipher->disablePadding()
. - person neubert   schedule 29.07.2014