Проблема шифрования больших файлов AES
Делаю программу-шифровальщик. Пока что просто AES-шифрование файлов.
Не могу разрешить две проблемы:
- Шифрование больших файлов (>1Gb)
- Непонятное использование памяти
Для шифрования использую:
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)

