Шифрование / Расшифровка больших файлов (.NET)

Я должен зашифровать, сохранить и затем расшифровать большие файлы. Каков наилучший способ сделать это? Я слышал, что шифрование RSA дорогое, и было рекомендовано использовать RSA для шифрования ключа AES, а затем использовать ключ AES для шифрования больших файлов. Любые предложения с примером будут замечательными.

Это может помочь

/// Encrypts a file using Rijndael algorithm. /// /// /// private void EncryptFile(string inputFile, string outputFile) { try { string password = @"myKey123"; // Your Key Here UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(password); string cryptFile = outputFile; FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create); RijndaelManaged RMCrypto = new RijndaelManaged(); CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write); FileStream fsIn = new FileStream(inputFile, FileMode.Open); int data; while ((data = fsIn.ReadByte()) != -1) cs.WriteByte((byte)data); fsIn.Close(); cs.Close(); fsCrypt.Close(); } catch { MessageBox.Show("Encryption failed!", "Error"); } } /// /// Decrypts a file using Rijndael algorithm. /// /// /// private void DecryptFile(string inputFile, string outputFile) { { string password = @"myKey123"; // Your Key Here UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(password); FileStream fsCrypt = new FileStream(inputFile, FileMode.Open); RijndaelManaged RMCrypto = new RijndaelManaged(); CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Read); FileStream fsOut = new FileStream(outputFile, FileMode.Create); int data; while ((data = cs.ReadByte()) != -1) fsOut.WriteByte((byte)data); fsOut.Close(); cs.Close(); fsCrypt.Close(); } } 

источник: http://www.codeproject.com/Articles/26085/File-Encryption-and-Decryption-in-C

Как правило, описанная вами страtagsя используется, когда данные будут зашифрованы на одной машине (например, на сервере), а затем дешифрованы другой машиной (клиентом). Сервер будет шифровать данные с помощью симметричного шифрования ключей (для производительности) с вновь созданным ключом и зашифровать этот симметричный ключ с помощью открытого ключа (соответствующего частному ключу клиента). Сервер отправляет клиенту как зашифрованные данные, так и зашифрованный симметричный ключ. Клиент может расшифровать симметричный ключ своим личным ключом, а затем использовать этот симметричный ключ для дешифрования данных. Если вы шифруете и дешифруете данные на одном компьютере, может не иметь смысла использовать как RSA, так и AES, поскольку вы не пытаетесь передать ключ шифрования на другой компьютер.

Один большой организм – это мелочь, хотя мы все знаем дорого, когда видим. Подмигиваю.

Попробуйте сравнить в своей среде что-то вроде следующего: посмотреть, где вы находитесь:

EDIT 2/13/2012: Код был обновлен по мере того, как я стал (незаметно) умнее, а также заметил несколько ошибочных ошибок cut’n’paste, которые вкрались. Mea culpa.

 using System; using System.IO; using System.Security.Cryptography; using System.Text; ... // Rfc2898DeriveBytes constants: public readonly byte[] salt = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // Must be at least eight bytes. MAKE THIS SALTIER! public const int iterations = 1042; // Recommendation is >= 1000. /// Decrypt a file. /// NB: "Padding is invalid and cannot be removed." is the Universal CryptoServices error. Make sure the password, salt and iterations are correct before getting nervous. /// The full path and name of the file to be decrypted. /// The full path and name of the file to be output. /// The password for the decryption. /// The salt to be applied to the password. /// The number of iterations Rfc2898DeriveBytes should use before generating the key and initialization vector for the decryption. public void DecryptFile(string sourceFilename, string destinationFilename, string password, byte[] salt, int iterations) { AesManaged aes = new AesManaged(); aes.BlockSize = aes.LegalBlockSizes[0].MaxSize; aes.KeySize = aes.LegalKeySizes[0].MaxSize; // NB: Rfc2898DeriveBytes initialization and subsequent calls to GetBytes must be eactly the same, including order, on both the encryption and decryption sides. Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(password, salt, iterations); aes.Key = key.GetBytes(aes.KeySize / 8); aes.IV = key.GetBytes(aes.BlockSize / 8); aes.Mode = CipherMode.CBC; ICryptoTransform transform = aes.CreateDecryptor(aes.Key, aes.IV); using (FileStream destination = new FileStream(destinationFilename, FileMode.CreateNew, FileAccess.Write, FileShare.None)) { using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write)) { try { using (FileStream source = new FileStream(sourceFilename, FileMode.Open, FileAccess.Read, FileShare.Read)) { source.CopyTo(cryptoStream); } } catch (CryptographicException exception) { if (exception.Message == "Padding is invalid and cannot be removed.") throw new ApplicationException("Universal Microsoft Cryptographic Exception (Not to be believed!)", exception); else throw; } } } } /// Encrypt a file. /// The full path and name of the file to be encrypted. /// The full path and name of the file to be output. /// The password for the encryption. /// The salt to be applied to the password. /// The number of iterations Rfc2898DeriveBytes should use before generating the key and initialization vector for the decryption. public void EncryptFile(string sourceFilename, string destinationFilename, string password, byte[] salt, int iterations) { AesManaged aes = new AesManaged(); aes.BlockSize = aes.LegalBlockSizes[0].MaxSize; aes.KeySize = aes.LegalKeySizes[0].MaxSize; // NB: Rfc2898DeriveBytes initialization and subsequent calls to GetBytes must be eactly the same, including order, on both the encryption and decryption sides. Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(password, salt, iterations); aes.Key = key.GetBytes(aes.KeySize / 8); aes.IV = key.GetBytes(aes.BlockSize / 8); aes.Mode = CipherMode.CBC; ICryptoTransform transform = aes.CreateEncryptor(aes.Key, aes.IV); using (FileStream destination = new FileStream(destinationFilename, FileMode.CreateNew, FileAccess.Write, FileShare.None)) { using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write)) { using (FileStream source = new FileStream(sourceFilename, FileMode.Open, FileAccess.Read, FileShare.Read)) { source.CopyTo(cryptoStream); } } } } 

Как вы слышали, асимметричная криптография, такая как RSA, намного медленнее симметричной криптографии (например, AES), но имеет свои преимущества (более простое управление ключами, например, один закрытый ключ для защиты).

Ключевым (предназначенным для каламбура) является использование преимуществ обоих (закрытый ключ асимметричного и скорости симметричного), игнорируя при этом неудобства другого (многие секретные ключи и медленная скорость).

Вы можете сделать это, используя RSA один раз для каждого файла (без огромного влияния на производительность) для шифрования (симметричного) секретного ключа, который используется для шифрования (намного быстрее) вашего большого файла. Эта * упаковка симметричного ключа позволяет вам управлять только одним закрытым ключом.

Вот ссылка на мою старую (но все же правдивую) запись в блоге, в которой приведен пример для этого, используя C # и .NET framework (Microsoft of Mono).

  • Самый простой способ шифрования текстового файла в java
  • Шифрование файлов cookie в ASP.NET
  • Шифрование настроек приложения в web.config
  • Какая оптимальная длина для паролей пользователей?
  • Безопасность сообщений WCF без сертификата и windows auth
  • Interesting Posts

    Фильтрация столбцов datetime jqGrid с использованием выбора даты только по дате

    Служба Android должна запускаться всегда (никогда не останавливать или останавливать)

    Можно ли использовать примитивный тип (int) в качестве общего типа в Java?

    Поощрять JVM к GC, а не вырастить кучу?

    Chrome – изменение навигационных клавиш на странице в программе просмотра PDF

    Что такое ссылка на указатель?

    Как компилировать .java с поддержкой более старых версий Java?

    Как изменить формат даты с dd-mm-yyyy на dd-mm-yy в строке формул MS-EXCEL?

    Macbook pro перезагружается во время первого процесса загрузки

    Проверка правильности данных (регулярное выражение) в asp.net mvc 4 – вид бритвы

    Какие селектора CSS3 действительно поддерживают jQuery, например: nth-last-child ()?

    Есть переменная в пути изображений в Sass?

    Параметрированный запрос в Classic Asp

    Есть ли способ вычислить ширину целочисленного типа во время компиляции?

    Просмотр видео Youtube в Thunderbird

    Давайте будем гением компьютера.