Rijndael ошибка инициализации вектора iv

121
23 декабря 2020, 20:20

Не могу изменить ключ для шифрования и расшифровки пишет ошибку:

Rijndael заданный вектор инициализации iv не соответствует размеру блоков для этого алгоритма

Если использую ключ @"myKey123" то всё нормально шифруется и расшифровывается

Код:

public class FlObf
{
  private static readonly string Password = @"Test123"; // @"myKey123"
 // симметричный алгоритм шифрования Rijndael
  public static void EncryptFile(string inputFile, string outputFile)
  {
     try
     {
       var UE = new UnicodeEncoding();
       byte[] key = UE.GetBytes(Password);
       string cryptFile = outputFile;
       using (var fsCrypt = new FileStream(cryptFile, FileMode.Create))
       using (var RMCrypto = new RijndaelManaged())
       using (var cs = new CryptoStream(fsCrypt, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write))
       {
          using (var fsIn = new FileStream(inputFile, FileMode.Open))
          {
             int data;
             while ((data = fsIn.ReadByte()) != -1)
             {
                cs.WriteByte((byte)data);
             }
          }
       }
    }
    catch (Exception ex) { Console.WriteLine(ex.Message); }
   }
  // симметричный алгоритм расшифрования Rijndael
  public static void DecryptFile(string inputFile, string outputFile)
  {
    try
    {
       var UE = new UnicodeEncoding();
       byte[] key = UE.GetBytes(Password);
       using (var fsCrypt = new FileStream(inputFile, FileMode.Open))
       using (var RMCrypto = new RijndaelManaged())
       using (var cs = new CryptoStream(fsCrypt, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Read))
       {
         using (var fsOut = new FileStream(outputFile, FileMode.Create))
         {
           int data;
           while ((data = cs.ReadByte()) != -1)
           {
              fsOut.WriteByte((byte)data);
           }
         }
       }
    }
   catch (Exception ex) { Console.WriteLine(ex.Message); }
}
Answer 1

Вы используете ключ и в качестве ключа, и в качестве вектора инициализации IV:

RMCrypto.CreateEncryptor(key, key)

Второй аргумент здесь - на самом деле IV вектор, случайно сгенеренные 16 байт. Иногда у вас длины ключа не хватает, поэтому происходит ошибка. Но вообще сама логика неверна и нужно добавить IV вектор и передавать его в качестве второго аргумента.

Answer 2

В .NET Framework допустимый размер IV для RijndaelManaged - 128, 192 или or 256 бит.

In .NET Framework, this algorithm supports block sizes of 128, 192, or 256 bits; defaulting to 128 bits

В переводе на строку UTF16 - 8, 12 или 16 символов. Как верно заметил demonplus, вам нужно разделить получение ключа и IV и генерировать IV допустимого размера.

READ ALSO
Быстрое преобразование Фурье и обратное преобразование

Быстрое преобразование Фурье и обратное преобразование

Я ищу реализацию БПФ наNET-совместных языках

101
Как связать две таблицы с помощью DataGridViewComboBoxColumn?

Как связать две таблицы с помощью DataGridViewComboBoxColumn?

У меня есть две таблицы Timetable и Services связанные по ID_ServiceTimetable представлена как DataGrid

118
Сохранение и открытие данных в файл из dataGridView

Сохранение и открытие данных в файл из dataGridView

Всем здравствуйте, вопрос следующийК программе на с# подключена БД из Microsoft SQL Server, в DataGridView выводится таблица

111
Несколько условий для Mysql запроса

Несколько условий для Mysql запроса

Есть таблица, в ней есть колонка meta_key и meta_value Вот запр

133