Добрый день, нужна ваша помощь в оптимизации кода. Задача : зашифровать часть байтов в файле алгоритмом aes c# Как я сделал:
public static byte[] AES_(int len, byte[] passwordBytes, byte[] saltBytes, FileStream fSin)
{
byte[] encryptedBytes = null;
byte[] encryptedBytesAndIV = null;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
using (AesCryptoServiceProvider AES = new AesCryptoServiceProvider())
{
AES.KeySize = 256;
AES.BlockSize = 128;
var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 100);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = generateIV();
AES.Mode = CipherMode.CBC;
using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
byte[] buffer = new byte[1048576];
int read,read2=0;
while (read2 < len)
{
read = fSin.Read(buffer, 0, buffer.Length);
cs.Write(buffer, 0, read);
read2 += read;
}
cs.Close();
}
encryptedBytes = ms.ToArray();
encryptedBytesAndIV = new byte[encryptedBytes.Length + AES.IV.Length];
AES.IV.CopyTo(encryptedBytesAndIV, 0);
encryptedBytes.CopyTo(encryptedBytesAndIV, IV_LENGTH);
}
}
return encryptedBytesAndIV;
}
private static byte[] generateIV()
{
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
byte[] nonce = new byte[IV_LENGTH];
rng.GetBytes(nonce);
return nonce;
}
}
и вызываю
FileStream fsIn = new FileStream(path, FileMode.Open);
len = Convert.ToInt32(fsIn.Length) / 3;
var resultb = AES_(len, passwordBytes, saltBytes, fsIn);
fsIn.Seek(0, SeekOrigin.Begin);
fsIn.Write(resultb, 0, resultb.Length);
fsIn.Seek(fsIn.Length, SeekOrigin.Begin);
fsIn.Write(saltBytes, 0, saltBytes.Length);
using (var writer = new BinaryWriter(fsIn))
{
writer.Seek(Convert.ToInt32(fsIn.Length), SeekOrigin.Begin);
writer.Write(resultb.Length);
}
Проблема : при большем файле тратится очень много памяти в пк и он зависает. Как мог я оптимизировал. Насколько я понял, проблема в MemoryStream
, ибо именно туда записываются байты и собственно на нее тратится память. Можно ли как-то сразу в файл записывать ? Разумеется, что можно вместо MemoryStream
поставить тот же FileStream
, но тогда придется дозаписывать оставшиеся байты, ибо в тот же filestream
не получится записать и придется создавать новый, а это трата времени и опять же памяти. Вообщем, можете что-то подсказать ?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
У меня есть база логинов, паролей, портов и ip адресовСуть в том, что нужно реализовать отдельный перебор для каждого ip адреса в потоках
При попытке провести авторизацию через запрос к апи - получаю ответ с сервер 401В связи с тем что нужно использовать определенные юзер-агенты,от...