Rijndael шифрования файлов ВыпускRijndael шифрование файлов Выпуск
Я хочу, чтобы шифровать большие файлы с помощью Rijndael, но я получаю из ошибки исключения памяти. Есть идеи? Вот мой код
public void Rijndael_EncryptFile(string password, string filepath, int opt)
{
try
{
byte[] keyBytes;
keyBytes = Encoding.Unicode.GetBytes(password);
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(password, keyBytes);
RijndaelManaged rijndaelCSP = new RijndaelManaged();
rijndaelCSP.BlockSize = opt; //128 256
rijndaelCSP.KeySize = opt; //128 256
rijndaelCSP.Key = derivedKey.GetBytes(rijndaelCSP.KeySize/8);
rijndaelCSP.IV = derivedKey.GetBytes(rijndaelCSP.BlockSize/8);
rijndaelCSP.Mode = CipherMode.CFB;
rijndaelCSP.Padding = PaddingMode.Zeros;
ICryptoTransform encryptor = rijndaelCSP.CreateEncryptor();
FileStream inputFileStream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
byte[] inputFileData = new byte[(int)inputFileStream.Length];
inputFileStream.Read(inputFileData, 0, (int)inputFileStream.Length);
FileStream outputFileStream = new FileStream(filepath + ".enc", FileMode.Create, FileAccess.Write);
CryptoStream encryptStream = new CryptoStream(outputFileStream, encryptor, CryptoStreamMode.Write);
encryptStream.Write(inputFileData, 0, (int)inputFileStream.Length);
encryptStream.FlushFinalBlock();
rijndaelCSP.Clear();
encryptStream.Close();
inputFileStream.Close();
outputFileStream.Close();
}
}
IV должен быть * уникальным * для режима CFB. Не используйте статический IV, потому что это делает шифр детерминированным и, следовательно, не семантически безопасным. Злоумышленник, который наблюдает за зашифрованным текстом, может определить, когда тот же префикс сообщения был отправлен раньше. И что еще хуже с потоковым режимом, таким как CFB, злоумышленник может даже вывести сообщение, если IV повторно используется, даже когда сообщения разные. IV не секрет, поэтому вы можете отправить его вместе с зашифрованным текстом. Обычно это просто добавляется к зашифрованному тексту и разрезается перед расшифровкой. –