/// <summary> /// Шифрует файл открытого текста, используя шифр Rijndael в режиме CBC, с помощью соли HMAC SHA-512 с паролем. /// Произвольный 128-битный вектор инициализации генерируется для шифра. /// </summary> /// <param name="plaintextFile">Файл открытого текста для шифрования.</param> /// <param name="ciphertextFile">Полученный файл зашифрованного текста.</param> /// <param name="password">Пароль для шифрования файла с открытым текстом.</param> /// <param name="keySize">Размер ключа шифрования. 256-бит сильнее, но медленнее.</param> public void Encrypt(string plaintextFile, string ciphertextFile, string password, KeySize keySize) { // Создайте новый файл зашифрованного текста, чтобы записать зашифрованный текст в using (var fsc = new FileStream(ciphertextFile, FileMode.Create, FileAccess.Write)) { // Сохраните IV в начале файла зашифрованного текста var iv = RandomHash.GenerateRandomBytes(InitializationVectorSize); fsc.Write(iv, 0, iv.Length); // Создать CryptoStream для шифрования открытого текста using (var cs = new CryptoStream(fsc, CreateEncryptor(password, iv, keySize), CryptoStreamMode.Write)) { // Откройте файл открытого текста. using (var fsp = new FileStream(plaintextFile, FileMode.Open, FileAccess.Read)) { // Создаем буфер для обработки файла открытого текста в кусках // Чтение целого файла в память может вызвать // исключения из памяти, если файл большой var buffer = new byte[4096]; // Чтение фрагмента из файла открытого текста int bytesRead; while ((bytesRead = fsp.Read(buffer, 0, buffer.Length)) > 0) { // Шифровать открытый текст и записать его в файл зашифрованного текста cs.Write(buffer, 0, bytesRead); } // Завершить шифрование cs.FlushFinalBlock(); } } } }
/// <summary> /// Шифрует открытый текст, используя режим Encrypt-MAC через шифра Rijndael в /// CBC с паролем, полученным из соли HMAC SHA-512. Случайная 128-битная инициализация /// Вектор создается для шифра. /// </summary> /// <param name="plaintext">Открытый текст для шифрования.</param> /// <param name="password">Пароль для шифрования открытого текста.</param> /// <param name="keySize">Размер ключа шифрования. 256-бит сильнее, но медленнее.</param> /// <returns>Шифрованный текст EncM с кодировкой Base64.</returns> public new string Encrypt(byte[] plaintext, string password, KeySize keySize) { // Генерация случайного IV var iv = RandomHash.GenerateRandomBytes(InitializationVectorSize); // Шифровать открытый текст var etmCiphertext = Encrypt(plaintext, password, iv, keySize); // Кодировать зашифрованный текст EtM return(Convert.ToBase64String(etmCiphertext)); }