Криптография DES на C #

Я пытался найти правильный способ зашифровать байтовую [16] переменную с помощью алгоритма DES. Вот сценарий:

  • Данные должны быть зашифрованы 8-байтовыми частями. ключ для шифрования: byte[] {11, 11, 11, 11, 11, 11, 11, 11}
  • Первые 8 байтов зашифрованы с использованием Instance Vector = new byte[8] (8 байтов со значением 0).
  • зашифрованный результат будет IV для следующих 8 байтов. (это CBC?)
  • последние 8 байт - это результат, который я должен отправить.

Имея эту информацию, я реализовал метод Encrypt следующим образом:

public static byte[] Encrypt(byte[] data)
{
    var dataChunk = new byte[8];
    var IV = new byte[8];
    var result = new byte[8];
    var key = new byte[] { 11, 11, 11, 11, 11, 11, 11, 11 };

    for (int counter = 0; counter < data.Length / 8; counter++)
    {
        // Copy the next 8-byte chunk.
        Array.Copy(data, counter * 8, dataChunk, 0, 8);
        var des = System.Security.Cryptography.DES.Create();
        des.Key = key;
        des.IV = IV;
        des.Padding = PaddingMode.None;
        ICryptoTransform cryptoTransform = des.CreateEncryptor(key, IV);

        // Encrypt the datra chunk.
        cryptoTransform.TransformBlock(dataChunk, 0, 8, result, 0);

        // Set the new IV.
        Array.Copy(result, IV, 8);
    } 
return result;
}

Это правильный способ шифрования данных с использованием шифрования DES?


person Kamyar    schedule 02.10.2011    source источник
comment
Вы можете принять IV в качестве входных данных для этой функции. Как следует из названия, в конце концов, это Исходный Вектор. Кроме того, поскольку вы отбрасываете все зашифрованные данные, кроме последнего блока, на самом деле это не шифрование. Это MAC (код аутентификации сообщения), который, по сути, является механизмом общей секретной подписи.   -  person vhallac    schedule 02.10.2011


Ответы (2)


Вам не нужно создавать шифровальщик для каждого блока. encryptor сам реализует режимы работы (CBC, ...) и заполнение. Итак, вам нужно что-то вроде этого:

byte[] input = ...
byte[] key = ...
byte[] iv = ...

using (DES des = DES.Create())
{
    des.Mode = CipherMode.CBC;
    des.Padding = PaddingMode.None;

    using (ICryptoTransform encryptor = des.CreateEncryptor(key , iv))
    {
        byte[] output = encryptor.TransformFinalBlock(input, 0, input.Length);
    }
}

Я опускаю предупреждение об использовании DES. Вы также можете позже взглянуть на CryptoStream для еще проще шифрование и дешифрование ...

person ordag    schedule 02.10.2011

Я не могу помочь вам с C #, но я могу попытаться ответить на ваш последний вопрос: является ли это «правильным способом» шифрования. Что ж, этот ответ зависит от того, что вы собираетесь делать.

Вы реализовали режим, известный как CBC-MAC; он не позволяет получателю восстановить сообщение (и, следовательно, это вообще не «шифрование»); один из ключей к этому заключается в том, что размер сообщения составляет 16 байтов, а «зашифрованное» сообщение - всего 8 байтов. У него есть то свойство, что кому-то посередине сложно изменить сообщение и придумать правильное 8-байтовое значение MAC (при условии, что у них нет ключа); следовательно, подобные вещи часто используются для криптографически стойких проверок целостности. Теперь у CBC-MAC действительно есть проблемы с атаками на увеличение длины; если вас не интересуют атаки на расширение длины (все ваши сообщения имеют размер 16 байт), это может быть для вас неважно?

Подходит ли CBC-MAC для вашего приложения? Что ж, я не знаю ответа на этот вопрос; ключевые вопросы для вас:

  • Что ты пытаешься сделать? Вы пытаетесь «зашифровать» сообщение (чтобы другая сторона могла его восстановить)? Или вы пытаетесь доказать, что сообщение было отправлено кем-то с ключом?
  • Вы пытаетесь быть совместимым с кем-то другим? Кто-то еще указал этот метод "шифрования"?
  • ortag решил опустить предупреждения для DES, но я думаю, что включу их - DES можно сломать, приложив немало усилий; это, вероятно, безопасно для вашей младшей сестры и, возможно, даже для обычного хакера, но если ваш противник имеет доступ к некоторым компьютерным ресурсам, он может это сломать. Если это вызывает беспокойство, вы захотите переключиться на более сильный шифр, такой как AES.
person poncho    schedule 02.10.2011
comment
Правда, не совсем понятно, что имеется в виду под шифрованием в вопросе и есть ли какая-то путаница. Да и вообще, насчет аспекта безопасности, вы правы, вот график производительности коммерческой машины codebreaker ... это даже о AES дешифровании и уже невероятно быстро, не говоря уже о том, что эта штука делает с DES ... - person ordag; 03.10.2011
comment
@poncho: Да, это CBC-MAC. Спасибо за разъяснение. - person Kamyar; 03.10.2011