Конкурс NESSIE
Европейский конкурс криптоалгоритмов NESSIE стартовал несколько позже конкурса AES (см. статью «Алгоритмы шифрования – финалисты конкурса AES», часть 1 и часть 2) – в феврале 2000 г. NESSIE – аббревиатура от New European Schemes for Signature, Integrity, and Encryption – новые европейские алгоритмы подписи, обеспечения целостности и шифрования. Как видно из названия алгоритма, цели конкурса NESSIE были заметно шире, чем у конкурса AES. В рамках конкурса NESSIE рассматривались алгоритмы следующих категорий [13, 14]:
- Блочное симметричное шифрование (на конкурс принято 17 алгоритмов).
- Потоковое шифрование (6 алгоритмов).
- Вычисление кодов аутентификации сообщений (Message Authentication Code – MAC, 2 алгоритма).
- Хэширование (1 алгоритм).
- Асимметричное шифрование (5 алгоритмов).
- Электронная цифровая подпись (7 алгоритмов).
- Идентификация (1 алгоритм).
Данная статья посвящена алгоритмам блочного симметричного шифрования, которые будут подробно рассмотрены в этой и последующих частях статьи.
Как и на конкурсе AES, алгоритмы-участники конкурса были присланы, практически, со всех концов Света. Причем, абсолютным лидером по количеству рассмотренных на конкурсе алгоритмов явилась Япония – из 39 участников конкурса в Японии было разработано 8.
В отличие от конкурса AES, единственной экспертной организацией в котором был институт NIST, организаторами конкурса NESSIE был интернациональный консорциум из следующих организаций, известных своими исследованиями в области криптологии:
- Католический Университет г. Лювен (Leuven), Бельгия – координатор проекта.
- Высшее учебное заведение Ecole Normale Superieure, Париж, Франция.
- Университет Royal Holloway, Лондон, Великобритания.
- Корпорация Siemens AG, Германия.
- Технологический Институт Technion, Хайфа, Израиль.
- Университет г. Берген, Норвегия.
Еще одно принципиальное отличие NESSIE (касательно алгоритмов блочного шифрования) от конкурса AES состояло в том, что не был установлен какой-либо конкретный размер блока шифруемых данных, поэтому в конкурсе рассматривались 64-, 128-, 160- и 256-битные блочные шифры. Для начала приведем общий список алгоритмов блочного шифрования, участвовавших в конкурсе:
№ | Алгоритм | Размеры блока, бит | Авторы (организация1, страна) |
1 | CS-Cipher | 64 | Jacques Stern, Serge Vaudenay (CS Communication & Systemes, Франция) |
2 | Hierocrypt-L1 | 64 | Kenji Ohkuma, Fumihiko Sano, Hirofumi Muratani, Masahiko Motoyama, Shinichi Kawamura (Toshiba Corporation, Япония) |
3 | Hierocrypt-3 | 128 | |
4 | IDEA | 64 | Xuejia Lai, James L. Massey (Ascom Systec Ltd., Швейцария). |
5 | Khazad | 64 | Paulo Sergio L.M. Barreto (Бразилия) и Vincent Rijmen (Бельгия) |
6 | Anubis | 128 | |
7 | MISTY1 | 64 | Mitsuru Matsui (Mitsubishi Electric Corporation, Япония) |
8 | Nimbus | 64 | Alexis Warner Machado (Бразилия) |
9 | NUSH | 64, 128, 256 | Лебедев Анатолий Николаевич, Волчков Алексей Анатольевич (ЛАН Крипто, Россия) |
10 | SAFER++ | 64, 128 | James L. Massey (Швейцария), Gurgen H. Khachatrian (США), Melsik K. Kuregian (Армения) |
11 | Grand Cru | 128 | Johan Borst (Бельгия) |
12 | Noekeon | 128 | Joan Daemen, Michael Peeters, Gilles Van Assche, Vincent Rijmen (Бельгия) |
13 | Q | 128 | Leslie McBride (США) |
14 | RC6 | 128 и более | Ronald R. Rivest, Matthew J.B. Robshaw, Raymond M. Sidney, Yiqun Lisa Yin (RSA Security Inc., США) |
15 | SC2000 | 128 | Takeshi Shimoyama, Hitoshi Yanami, Kazuhiro Yokoyama, Masahiko Takenaka, Kouichi Itoh, Jun Yajima, Naoya Torii, Hidema Tanaka (Fujitsu Laboratories LTD., Япония) |
16 | Camellia | 128 | Kazumaro Aoki, Tetsuya Ichikawa, Masayuki Kanda, Mitsuru Matsui, Shiho Moriai, Junko Nakajima, Toshio Tokita (Nippon Telegraph and Telephone Corporation и Mitsubishi Electric Corporation, Япония) |
17 | SHACAL | 160 | Helena Handschuh, David Naccache (Gemplus, Франция) |
Еще одна аналогия с конкурсом AES – два раунда конкурса. Причем, их назначение полностью аналогично конкурсу AES: в первом раунде конкурса NESSIE были рассмотрены все алгоритмы, из которых во второй раунд были выбраны те из них, у которых не было явно выраженных недостатков. Соответственно, во втором раунде из финалистов были выбраны лучшие.
Начнем описание алгоритмов с 64-битных блочных шифров, не вышедших во второй раунд конкурса.
Многие материалы, касающиеся конкурса NESSIE, доступны на его домашней страничке, которая поддерживается Католическим Университетом г. Лювен.
Алгоритм CS-Cipher
Авторы алгоритма шифрования CS-Cipher (или просто CS) – Жак Стерн (Jacques Stern) и Серж Воденэ (Serge Vaudenay) из расположенного в Париже высшего учебного заведения Ecole Normale Superieure (ENS). ENS представляет собой университет, предлагающий обучение по различным направлениям, как для студентов старших курсов, так и послевузовское. ENS ведет свою историю с 1796 года, его специалисты хорошо известны в мире своими исследовании в области криптографии.
Название алгоритма CS происходит от французского словосочетания Chiffrement Symetrique, что весьма просто переводится как «симметричный шифр». Алгоритм шифрует данные 64-битными блоками с использованием ключа переменной длины – до 128 бит.
CS был впервые представлен авторами на конференции Fast Software Encryption в 1998 г., а в сентябре 2000 г. предложен на конкурс NESSIE его авторами при участии Пьера-Алана Фуке (Pierre-Alain Fouque) из компании CS Communication & Systemes, владеющей правами на алгоритм [9].
Структура алгоритма
Алгоритм CS представляет собой SP-сеть (см. статью «Назначение и структура алгоритмов шифрования», содержащую классификацию криптографических алгоритмов и описание наиболее часто встречающихся структур алгоритмов шифрования), состоящую из 8 раундов преобразований. Между раундами, а также перед первым раундом и после последнего выполняется наложение на обрабатываемый блок данных одного из фрагментов расширенного ключа k0...k8 (процедура расширения ключа будет подробно описана ниже) побитовой логической операцией «исключающее или» (XOR) – см. рис. 1 [12].
В каждом раунде (функция E() на рис. 1) выполняются следующие операции (см. рис. 2):
- 64-битный блок данных делится на 4 слова по 16 бит, каждое из которых обрабатывается операцией M() (подробно описана ниже).
- Выполняется байтовая перестановка результата предыдущего шага согласно таблице:0, 2, 4, 6, 1, 3, 5, 7.
Т.е. байт 0 остается на своем месте, байт 2 становится байтом 1 и т.д. Байты отсчитываются справа налево. - Результат предыдущего шага складывается операцией XOR с константой c, после чего повторяются шаги 1 и 2. 64-битные константы с и c’ (используется на следующем шаге) получены из шестнадцатеричной записи первых 128 бит дробной части константы e и выглядят так:c = B7E151628AED2A6A,
c’ = BF7158809CF4F3C7. - Результат предыдущего шага обрабатывается аналогично шагу 3, но вместо константы c используется c’.
Функция M() обрабатывает 16-битные слова следующим образом (см. рис. 3):
- Входное значение x разбивается на два 8-битных фрагмента xl и xr.
- Вычисляются байты выходного значения: yl = P(h(xl) xr),где <<< – операция циклического сдвига на указанное число бит влево,
yr = P((xl <<< 1) xr),
преобразование P() будет подробно описано ниже,
а функция h() определена следующим образом:h(n) = ((n <<< 1) & 552 ) n),где & – побитовая логическая операция «и». - Выходное значение y – результат конкатенации: M(x) = y = yl || yr.
Преобразование P() замещает 8-битное входное значение p = pl || pr (pl и pr имеют размер по 4 бита) 8-битным значением q = ql || qr путем следующих вычислений (см. рис. 4):
qr = pr g(t),
ql = t f(qr),
где t – временная переменная,
функция g() будет подробно описана ниже,
а функция f() определена следующим образом:
Входное значение | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Выходное значение | F | D | B | B | 7 | 5 | 7 | 7 | E | D | A | B | E | D | E | F |
Выходное значение функции f() также может быть вычислено из входного следующим образом:
где - побитовый комплемент к n.
Функция g() является табличной заменой:
Входное значение | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Выходное значение | A | 6 | 0 | 2 | B | E | 1 | 8 | D | 4 | 5 | 3 | F | C | 7 | 9 |
Стоит сказать, что для ускорения шифрования данных преобразование P(pl, pr) может быть реализовано не описанными выше вычислениями, а в виде следующей табличной замены (строки соответствуют значению pl, столбцы – pr):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
0 | 29 | 0D | 61 | 40 | 9C | EB | 9E | 8F | 1F | 85 | 5F | 58 | 5B | 01 | 39 | 86 |
1 | 97 | 2E | D7 | D6 | 35 | AE | 17 | 16 | 21 | B6 | 69 | 4E | A5 | 72 | 87 | 08 |
2 | 3C | 18 | E6 | E7 | FA | AD | B8 | 89 | B7 | 00 | F7 | 6F | 73 | 84 | 11 | 63 |
3 | 3F | 96 | 7F | 6E | BF | 14 | 9D | AC | A4 | 0E | 7E | F6 | 20 | 4A | 62 | 30 |
4 | 03 | C5 | 4B | 5A | 46 | A3 | 44 | 65 | 7D | 4D | 3D | 42 | 79 | 49 | 1B | 5C |
5 | F5 | 6C | B5 | 94 | 54 | FF | 56 | 57 | 0B | F4 | 43 | 0C | 4F | 70 | 6D | 0A |
6 | E4 | 02 | 3E | 2F | A2 | 47 | E0 | C1 | D5 | 1A | 95 | A7 | 51 | 5E | 33 | 2B |
7 | 5D | D4 | 1D | 2C | EE | 75 | EC | DD | 7C | 4C | A6 | B4 | 78 | 48 | 3A | 32 |
8 | 98 | AF | C0 | E1 | 2D | 09 | 0F | 1E | B9 | 27 | 8A | E9 | BD | E3 | 9F | 07 |
9 | B1 | EA | 92 | 93 | 53 | 6A | 31 | 10 | 80 | F2 | D8 | 9B | 04 | 36 | 06 | 8E |
A | BE | A9 | 64 | 45 | 38 | 1C | 7A | 6B | F3 | A1 | F0 | CD | 37 | 25 | 15 | 81 |
B | FB | 90 | E8 | D9 | 7B | 52 | 19 | 28 | 26 | 88 | FC | D1 | E2 | 8C | A0 | 34 |
C | 82 | 67 | DA | CB | C7 | 41 | E5 | C4 | C8 | EF | DB | C3 | CC | AB | CE | ED |
D | D0 | BB | D3 | D2 | 71 | 68 | 13 | 12 | 9A | B3 | C2 | CA | DE | 77 | DC | DF |
E | 66 | 83 | BC | 8D | 60 | C6 | 22 | 23 | B2 | 8B | 91 | 05 | 76 | CF | 74 | C9 |
F | AA | F1 | 99 | A8 | 59 | 50 | 3B | 2A | FE | F9 | 24 | B0 | BA | FD | F8 | 55 |
Расшифрование
Расшифрование выполняется применением обратных операций в обратной последовательности. Обратной к операции E() является операция E-1(), приведенная на рис. 5.
Сначала в данной операции выполняется обратная (по отношению к применяемой в операции E()) байтовая перестановка, затем применяется операция M-1(), затем выполняется XOR обрабатываемых данных с константой c’ и т.д.
M-1() также выполняется в несколько шагов:
- Входное значение y разбивается на два 8-битных фрагмента yl и yr.
- Вычисляются байты выходного значения:xl = h’(P(yl) P(yr)),где функция h’() определена следующим образом:
xr = (xl <<< 1) P(yr),h’(n) = ((n <<< 1) & AA) n). - Выходное значение x – результат конкатенации:M-1(y) = x = xl || xr.
Процедура расширения ключа
Расширение ключа выполняется в несколько этапов. Сначала ключ шифрования (если его размер меньше 128 бит) дополняется справа нулями до 128 бит.
Затем дополненный 128-битный ключ k делится на две 64-битные части:
на основе которых выполняется итеративное вычисление подключей k0...k8 (см. рис. 6):
Функция F() определена следующим образом:
где P’() обозначает параллельное применение функции P() к каждому байту входного 64-битного значения.
Преобразование P() было описано выше, а T() представляет собой битовую перестановку (xi – i-й бит 64-битного значения x):
т.е. первые 8 бит выходного значения составляются из каждого первого бита 8 байт входного значения, затем используются 8 вторых бит и т.д.
Константы ci получены из первых строк описанной выше таблицы преобразования P() и выглядят следующим образом:
c1 = 1F855F585B013986,
c2 = 972ED7D635AE1716,
c3 = 21B6694EA5728708,
c4 = 3C18E6E7FAADB889,
c5 = B700F76F73841163,
c6 = 3F967F6EBF149DAC,
c7 = A40E7EF6204A6230,
c8 = 03C54B5A46A34465.
Как видно, при зашифровании расширение ключа может выполняться «на лету», т.е. по мере необходимости. Однако, при расшифровании подключи применяются в обратной последовательности, поэтому расширение ключа необходимо выполнить до начала расшифрования.
Достоинства и недостатки алгоритма
Первичный криптоанализ алгоритма CS был проведен одним из его авторов – Сержем Воденэ [15], который доказал, что измененный вариант алгоритма с константами и подключами, замененными на случайные величины, не подвержен дифференциальному и линейному криптоанализу. Кроме того, для достижения стойкости против данных видов атак достаточно 5? раундов алгоритма.
Эксперты конкурса NESSIE в отчете [11] также подтверждают, что у алгоритма CS не обнаружено слабостей и каких-либо атак на него. Однако, исследования производительности алгоритмов-участников конкурса показали, что алгоритм CS является наиболее медленным среди всех 64-битных участников [8, 9]. Поэтому CS не вышел во второй этап конкурса именно из-за низкой скорости шифрования [8].
Алгоритм Hierocrypt-L1
Hierocrypt-L1 предложен на конкурс NESSIE известной японской корпорацией Toshiba. Авторы алгоритма: Кенджи Окума (Kenji Ohkuma), Фумихико Сано (Fumihiko Sano), Хирофуми Муратани (Hirofumi Muratani), Масахико Мотояма (Masahiko Motoyama) и Шиничи Кавамура (Shinichi Kawamura).
Алгоритм шифрует данные 64-битными блоками с использованием 128-битных ключей шифрования.
Структура алгоритма
Аналогично алгоритму CS, Hierocrypt-L1 представляет собой SP-сеть. Его структура представлена на рис. 7.
Всего алгоритм выполняет 6 раундов преобразований (причем, последний раунд отличается от предыдущих), после которых производится заключительное наложение материала ключа [5, 6].
В каждом из первых пяти раундов над обрабатываемым 64-битным блоком данных выполняются следующие операции:
- Операция XS, которая будет подробно описана ниже.
- Операция PH, представляющая собой умножение блока на фиксированную матрицу MH:
где x1...x8 – 8-битные фрагменты входного значения, y1...y8 – 8-битные фрагменты результата, умножение выполняется в поле GF(28), а матрица MH определена следующим образом:1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 0 1 0 1 1
Операция XS, фактически, представляет собой вложенную SP-сеть, которая выполняет следующие преобразования (см. рис. 8):
- Наложение 64-битного фрагмента ключа раунда:Y = X Ki,1,
где X и Y – соответственно, входное и выходное значения текущей операции, а Ki,1 – первый фрагмент ключа i-го раунда.
- Табличная замена S, параллельно заменяющая значения каждого байта результата предыдущей операции согласно следующей таблице:
07 FC 55 70 98 8E 84 4E BC 75 CE 18 02 E9 5D 80 1C 60 78 42 9D 2E F5 E8 C6 7A 2F A4 B2 5F 19 87 0B 9B 9C D3 C3 77 3D 6F B9 2D 4D F7 8C A7 AC 17 3C 5A 41 C9 29 ED DE 27 69 30 72 A8 95 3E F9 D8 21 8B 44 D7 11 0D 48 FD 6A 01 57 E5 BD 85 EC 1E 37 9F B5 9A 7C 09 F1 B1 94 81 82 08 FB C0 51 0F 61 7F 1A 56 96 13 C1 67 99 03 5E B6 CA FA 9E DF D6 83 CC A2 12 23 B7 65 D0 39 7D 3B D5 B0 AF 1F 06 C8 34 C5 1B 79 4B 66 BF 88 4A C4 EF 58 3F 0A 2C 73 D1 F8 6B E6 20 B8 22 43 B3 33 E7 F0 71 7E 52 89 47 63 0E 6D E3 BE 59 64 EE F6 38 5C F4 5B 49 D4 E0 F3 BB 54 26 2B 00 86 90 FF FE A6 7B 05 AD 68 A1 10 EB C7 E2 F2 46 8A 6C 14 6E CF 35 45 50 D2 92 74 93 E1 DA AE A9 53 E4 40 CD BA 97 A3 91 31 25 76 36 32 28 3A 24 4C DB D9 8D DC 62 2A EA 15 DD C2 A5 0C 04 1D 8F CB B4 4F 16 AB AA A0 Таким образом, таблица заменяет значение 0 на 7, 1 – на FC, 2 – на 55 и т.д.
- 64-битный блок делится на два 32-битных фрагмента, которые параллельно обрабатываются процедурой PL, которая выполняет над субблоком умножение на фиксированную матрицу ML:
где x1...x4 и y1...y4 – 8-битные фрагменты, соответственно, входного и выходного значения, а матрица ML определена так:
C4 65 C8 8B 8B C4 65 C8 C8 8B C4 65 65 C8 8B C4 Умножение выполняется в поле GF(28) с образующим полиномом x8 + x6 + x5 + x + 1. Причем, фрагменты входного значения (xn) и элементы матрицы (a) преобразуются в элементы поля GF(28) различным образом:
- Наложение второго 64-битного фрагмента ключа раунда:Y = X Ki,2.
- Повторное выполнение описанной выше табличной замены S.
Последний раунд отличается от предыдущих тем, что в нем выполняется только операция XS; операция PH в последнем раунде не выполняется.
Кроме того, как было сказано выше, после шестого раунда выполняется наложение на блок данных 64-битного фрагмента расширенного ключа K7.
Расшифрование выполняется применением обратных операций в обратной последовательности. При этом, в операциях PH-1 и PL-1 используются, соответственно, следующие матрицы:
1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
82 | C4 | 34 | F6 |
F6 | 82 | C4 | 34 |
34 | F6 | 82 | C4 |
C4 | 34 | F6 | 82 |
Расширение ключа
Процедура расширения ключа является достаточно сложной по сравнению с многими другими алгоритмами. Она состоит из двух этапов:
- Генерация промежуточных ключей на основе ключа шифрования.
- Вычисление расширенного ключа на основе промежуточных ключей.
Рассмотрим первый из данных этапов.
Он подразумевает выполнение следующих операций (см. рис. 9):
Z4 = PB(KI4),
Z1 = KI2,
Z2 = KI1 F(KI2 Z3),
где KI1...KI4 – 32-битные фрагменты исходного ключа шифрования,
Z1...Z4 – 32-битные фрагменты промежуточного ключа,
H0 – одна из констант, используемых в процедуре расширения ключа (см. ниже),
P5 – операция умножения 32-битного значения на фиксированную матрицу M5:
где x1...x4 и y1...y4 – 8-битные фрагменты, соответственно, входного и выходного значения, а матрица M5 определена так:
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 0 |
0 | 1 | 0 | 1 |
Умножение выполняется в поле GF(28).
PB – аналогичная операция умножения на матрицу MB, определенную следующим образом:
0 | 1 | 0 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
1 | 0 | 1 | 1 |
Функция F() выполняется в несколько шагов:
- Входное значение разбивается на 4 фрагмента по 8 бит.
- Каждый из фрагментов прогоняется через описанную выше таблицу замен S.
- Выходное значение функции F() – результат умножения выходного значения предыдущего шага на матрицу M8 (аналогично описанной выше операции P5):
1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 1
Этап 2 процедуры расширения ключа – вычисление необходимого количества подключей на основе промежуточного ключа.
Данный процесс выполняется в 7 раундов, в первых четырех из которых выполняются следующие преобразования (см. рис. 10):
Y3 = P5(T1) Hi,
Y4 = PB(T2),
Y1 = X2,
Y2 = X1 F(X2 Y3),
где X1...X4 и Y1...Y4 – соответственно, 32-битные фрагменты входного и выходного значения; в первом раунде в качестве входного значения используются Z1...Z4, в последующих – выходные значения предыдущего раунда,
T1 и T2 – временные переменные,
H1...H4 – константы, используемые в процедуре расширения ключа (совместно с упомянутой выше H0):
H1 = 6ED9EBA1,
H2 = 8F1BBCDC,
H3 = CA62C1D6,
H4 = F7DEF58A.
Данные константы – шестнадцатеричная запись дробной части иррациональных чисел
n = 2, 3, 5, 10, 15 для H0, H1, H2, H3, H4 соответственно.
P16 – аналогичное используемому в функции F() умножению на матрицу M8, однако, обрабатываемое данной операцией 64-битное значение делится на 4 16-битных фрагмента (а не на 8-битные), соответственно, умножение выполняется в поле GF(216).
Фактически, каждый из первых четырех раундов идентичен первому этапу расширения ключа, за исключением присутствия операции P16 и других используемых констант Hi. Ключи шифрования для i-го раунда шифрования вычисляются в конце i-го раунда этапа 2 процедуры расширения ключа:
Ki,1,2 = Y2 X1 Y3,
Ki,2,1 = Y2 X1 Y4,
Ki,2,2 = Y1 Y4,
где Ki,j,1 и Ki,j,2 – 32-битные «половинки» подключей i-го раунда Ki,1 и Ki,2 (их применение было описано выше).
Впоследствии выполняются 3 раунда (с 5-го по 7-й), которые являются обратными первым четырем – таким образом, для n = 1...3 выполняется следующее соотношение фрагментов расширенного ключа:
В каждом обратном раунде выполняются следующие преобразования (см. рис. 11):
Y2 = X1,
T1 = PB(X3 H9-i),
T2 = P5(X4),
Y3 || Y4 = P16-1(T1 || T2).
Операция P16-1 является обратной к операции P16, т.е. по описанным выше правилам выполняет умножение 16-битных фрагментов входного значения на следующую матрицу:
1 | 1 | 1 | 0 |
1 | 1 | 0 | 1 |
0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 |
Ключи раундов шифрования 5-7 вычисляются следующим образом:
Ki,1,2 = Y1 X2 T1,
Ki,2,1 = Y1 X2 T2,
Ki,2,2 = Y2 T2.
Процедура расширения ключа позволяет генерировать подключи «на лету», однако, только при зашифровании – при расшифровании придется сначала вычислить полный набор подключей.
Достоинства и недостатки алгоритма
Эксперты конкурса NESSIE после изучения алгоритма Hierocrypt-L1, а также различных посвященных ему материалов пришли к выводу, что данный алгоритм имеет исключительно медленную процедуру расширения ключа, что существенно ограничивает возможную область применения алгоритма [8]. Кроме того, были обнаружены уязвимости в процедуре расширения ключа, а также несколько вариантов атак на версии алгоритма с усеченным числом раундов [7]. Эти недостатки алгоритма Hierocrypt-L1 не позволили ему выйти во второй раунд конкурса NESSIE.
Алгоритм Nimbus
Алгоритм шифрования Nimbus разработан Алексисом Уорнером Мачадо (Alexis Warner Machado) из компании Gauss Informatica, Бразилия. Алгоритм исключительно прост в описании, структуру его раунда можно, фактически, представить одной формулой (см. рис. 12) [4]:
где x и y – соответственно, входное и выходное значения текущего (i-го) раунда преобразований, i = 0...4;
k0...k9 – фрагменты расширенного ключа (см. ниже);
функция g() представляет собой битовую перестановку, она просто меняет местами биты №№ n и 63-n для n = 0...31.
Расшифрование выглядит не сложнее – так же, как и при зашифровании, выполняется 5 раундов преобразований:
где x и y – соответственно, выходное и входное значения i-го раунда расшифрования,
а k’n – мультипликативная обратная величина к kn по модулю 264.
Стоит сказать, что автор алгоритма не ограничивает размер блока 64 битами: можно шифровать блоками по 128 и 256 бит и более. При этом используются вычисления по модулю 2128, 2256 и т.д. Поскольку с увеличением размера блока сложность подобных вычислений нелинейно возрастает, дальнейшее увеличение размера блока не выглядит оправданным.
Процедура расширения ключа
Nimbus использует ключи шифрования переменного размера, от 64 до 576 бит; размер ключа шифрования должен быть кратен 64 битам. Исходный ключ представляется в виде последовательности 64-битных блоков K0...Km. Генерация на их основе последовательности подключей k0…k9 выполняется следующим образом:
- Инициализация подключей, состоящая в обнулении последовательности k0...k9.
- В цикле по i от 0 до m (m – размер ключа в 64-битных блоках) выполняются следующие действия:
- Вычисляется промежуточное значение x: x = Ki E(Ki),
где E() представляет собой зашифрование входного значения алгоритмом Nimbus на наборе фиксированных подключей, который выглядит так:
k0 243F6A8885A308D3 k1 13198A2E03707345 k2 A4093822299F31D1 k3 082EFA98EC4E6C89 k4 452821E638D01377 k5 BE5466CF34E90C6C k6 C0AC29B7C97C50DD k7 3F84D5B5B5470917 k8 9216D5D98979FB1B k9 D1310BA698DFB5AC Данные константы представляют собой шестнадцатеричную запись дробной части числа .
- В цикле по j от 0 до 9 выполняются следующие операции: x = E(x),
kj = x E(x kj).
- Вычисляется промежуточное значение x:
- Обеспечивается нечетность значений подключей k0...k4, которые используются в операциях умножения при шифровании – путем установки младших бит k0...k4 в единичное значение.
Стоит обратить внимание на следующие свойства алгоритма и процедуры расширения ключа:
- При необходимости достаточно легко можно увеличить количество раундов алгоритма (в абсолютном большинстве алгоритмов это приводит к увеличению криптостойкости за счет снижения скорости шифрования). Для этого достаточно лишь увеличить число подключей (и соответствующие циклы в описанных выше шагах 1-3 процедуры расширения ключа) и, собственно, число раундов алгоритма.
- Расширение ключа никоим образом невозможно выполнять «на лету», что можно считать недостатком алгоритма.
Достоинства и недостатки алгоритма
В спецификации алгоритма [4] его автор утверждал, что Nimbus обладает стойкостью против всех известных атак, в случае, если количество раундов алгоритма превышает 4 (а в спецификации установлено 5 раундов алгоритма). Однако, алгоритм не был выбран во второй раунд конкурса NESSIE из-за найденной специалистами атаки, которую весьма реально осуществить на практике [7].
Данная атака была изобретена известными криптологами из института Technion, Израиль: Эли Бихамом (Eli Biham) и Владимиром Фурманом (Vladimir Furman) [1]. Атака позволяет вычислить ключ шифрования полнораундового алгоритма Nimbus на основе всего 256 выбранных открытых текстов и соответствующих им шифртекстов путем выполнения не более 210 тестовых операций шифрования. При наличии у злоумышленника возможности выбора шифртекстов для атаки требуется еще меньше материала – достаточно 136 выбранных шифртекстов (и соответствующих им открытых текстов) при той же вычислительной сложности. Впоследствии специалистам из Университета Беркли (США) удалось распространить принципы атаки, предложенной Бихамом и Фурманом, на ряд других алгоритмов шифрования [2].
Таким образом, алгоритм Nimbus оказался наиболее слабым из всех алгоритмов блочного шифрования, участвовавших в конкурсе NESSIE.
Алгоритм NUSH
Алгоритм NUSH предложен на конкурс NESSIE Российской компанией «ЛАН Крипто», которая представляет собой одну из наиболее известных отечественных компаний-разработчиков средств криптографической защиты информации (в том числе, и на основе криптоалгоритмов собственной разработки). Авторы алгоритма – одни из наиболее значимых в России экспертов по криптологии: Президент компании «ЛАН Крипто» Лебедев А.Н. и Президент Российской Криптологической Ассоциации «РусКрипто» Волчков А.А.
В отличие от рассмотренных выше алгоритмов CS-Cipher и Nimbus, алгоритм NUSH имеет несколько фиксированных размеров шифруемого блока данных: 64, 128 и 256 бит. Рассмотрим 64-битный вариант алгоритма.
Структура алгоритма
Структура алгоритма показана на рис. 13 [3]. Шифруемый блок данных разбивается на 4 субблока по 16 бит (обозначаемые как a, b, c, d).
Прежде всего, выполняется начальное преобразование, состоящее в том, что на каждый субблок операцией XOR накладывается фрагмент расширенного ключа (процедура расширения ключа будет описана ниже) для начального преобразования KS0...KS3:
B = b KS1,
C = c KS2,
D = d KS3,
где A, B, C, D – значения соответствующих субблоков после выполнения текущей операции.
Затем выполняется 9 раундов преобразований; структура раунда будет описана ниже.
По завершении 9 раундов выполняется финальное преобразование, в котором операцией XOR на субблоки накладываются подключи для финального преобразования KF0...KF3:
B = b KF1,
C = c KF2,
D = d KF3.
Основой каждого раунда алгоритма является преобразование ("итерация" согласно спецификации алгоритма) R(X1, X2, X3, X4, k, s); в одной итерации выполняются следующие действия (см. рис. 14):
Y1 = X1 + (Y3 # X4) mod 216,
Y2 = X2,
Y4 = X4,
где X1...X4 и Y1...Y4 - соответственно, входные и выходные значения обрабатываемых субблоков,
k – модифицированный фрагмент расширенного ключа для текущей итерации,
>>> – побитовый циклический сдвиг операнда вправо на переменное число бит,
s – число бит сдвига, различно для каждой итерации и выбирается из таблицы S:
Раунд | Итерация | s |
0 | 0 | 4 |
0 | 1 | 7 |
0 | 2 | 11 |
0 | 3 | 8 |
1 | 0 | 7 |
1 | 1 | 14 |
1 | 2 | 5 |
1 | 3 | 4 |
2 | 0 | 8 |
2 | 1 | 2 |
2 | 2 | 9 |
2 | 3 | 4 |
3 | 0 | 13 |
3 | 1 | 1 |
3 | 2 | 14 |
3 | 3 | 6 |
4 | 0 | 7 |
4 | 1 | 12 |
4 | 2 | 5 |
4 | 3 | 1 |
5 | 0 | 2 |
5 | 1 | 4 |
5 | 2 | 12 |
5 | 3 | 3 |
6 | 0 | 9 |
6 | 1 | 2 |
6 | 2 | 11 |
6 | 3 | 13 |
7 | 0 | 12 |
7 | 1 | 3 |
7 | 2 | 6 |
7 | 3 | 11 |
8 | 0 | 7 |
8 | 1 | 15 |
8 | 2 | 4 |
8 | 3 | 14 |
Символом # обозначена побитовая логическая операция "и" (&) или побитовая логическая операция "или" (|), конкретная из которых также выбирается из следующей таблицы:
Раунд | Итерация | # |
0 | 0 | & |
0 | 1 | | |
0 | 2 | & |
0 | 3 | | |
1 | 0 | | |
1 | 1 | | |
1 | 2 | | |
1 | 3 | | |
2 | 0 | & |
2 | 1 | | |
2 | 2 | | |
2 | 3 | & |
3 | 0 | | |
3 | 1 | & |
3 | 2 | | |
3 | 3 | | |
4 | 0 | | |
4 | 1 | | |
4 | 2 | & |
4 | 3 | & |
5 | 0 | & |
5 | 1 | & |
5 | 2 | & |
5 | 3 | | |
6 | 0 | & |
6 | 1 | | |
6 | 2 | | |
6 | 3 | | |
7 | 0 | & |
7 | 1 | | |
7 | 2 | & |
7 | 3 | & |
8 | 0 | | |
8 | 1 | | |
8 | 2 | & |
8 | 3 | | |
Раунд состоит из четырех итераций (в таблицах выше пронумерованы от 0 до 3), выполняемых по следующему закону:
R(b, c, d, a, KRC4i + 1, S[4i + 1]),
R(c, d, a, b, KRC4i + 2, S[4i + 2]),
R(d, a, b, c, KRC4i + 3, S[4i + 3]),
где i – номер текущего раунда, начиная с 0,
KRCn – модифицированный фрагмент расширенного ключа для текущей итерации (KRn):
где c – модифицирующая константа согласно следующей таблице:
Раунд | Итерация | с |
0 | 0 | AC25 |
0 | 1 | 8A93 |
0 | 2 | 243D |
0 | 3 | 262E |
1 | 0 | F887 |
1 | 1 | C4F2 |
1 | 2 | 8E36 |
1 | 3 | 9FA1 |
2 | 0 | 7DC0 |
2 | 1 | 6A29 |
2 | 2 | 6D84 |
2 | 3 | 34BD |
3 | 0 | A267 |
3 | 1 | CC15 |
3 | 2 | 04FE |
3 | 3 | B94A |
4 | 0 | DF24 |
4 | 1 | 40EF |
4 | 2 | 96DA |
4 | 3 | 905F |
5 | 0 | D631 |
5 | 1 | AA62 |
5 | 2 | 4D15 |
5 | 3 | 70CB |
6 | 0 | 7533 |
6 | 1 | 45FC |
6 | 2 | 5337 |
6 | 3 | D25E |
7 | 0 | A926 |
7 | 1 | 1C7B |
7 | 2 | 5F12 |
7 | 3 | 4ECC |
8 | 0 | 3C86 |
8 | 1 | 28DB |
8 | 2 | FC01 |
8 | 3 | 7CB1 |
Расшифрование
Расшифрование выполняется применением обратных операций в обратной последовательности. Таким образом, при расшифровании сначала выполняется обратное финальное преобразование, затем 9 раундов по 4 обратных итерации, после чего – обратное начальное преобразование.
Обратные финальное и начальное преобразования полностью аналогичны прямым – на субблоки a, b, c, d операцией XOR накладываются, соответственно, фрагменты расширенного ключа KF0...KF3 и KS0...KS3.
Итерации каждого раунда также выполняются в обратной последовательности (i = 9…1):
R-1(c, d, a, b, KRC4i - 2, S[4i - 2]),
R-1(b, c, d, a, KRC4i - 3, S[4i - 3]),
R-1(a, b, c, d, KRC4i - 4, S[4i - 4]).
Итерация R-1(X1, X2, X3, X4, k, s) выглядит следующим образом (см. рис. 15):
Расширение ключа
Процедура расширения ключа весьма проста и напоминает таковую у отечественного стандарта шифрования ГОСТ 28147-89 [17] – исходный ключ шифрования делится на фрагменты K0...Kn-1 (n – размер ключа шифрования в 16-битных словах), т.е.:
- K0...K7 для 128-битного ключа,
- K0...K11 для 192-битного ключа,
- K0...K15 для 256-битного ключа.
Затем фрагменты ключа используются в итерациях, а также в начальном и финальном преобразованиях согласно следующей таблице:
Применение | Используемый фрагмент ключа (в зависимости от его размера) | ||
128 бит | 192 бита | 256 бит | |
KS0 | K4 | K4 | K12 |
KS1 | K5 | K5 | K13 |
KS2 | K6 | K6 | K14 |
KS3 | K7 | K7 | K15 |
KF0 | K3 | K11 | K13 |
KF1 | K2 | K10 | K12 |
KF2 | K1 | K9 | K15 |
KF3 | K0 | K8 | K14 |
KRi | Ki mod n |
Символом i в таблице обозначен сквозной номер итерации (от 0 до 35), т.е. в итерациях фрагменты ключа используются поочередно в прямом порядке.
Криптостойкость алгоритма
Алгоритм NUSH не выбран во второй раунд конкурса [10] благодаря атаке, предложенной китайскими учеными Ву Венлинг (Wu Wenling) и Фенг Денггуо (Feng Dengguo) [16]. Найденная ими атака позволяет методом линейного криптоанализа вычислить 128-битный ключ шифрования алгоритма NUSH при наличии 258 известных открытых текстов (и соответствующих им шифртекстов) выполнением 2124 тестовых операций шифрования. При этом, при наличии 262 известных открытых текстов вычислительная сложность снижается до 255 тестовых операций шифрования. Аналогичные атаки существуют для 192- и 256-битных ключей.
Следует отметить, что данные атаки весьма сложно реализуемы на практике, однако их оказалось достаточно в качестве доказательства недостаточного запаса криптостойкости (security margin) [10] алгоритма NUSH.
- Biham E., Furman V. Differential Cryptanalysis of Nimbus. // http://www.cosic.esat.kuleuven.be. – November 29, 2000.
- Borisov N., Chew M., Johnson R., Wagner D. Multiplicative Differentials. // http://citeseer.ifi.unizh.ch. – University of California at Berkeley.
- Lebedev A.N., Volchkov A.A. NUSH. Cryptographic Algorithms Based upon the Block Cipher Called «NUSH». // http://www.cosic.esat.kuleuven.be. – LAN Crypto, Int., Moscow, Russia.
- Machado A.W. The Nimbus Cipher. // http://www.cosic.esat.kuleuven.be. – Gauss Informatica, Brazil.
- Ohkuma K., Sano F., Muratani H., Motoyama M., Kawamura S. Specification of Hierocrypt-L1. // http://www.cosic.esat.kuleuven.be. – Toshiba Corporation – September 25, 2000.
- Ohkuma K., Sano F., Muratani H., Motoyama M., Kawamura S. Specification on a Block Cipher: Hierocrypt-L1 (revised). // http://www.cosic.esat.kuleuven.be. – Toshiba Corporation – September, 2001.
- Preneel B., Biryukov A., Oswald E., Van Rompay B., Granboulan L., Dottax E., Murphy S., Dent A., White J., Dichtl M., Pyka S., Schafheutle M., Serf P., Biham E., Barkan E., Dunkelman O., Quisquater J-J., Ciet M., Sica F., Knudsen L., Parker M., Raddum H. NESSIE Public Report D20: NESSIE Security Report. // http://www.cosic.esat.kuleuven.be. – Version 2.0 – 19 February 2003.
- Preneel B., Bosselaers A., Ors S.B., Biryukov A., Granboulan L., Dottax E., Murphy S., Dent A., White J., Dichtl M., Pyka S., Serf P., Biham E., Barkan E., Dunkelman O., Ciet M., Sica F., Knudsen L., Raddum H. NESSIE Public Report D18: Update on the selection of algorithms for further investigation during the second round. // http://www.cosic.esat.kuleuven.be. – Version 1.0 – March 11, 2002.
- Preneel B., Van Rompay B., Granboulan L., Martinet G., Dichtl M., Schafheutle M., Serf P., Bibliovitz A., Biham E., Dunkelman O., Ciet M., Quisquater J-J., Sica F. NESSIE Public Report D14: Report on the Performance Evaluation of NESSIE Candidates I. // http://www.cosic.esat.kuleuven.be. – Version 3.3 – November 20, 2001.
- Preneel B., Van Rompay B., Granboulan L., Martinet G., Murphy S., Shipsey R., White J., Dichtl M., Serf P., Schafheutle M., Biham E., Dunkelman O., Ciet M., Quisquater J-J., Sica F., Knudsen L., Raddum H. NESSIE Phase I: Selection of Primitives. // http://www.cryptonessie.org. – 23 September 2001.
- Preneel B., Van Rompay B., Granboulan L., Martinet G., Murphy S., Shipsey R., White J., Dichtl M., Serf P., Schafheutle M., Biham E., Dunkelman O., Furman V., Ciet M., Quisquater J-J., Sica F., Knudsen L., Raddum H. NESSIE Public Report D13: Security Evaluation of NESSIE First Phase. // http://www.cosic.esat.kuleuven.be. – 23 September 2001.
- Stern J., Vaudenay S. CS-Cipher. // http://www.cosic.esat.kuleuven.be. – Ecole Normale Superieure.
- Van Rompay B. NESSIE Public Report D02: Report on the NESSIE Call. // http://www.cosic.esat.kuleuven.be.
- Van Rompay B. NESSIE Public Report D07: Response to the NESSIE Call. // http://www.cosic.esat.kuleuven.be.
- Vaudenay S. On the Security of CS-Cipher. // http://www.cosic.esat.kuleuven.be. – Ecole Normale Superieure.
- Wenling W., Dengguo F. Linear cryptanalysis of NUSH block cipher. // http://www.scichina.com – Chinese Academy of Sciences – 2002.
- ГОСТ 28147-89. Системы обработки информации. Защита криптографическая. Алгоритм криптографического преобразования. – М.: Госстандарт СССР, 1989.