Сколько ключей нужно для шифрования Triple DES?

Я портирую код C# на C++ и пытаюсь зашифровать текстовый файл с помощью шифрования Triple DES. Но я в замешательстве; некоторые API шифрования требуют только одного ключа для Triple DES (например, C#: как реализовать Triple DES в C# (полный пример)), в то время как другим требуется 2 или 3 ключа (в нескольких реализациях C++, которые я обнаружил).

Это почему?

2 ответа

Решение

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

TDEA - это в основном три применения шифра DES. Каждая часть "набора ключей" используется с одним или несколькими исполнениями алгоритма шифрования DES (см. Также шифр Фейстеля);

  • для одного ключа он используется три раза (приравнивается к классическому DES, но больше не рекомендуется), K1 = K2 = K3;
  • для двойного ключа первая часть ключа используется дважды, K1 и K2 независимы, а K3 = K1;
  • и для тройной длины ключа каждая ключевая часть используется один раз, все части независимы.

То, что вы видите как "две" (или "три") клавиши, - это, скорее всего, двойная (или тройная) длина ключа, каждая часть предоставляется отдельно.

Документация по каждому API должна содержать подробности о том, как предоставляются / ожидаются ключи.

Несколько тестов для проверки совместимости также никогда не повредят.


Некоторая справка / контекст о том, как работает TDEA; источник Википедия;

Triple DES использует "набор ключей", который состоит из трех ключей DES, K1, K2 и K3, каждый из 56 бит (исключая биты четности)...

Алгоритм шифрования:

зашифрованный текст = EK3(DK2(EK1(открытый текст)))

То есть, DES шифруется с помощью K1, DES дешифруется с помощью K2, затем DES шифруется с помощью K3.

Расшифровка является обратной:

открытый текст = DK1(EK2(DK3(зашифрованный текст)))

То есть, расшифровать с помощью K3, зашифровать с помощью K2, а затем расшифровать с помощью K1.

Каждое тройное шифрование шифрует один блок из 64 бит данных.

Найл ответил правильно, но мне показалось, что немного больше информации поможет вам лучше понять проблему.

3DES поочередно упоминается в некоторых спецификациях как DES-EDE, то есть DES-Encrypt / Decrypt / Encrypt.

var x = Encrypt(key1, input);
x = Decrypt(key2, x);
x = Encrypt(key3, x);
return x;

Таким образом, для 3DES всегда требуется 3 ключа, каждый из которых имеет 56 битов ключа, растянутых на 64 бита (8 байтов), потому что каждые 7 бит получают проверку на четность 1 бит. Это часто выражается в виде одного 192-битного значения (24 байта) или промежуточного 128-битного значения (16 байтов).

  • Если ключ 3DES имеет 64 бита (который имеет силу ключа 56 бит, и многие реализации отклонят)
    • k1 = ключ
    • k2 = ключ
    • k3 = ключ
  • Если ключ 3DES имеет 128 бит (который имеет силу ключа 112 бит)
    • k1 = ключ [0..7]
    • k2 = ключ [8..15]
    • k3 = k1
  • Если ключ 3DES имеет 192 бита (который имеет силу ключа 168 бит)
    • k1 = ключ [0..7]
    • k2 = ключ [8..15]
    • k3 = ключ [16..23]

Поэтому, если у нас есть 64-битный ключ 3DES, мы шифруем его ключом, затем расшифровываем ключом (возвращая исходные данные), а затем снова шифруем ключом. Это делает 3DES "одним ключом" эквивалентным (1)DES.

Обратите внимание, что эквивалентное DES поведение может иметь место для 3DES с двумя ключами, если k2 совпадает с k1, (или с 3 ключами, если k1=k2=k3), поэтому использование 3DES не всегда является обновлением по сравнению с использованием DES.

Что касается того, почему реализации различаются: в C# массивы помечены по длине, поэтому, передавая один массив, получатель может проверить, передаете ли вы 8, 16 или 24 байта. В C массивы не помечены по длине, поэтому API должен либо спросить вас, как долго ваши данные (что делают Windows CAPI и CNG), либо просто взять три разных ключевых указателя, и заставить вас выполнить клонирование фрагмента для 1- ключ и 2-клавишные ключи.

Другие вопросы по тегам