Проблема шифрования больших файлов AES

Делаю программу-шифровальщик. Пока что просто AES-шифрование файлов.

Не могу разрешить две проблемы:

  1. Шифрование больших файлов (>1Gb)
  2. Непонятное использование памяти

Для шифрования использую:

            byte[] TextBytes = File.ReadAllBytes(file_path);
            byte[] CipherTextBytes;

            using (MemoryStream ms = new MemoryStream())
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                cs.Write(TextBytes, 0, TextBytes.Length);
                cs.FlushFinalBlock();

                CipherTextBytes = ms.ToArray();
            }

            File.WriteAllBytes(file_path, CipherTextBytes);

При попытке записи большого файла разом разумеется вылетает исключение SystemOutOfMemory. Пробовал считывать по фикс. размеру:

            byte[] TextBytes = File.ReadAllBytes(file_path);
            byte[] CipherTextBytes;
            int chunkSize = 524288;

            using (MemoryStream ms = new MemoryStream())
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                float countChunks = TextBytes.Length / chunkSize;

                for (int i = 0; i < countChunks; i++)
                {
                    cs.Write(TextBytes, 0, chunkSize);    
                    
                }
                cs.FlushFinalBlock();

                CipherTextBytes = ms.ToArray();
            }  

Но когда длина потока доходит до 536870912 byte вылетает SystemOutOfMemory.

Как обойти эту проблему? Можно как-то организовать шифрование файла и его запись одновременно? Или есть более лучшее решение?

Второй вопрос

По поводу второго вопроса - шифрование файлов размером по 500мб проходит нормально. Да, вырастает память процесса до 2-3 Гб, но шифрует. Так вот вопрос. Я ведь использую директивы using. Почему когда шифрование заканчивается и память по сути высвобождается - в диспетчере задач и в отладчике всё равно отображается, будто приложение использует 2-3Гб.

Хотя если сделать "снимок памяти", то можно увидеть, что куча освобождена от этих объемов.

введите сюда описание изображения

Как мы видим, размер кучи после шифрования в норме - однако "Память процесса" по прежнему висит 2,5Gb. В диспетчере задачи, кстати, нормально. Показывает 465 Мб

введите сюда описание изображения

Буду благодарен за любую помощь и поддержку. Это только мой личный экскурс в шифровании, так что буду рад любым подсказкам и советам о том, как можно ещё оптимизировать приложение. (2-3Gb ОЗУ за обработку полугигового файла кажется чем-то большим, возможно я где-то неправильно использую Stream)


Ответы (0 шт):