Вы правы, использование одного и того же IV - плохая практика, особенно если ключ или IV жестко закодированы. Я бы рекомендовал использовать класс AesManaged
. Он использует алгоритм AES, текущий стандарт. Генерация IV довольно проста:
var aes = new AesManaged(); //Set your KeySize if you will generate a key too.
aes.GenerateIV();
var iv = aes.IV;
Это простой способ получить новый вектор инициализации. Если ваша цель - зашифровать файл, вы можете сохранить файл, но что вы будете делать с ключом? Жесткое кодирование в вашем приложении, как правило, не очень хороший способ сделать это. Если ваше приложение будет основано на пароле, вы можете сгенерировать ключ из Rfc2898DeriveBytes , чтобы получить байтовый массив на основе пароля. Таким образом, ваше приложение никогда не знает, что такое ключ шифрования.
Вот пример для записи IV в файл, затем содержимое файла.
using (AesManaged aes = new AesManaged())
{
//Set the Key here.
aes.GenerateIV();
using (var transform = aes.CreateEncryptor())
{
using (var fileStream = new FileStream("C:\\in.txt", FileMode.Open))
{
using (var saveTo = new FileStream("C:\\out.txt", FileMode.Create))
{
using (var cryptoStream = new CryptoStream(saveTo, transform,CryptoStreamMode.Write))
{
var iv = aes.IV;
cryptoStream.Write(iv, 0, iv.Length);
fileStream.CopyTo(cryptoStream);
}
}
}
}
}