public static void DecryptFile(string inputFile, string outputFile, string password, int BufferSize = 104576)
{
if (string.IsNullOrEmpty(inputFile) || string.IsNullOrEmpty(outputFile) || string.IsNullOrEmpty(password)) throw new Exception("0x00003"); // Если inputFile или outputFile, или password пуст, то выдём исключение "0x00003"
if (!File.Exists(inputFile)) throw new Exception("0x00004"); // Если файл inputFile не существует, то выдаём исключение "0x00004"
if (password.Length < 4 || BufferSize < 256) throw new Exception("0x00006"); // Если лимиты нарушены, то выдаём исключение "0x00006"
UnicodeEncoding UE = new UnicodeEncoding(); // Создание объекта UnicodeEncoding для кодирования пароля в байты
byte[] key = UE.GetBytes(password); // Получение байтового представления пароля
RijndaelManaged RMCrypto = new RijndaelManaged(); // Создание объекта RijndaelManaged для расшифровки данных
RMCrypto.Mode = CipherMode.CBC; // Установка режима шифрования на CBC (Cipher Block Chaining)
byte[] iv = new byte[16]; // Создание массива для хранения инициализационного вектора (IV)
using (FileStream fsCrypt = new FileStream(inputFile, FileMode.Open)) // Создание потока чтения для входного зашифрованного файла
{
fsCrypt.Read(iv, 0, iv.Length); // Чтение инициализационного вектора из начала зашифрованного файла
using (CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateDecryptor(key, iv), CryptoStreamMode.Read)) // Создание CryptoStream для расшифровки данных с использованием ключа и IV
{
using (FileStream fsOut = new FileStream(outputFile, FileMode.Create)) // Создание потока записи для выходного расшифрованного файла
{
byte[] buffer = new byte[BufferSize]; // Создание буфера
int read;
while ((read = cs.Read(buffer, 0, buffer.Length)) > 0) fsOut.Write(buffer, 0, read); // Чтение расшифрованных данных из CryptoStream и запись их в выходной файл
}
}
}
}