ОЗУ не освобождается в c # после работы с файлами

#c# #.net #encryption

#c# #.net #шифрование

Вопрос:

Я пытаюсь прочитать файл, разделить строки (каждая строка представляет разные данные), расшифровать симметричный ключ с помощью моего закрытого ключа RSA, расшифровать и проверить данные с помощью AES GCM и записать их в тот же каталог.

Но после расшифровки данных похоже, что в нем все еще много оперативной памяти.

перед расшифровкой большого файла

после расшифровки файла размером 700 МБ

Я попытался использовать функцию .clear, присвоив переменной значение null и используя GC.Функция Collect() .

GC.Collect() сработал лучше всего (уменьшил использование ОЗУ с 6 ГБ до 1,5 ГБ при расшифровке файла размером 700 МБ).

Вот функция, которая запускается, когда я пытаюсь расшифровать.

 private void decrypt()
    {
        if (!decrypted)
        {
            try
            {
                string[] lines = File.ReadAllLines(openFileDialog1.FileName);
                byte[] encryptedsk = Convert.FromBase64String(lines[0]);
                byte[] nonce = Convert.FromBase64String(lines[1]);
                byte[] tag = Convert.FromBase64String(lines[2]);
                byte[] cipherText = Convert.FromBase64String(lines[3]);
                Array.Clear(lines, 0, lines.Length);
                lines = null;
                GC.Collect();
                var privkey = File.ReadAllText(openFileDialog2.FileName);
                var key = RSA.Create();
                key.ImportFromPem(privkey);
                privkey = null;
                byte[] secretkey;
                RSAEncryptionPadding padd = RSAEncryptionPadding.OaepSHA1;
                secretkey = key.Decrypt(encryptedsk, padd);
                key = null;
                GC.Collect();
                using (var cipher = new AesGcm(secretkey))
                {
                    byte[] decryptedData = new byte[cipherText.Length];
                    cipher.Decrypt(nonce, cipherText, tag, decryptedData);
                    Array.Clear(nonce, 0, nonce.Length);
                    Array.Clear(secretkey, 0, secretkey.Length);
                    Array.Clear(cipherText, 0, cipherText.Length);
                    nonce = null;
                    secretkey = null;
                    cipherText = null;
                    File.WriteAllBytesAsync(openFileDialog1.FileName   ".cfg", decryptedData);
                    Array.Clear(decryptedData, 0, decryptedData.Length);
                    decryptedData = null;
                    label1.Text = string.Format("successfuly decrypted ton{0}.cfg", openFileDialog1.FileName);
                }

                decrypted = true;

            }
            catch
            {
                label1.Text = "One of the files isn't correct";
                GC.Collect();
            }
        }
        GC.Collect();
    }
 

Хотелось бы знать, где я потерпел неудачу.

Комментарии:

1. Поскольку вы используете File. WriteAllBytesAsync может быть, запись еще не закончена?

2. Я так не думаю. Я использовал before File. WriteAllBytes и это дало тот же результат, также файл работает корректно и имеет тот же хэш.

3. Вы пробовали это: GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();

4. Добавил его везде в моей функции и поместил его после функции, и это уменьшило использование ОЗУ до 50 МБ ОЗУ после расшифровки. Большое спасибо! Может быть, вы знаете, почему после выполнения функции она по-прежнему занимает на 24 МБ больше?

5. Вероятно, вам лучше всего запускать это в потоковом режиме, поэтому вы не храните весь файл в памяти сразу