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

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

Это почему?

3

Решение

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 бит данных.

2

Другие решения

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

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-клавишные ключи.

6

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector