#c# #.net #encryption
#c# #.net #шифрование
Вопрос:
Я пытаюсь прочитать файл, разделить строки (каждая строка представляет разные данные), расшифровать симметричный ключ с помощью моего закрытого ключа RSA, расшифровать и проверить данные с помощью AES GCM и записать их в тот же каталог.
Но после расшифровки данных похоже, что в нем все еще много оперативной памяти.
Я попытался использовать функцию .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. Вероятно, вам лучше всего запускать это в потоковом режиме, поэтому вы не храните весь файл в памяти сразу