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 важно, чтобы убедиться, что у вас естьвся информация от провайдера, который зашифровал данные.