Использование большого количества памяти при шифровании
Есть такие методы для шифрования и перезаписи файлов
private static byte[] Encrypt(byte[] fileData, byte[] key, byte[] salt)
{
using (Aes aes = Aes.Create())
{
using (Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(key, salt, 10000))
{
aes.Key = rfc2898.GetBytes(aes.KeySize / 8);
}
aes.GenerateIV();
byte[] iv = aes.IV;
using (MemoryStream encryptedStream = new MemoryStream())
{
encryptedStream.Write(salt, 0, salt.Length);
encryptedStream.Write(iv, 0, iv.Length);
using (CryptoStream cryptoStream = new CryptoStream(encryptedStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(fileData, 0, fileData.Length);
cryptoStream.FlushFinalBlock();
}
byte[] encryptedData = encryptedStream.ToArray();
return encryptedData;
}
}
}
public void EncryptFile(string filePath, byte[] key, byte[] salt)
{
byte[] data = File.ReadAllBytes(filePath);
byte[] encryptedData = Encrypt(data, key, salt);
using (FileStream encryptedFileStream = new FileStream(filePath, FileMode.Create))
{
encryptedFileStream.Write(encryptedData, 0, encryptedData.Length);
}
Console.WriteLine($"Файл {filePath} был успешно зашифрован.");
data = null;
encryptedData = null;
GC.Collect();
}
И такие методы для расшифровки и перезаписи файлов
private static byte[] Decrypt(byte[] encryptedData, byte[] key, byte[] salt)
{
using (Aes aes = Aes.Create())
{
using (Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(key, salt, 10000))
{
aes.Key = rfc2898.GetBytes(aes.KeySize / 8);
}
byte[] iv = new byte[aes.IV.Length];
Buffer.BlockCopy(encryptedData, salt.Length, iv, 0, iv.Length);
aes.IV = iv;
using (MemoryStream encryptedStream = new MemoryStream(encryptedData, salt.Length + iv.Length, encryptedData.Length - salt.Length - iv.Length))
using (MemoryStream decryptedStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(encryptedStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
cryptoStream.CopyTo(decryptedStream);
}
byte[] decryptedData = decryptedStream.ToArray();
return decryptedData;
}
}
}
public void DecryptFile(string filePath, byte[] key, byte[] salt)
{
byte[] encryptedData = File.ReadAllBytes(filePath);
byte[] decryptedData = Decrypt(encryptedData, key, salt);
using (MemoryStream decryptedStream = new MemoryStream(decryptedData))
{
using (FileStream fs = new FileStream(filePath, FileMode.Create))
{
decryptedStream.CopyTo(fs);
}
}
Console.WriteLine($"Файл {filePath} был успешно расшифрован.");
encryptedData = null;
decryptedData = null;
GC.Collect();
}
И у меня такой вопрос, нормально ли что при запуске процесса шифрования директории весом в 200мб, используется около 700мб ОЗУ, но при последующих операциях используемая память не увеличивается, и не уменьшается. Т.е как будто остается зарезервированная память которая была выделена при первой операции, и после этого она используется для всех последующий операций, это нормально, или все же у меня в коде есть утечка памяти ?