Cobra (шифр) — Википедия

Cobra
Создатель Кристиан Шнайдер,
Создан 1996 г.
Опубликован 13 апреля 1996 г.
Размер ключа 8-576 бит
Размер блока 128 бит
Число раундов 12
Тип Сеть Фейстеля

Cobra — алгоритм симметричного блочного шифрования (размер блока 128 бит, ключ длиной до 576 бит), разработанный немецким криптологом Кристианом Шнайдером в качестве первого шифра, имеющего структуру гетерогенной сети Фейстеля (англ. extended Feistel network).

Алгоритм имеет структуру гетерогенной сети Фейстеля. Данная сеть, в отличие от классической, подразумевает использование более чем двух подблоков. Дополнительно, шифр использует несколько наборов зависимых от ключа таблиц подстановки (S-блоков, именуемых автором как англ. S-units) и дополнительную операцию для повышения диффузии.

Cobra - шифр со 128-битным (16-байтным) блоком и переменной длиной ключа. Алгоритм состоит из двух частей: процедуры расширения ключа и процедуры шифрования. Ключ (длиной до 576 бит) расширяется до массива подключей длиной 12464 байта. Шифрование заключается в операции ввода, повторения раундовой функции 12 раз и операции вывода.

Процедура шифрования включает предварительное и последующее ключевое забеливание.

Один раунд расширенной сети Фейстеля в общем случае выглядит следующим образом:

Di = Ai-1
Ci = Di-1 XOR F(D i; K i,c)
Bi = Ci-1 XOR F(C i; K i,b)
Ai = Bi-1 XOR F(B i; K i,a)

Что в случае Cobra выглядит следующим образом:

       A = A XOR W1,1        B = B XOR W1,2        C = C XOR W1,3        D = D XOR W1,4          for r = 1 to 12              D' = A              C' = (D XOR F(D';Pr,3;Sc ))>>>1              B' = (C XOR F(C';Pr,2;Sb ))>>>1              A' = (B XOR F(B';Pr,1;Sa ))>>>1                A = A'                B = B'                C = C'                D = D'          next r        A = A XOR W2,1        B = B XOR W2,2        C = C XOR W2,3        D = D XOR W2,4 

В процессе расширения ключа генерируются 12 P-Box с тремя 32-битными элементами каждая, 12 S-Box по 256 32-битных элементов каждая, две W-Box по четыре элемента каждая.

F функция является нелинейной подстановкой 32 битного элемента. Здесь A' = (B XOR F(B';Pr,1;Sa))>>>1, что значит A' получается путём циклического сдвига вправо результата сложения по модулю 2 переменной B с выходом F функции, которая имеет B', раундовый подключ Pr,1, первый элемент S Unit, Sa, как выход, где r является текущим раудом.

Таблицы подстановки

[править | править код]

Классические шифры на основе сети Фейстеля (к примеру, отечественный стандарт шифрования ГОСТ 28147—89) сильно зависимы от используемой таблицы подстановки, которая и является нелинейной частью алгоритма. Но, как и в алгоритме Blowfish, таблицы подстановки могут быть секретными и зависимыми от ключа. В данном случае, таблицы S-Box генерируются ключевым расписанием, которое является своего рода криптографическим ГПСЧ. В данном случае, естественно, не исключено наличие слабых ключей и генерируемых ими слабых таблиц подстановки. Однако, для решения данной проблемы введена генерация нескольких независимых таблиц и дополнительная операция диффузии. В данном случае, вероятность появления слабого ключа настолько мала, что может не учитываться. Этот тезис особенно верен, а подход практичен при использовании в качестве ключевого материала выхода хеш-функции.

Реализация

[править | править код]

Алгоритм, хотя и не получил широкого распространения, был реализован в популярной криптоутилите Blowfish Advanced 97 Маркуса Хана, где использовался его вариант с 64-битным блоком и ключом 256 бит. Затем в следующей редакции утилиты - версии CS была реализована редакция с 128-битным блоком и ключом до 576 бит.