2009-10-23 3 views
4

Я пытаюсь расшифровать (используя алгоритм DES) данные, поступающие от третьего лица в коде C#. Здесь много примеров и в других местах, которые помогли мне. Проблема в том, что я не знаю, что использовать для «вектора инициализации».DES Инициализация вектора в C#

Третья сторона предоставила инструмент для использования в командной строке (DES.EXE, который, я считаю, представляет собой сборку библиотеки libdes v4.01), которая требует только того, что вы предоставляете шифрование ключ. Итак, я могу расшифровать с помощью инструмента. Однако я бы предпочел не создавать процесс для запуска инструмента из моего кода.

Мой вопрос в том, как я могу генерировать/находить этот вектор инициализации. Я на 99,9% уверен, что это можно сделать, если посмотреть на другие сообщения, но я не могу понять это. Я поговорил с третьей стороной, и они сказали, что они не поддерживают этот подход. Любая помощь будет принята с благодарностью.

+0

В ответ на ответ ниже требуется вектор инициализации. Я считаю, что сторонняя сторона использует режим CBC. –

+0

Хорошо, как я сказал, ЕСЛИ они используют IV, которые они должны дать вам, потому что вы не можете догадаться об этом. – svens

+0

Как-то не требуется, чтобы инструмент командной строки предоставлял des.exe. Вы просто вводите ключ. Вот почему я считаю, что это выводится. Спасибо за ввод. –

ответ

0

См. http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation для описания различных режимов работы, используемых в блочных шифрах. Вам не нужен вектор инициализации (IV), если вы используете режим ECB, который просто шифрует блок сообщений блоком. Возможно, вам нужно проверить свою библиотеку DES для настройки режима ECB/отключения других.

Если они не используют режим ЕЦБ, вам нужен IV, вы не можете «угадать» его. IV в большинстве случаев не должен быть секретным, поэтому не стоит перемещать его.

1

Я потратил некоторое время (~ 2 дня), чтобы разобраться с той же проблемой. «Переписывание» des.exe на C#. В конце концов, я получил источники libdes и реконструировал логику.

Вектор инициализации - все (8) нули. То есть новый байт [8].

Однако, как правило, можно преобразовать строковый пароль в 8-байтовый длинный ключ. Если вы используете простой DES (не Triple DES), этот код может сделать трюк для вас:

public class LibDesPasswordConvertor 
{ 
    public byte[] PasswordToKey(string password) 
    { 
     if (password == null) 
      throw new ArgumentNullException("password"); 
     if (password == "") 
      throw new ArgumentException("password"); 

     var key = new byte[8]; 

     for (int i = 0; i < password.Length; i++) 
     { 
      var c = (int)password[i]; 
      if ((i % 16) < 8) 
      { 
       key[i % 8] ^= (byte)(c << 1); 
      } 
      else 
      { 
       // reverse bits e.g. 11010010 -> 01001011 
       c = (((c << 4) & 0xf0) | ((c >> 4) & 0x0f)); 
       c = (((c << 2) & 0xcc) | ((c >> 2) & 0x33)); 
       c = (((c << 1) & 0xaa) | ((c >> 1) & 0x55)); 
       key[7 - (i % 8)] ^= (byte)c; 
      } 
     } 

     AddOddParity(key); 

     var target = new byte[8]; 
     var passwordBuffer = 
      Encoding.ASCII.GetBytes(password).Concat(new byte[8]).Take(password.Length + (8 - (password.Length % 8)) % 8).ToArray(); 

     var des = DES.Create(); 
     var encryptor = des.CreateEncryptor(key, key); 
     for (int x = 0; x < passwordBuffer.Length/8; ++x) 
     { 
      encryptor.TransformBlock(passwordBuffer, 8 * x, 8, target, 0); 
     } 

     AddOddParity(target); 

     return target; 
    } 


    private void AddOddParity(byte[] buffer) 
    { 
     for (int i = 0; i < buffer.Length; ++i) 
     { 
      buffer[i] = _oddParityTable[buffer[i]]; 
     } 
    } 

    private static byte[] _oddParityTable = { 
      1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14, 
     16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31, 
     32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47, 
     49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62, 
     64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79, 
     81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94, 
     97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110, 
     112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127, 
     128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143, 
     145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158, 
     161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174, 
     176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191, 
     193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206, 
     208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223, 
     224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239, 
     241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254}; 
} 

(некоторые куски libdes кода повторно, хотя я должен был выяснить DES «контрольная сумма» часть себя).

Последняя ошибка заключается в том, что libdes использует нестандартный механизм заполнения. Это почти как ISO, но последний байт - это не количество добавленных байтов, а 8 - это число. Я установил свойство Padding None и сам обработал прокладку.

+0

Работая над чем-то очень похожим на Java, вы не представляете, насколько сильно вы спасли меня с помощью замечания о дополнении ... – kasoban

+0

Пожалуйста, отредактируйте ответ, по ошибке я проголосовал. Я буду голосовать. Спасибо за решение. –

+0

У меня есть решение в Java и C#. Если кому-то это нужно, отправьте сообщение здесь, и я отправлю ответ. –

Смежные вопросы