C # TripleDES-провайдер без вектора инициализации?

У меня есть набор зашифрованных документов, закодированных с помощью TripleDES, поступающих из удаленной системы. Мне нужно декодировать данные в C #, и я не могу контролировать ключ или алгоритм кодирования. Все, что у меня есть, это ключ и режим (CBC) и данные, расположенные в файле.

TripleDESCryptoServiceProvider достаточно прост в использовании, но я могуt понять, как использовать Decryptor без вектора инициализации.

У нас есть 24-байтовый (192-битный) ключ для расшифровки, но больше ничего.

   string key = "1468697320656E6372797174696F6E206973737265206933";            
   byte[] keyData = ParseHex(key);  //  key is OK at 24 bytes                     

   TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
   des.Mode = CipherMode.CBC;            
   des.GenerateIV();

   var decryptor = des.CreateDecryptor(keyData,null);  // des.IV

   var encoded = File.ReadAllBytes(@"..\..\..\..\test.tdes");
   byte[] output = decryptor.TransformFinalBlock(encoded, 0, encoded.Length);

Это не удается с плохими данными. Если я переключаюсь на TransformBlock, код, по крайней мере, запускается, но выдает только бред:

   byte[] output = new byte[10000];
   var count = decryptor.TransformBlock(encoded, 0, encoded.Length, output, 0);

Итак, вопросы:

Если у меня есть только ключ, требуется ли InitializationVector?Если не является NULL правильная вещь для передачи?Что еще мне нужно было бы установить помимо ключа и режима?Почему TransformBlock хотя бы работает, а TransformFinalBlock просто не работает?Обновление - обнаружена проблема

Оказывается, проблема с декодированием была вызвана не отсутствующим вектором инициализации, а неверной информацией от поставщика зашифрованных данных. Обновленный рабочий код выглядит так:

        // Read the test data
        byte[] encoded = File.ReadAllBytes(@"..\..\..\..\test.tdes");            

        // Get the key into a byte array
        string key = "1468697320656E6372797174696F6E206973737265206933";           
        byte[] keyData = ParseHex(key);                        


        TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
        des.Mode = CipherMode.ECB;      // Make sure this is correct!!!
        des.Padding = PaddingMode.Zeros;   // Make sure this is correct!!!
        des.Key = keyData;

        var decryptor = des.CreateDecryptor();  
        byte[] output = decryptor.TransformFinalBlock(encoded, 0, encoded.Length);

        string dataString = Encoding.Default.GetString(encoded);
        Console.WriteLine(dataString);

        Console.WriteLine("\r\n\r\nDecoded:");
        string result = Encoding.Default.GetString(output);
        Console.WriteLine(result);

        Console.Read();

Ключом в нашем случае было использование правильного CipherMode и Padding. Исправление заполнения заставило TransformFinalBlock () работать безПлохие данные ошибки. Исправление CipherMode сделало правильно незашифрованные данные.

Мораль истории: в режиме CipherMode.ECB как минимум вектор инициализацииНе нужно указывать вектор инициализации. Если IV не предоставлено, провайдер автоматически сгенерирует его, но расшифровка все еще работает (по крайней мере, с ECB).

В конце концов этоs важно, чтобы убедиться, что у вас естьвся информация от провайдера, который зашифровал данные.

Ответы на вопрос(1)

Ваш ответ на вопрос