private static void encryptFile(string inputFile, string outputFile, string password) { byte[] salt = GenerateRandomSalt(); FileStream fsCrypt = new FileStream(outputFile, FileMode.Create); byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password); RijndaelManaged AES = new RijndaelManaged(); AES.KeySize = 256; AES.BlockSize = 128; AES.Padding = PaddingMode.PKCS7; var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000); AES.Key = key.GetBytes(AES.KeySize / 8); AES.IV = key.GetBytes(AES.BlockSize / 8); AES.Mode = CipherMode.CFB; fsCrypt.Write(salt, 0, salt.Length); CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write); FileStream fsIn = new FileStream(inputFile, FileMode.Open); byte[] buffer = new byte[1048576]; int read; int pastP = 0; while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0) { cs.Write(buffer, 0, read); var percentComplete = (float)fsIn.Position * 100 / fsIn.Length; int percentInt = Convert.ToInt32(percentComplete); if (pastP != percentInt) { Console.WriteLine(percentInt); } pastP = percentInt; } fsIn.Close(); cs.Close(); fsCrypt.Close(); } private static void decryptFile(string inputFile, string outputFile, string password) { byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password); byte[] salt = new byte[32]; FileStream fsCrypt = new FileStream(inputFile, FileMode.Open); fsCrypt.Read(salt, 0, salt.Length); RijndaelManaged AES = new RijndaelManaged(); AES.KeySize = 256; AES.BlockSize = 128; var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000); AES.Key = key.GetBytes(AES.KeySize / 8); AES.IV = key.GetBytes(AES.BlockSize / 8); AES.Padding = PaddingMode.PKCS7; AES.Mode = CipherMode.CFB; CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateDecryptor(), CryptoStreamMode.Read); FileStream fsOut = new FileStream(outputFile, FileMode.Create); int read; byte[] buffer = new byte[1048576]; int pastP = 0; while ((read = cs.Read(buffer, 0, buffer.Length)) > 0) { fsOut.Write(buffer, 0, read); var percentComplete = (float)fsOut.Position * 100 / fsCrypt.Length; int percentInt = Convert.ToInt32(percentComplete); if (pastP != percentInt) { Console.WriteLine(percentInt); } pastP = percentInt; } fsOut.Close(); fsCrypt.Close(); } public static byte[] GenerateRandomSalt() { byte[] data = new byte[32]; using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) { for (int i = 0; i < 10; i++) { rng.GetBytes(data); } } return data; }