Оптимизировать код c#

252
21 июля 2017, 00:55

Добрый день, нужна ваша помощь в оптимизации кода. Задача : зашифровать часть байтов в файле алгоритмом 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 не получится записать и придется создавать новый, а это трата времени и опять же памяти. Вообщем, можете что-то подсказать ?

READ ALSO
Как реализовать многопоточный брут на c#?

Как реализовать многопоточный брут на c#?

У меня есть база логинов, паролей, портов и ip адресовСуть в том, что нужно реализовать отдельный перебор для каждого ip адреса в потоках

380
Авторизация в ВК через запрос к api

Авторизация в ВК через запрос к api

При попытке провести авторизацию через запрос к апи - получаю ответ с сервер 401В связи с тем что нужно использовать определенные юзер-агенты,от...

549