# Partial file encryption with AES

Task is to encrypt part of the file using aes encryption algorithm. I did

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];

{
}
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;
}
}


call function

  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);

}


The problem is that when a large file consumes a lot of memory and the computer freezes.Is it possible to alter this code so that the memory consumption of the PC was the minimum ?

As I understand it, that is the memory write bytes to the MemoryStream, but how different ? I need to overwrite the bytes in the same file if the same record byte immediately into a new file, it will have to write all the remaining bytes, and it is a waste of time and also memory

• a large file consumes a lot of memory a lot of data requries a lot of memory and since you are not just encrpting the file with a stream but also return the encrypted version from the method you need to load it completely into memory. – t3chb0t Jul 19 '17 at 11:11
• @t3chb0t it turns out that nothing can be done ? – Lolidze Jul 19 '17 at 11:25
• I believe that it could be possible but you don't provide enough code. Currently you read a part from a file, encrypt it and read into memory... then I guess you use this buffer to write it into a new file. I'm pretty sure this could be done fluently so that you read from a file, then encrypt a few bytes then write the rest into the new file without storing too much data in memory. But the part where you read, encrypt, write is missing. It's not (only) the encryption that needs optimizing but rather the whole process. – t3chb0t Jul 19 '17 at 11:43
• @t3chb0t thank you, you gave a good idea. You are so mean link – Lolidze Jul 19 '17 at 13:09
• Three minor notes: 1. Rfc2898DeriveBytes implements IDisposable and therefore should be wrapped in a using construct. 2. .CreateEncryptor() creates an IDisposable resource. It should be pulled out and wrapped in a using construct. 3. cs.Close(); isn't needed as the using scope will close and dispose it immediately thereafter. – Jesse C. Slicer Jul 19 '17 at 14:44