Стандарт DES и конкурс AES
Алгоритм шифрования DES (Data Encryption Standard) [9] c 1977 года является стандартом симметричного шифрования США (кроме информации повышенной степени секретности). В течение последующих 20 лет «DES стойко выдержал 20 лет массового всемирного криптоанализа» [7] десятилетия криптоанализа (т.е. науки, посвященной поиску уязвимостей и, соответственно, взлому криптографических алгоритмов защиты информации) не привели к обнаружению серьезных уязвимостей в алгоритме (подробно о криптоанализе DES см. [18]).
Фактически, DES дал невиданный доселе толчок развитию криптоанализа. Вышли сотни трудов, посвященных различным методам криптоанализа именно в приложении к алгоритму DES, а также деталям самого алгоритма и их влиянию на криптостойкость DES. Можно утверждать, что именно благодаря DES появились целые направления криптоанализа. DES до сих пор считается сильным алгоритмом шифрования во всем, кроме размера ключа шифрования. 56-битный ключ DES явно недостаточен и при современных вычислительных ресурсах может быть вскрыт методом «грубой силы», т.е. перебором всех возможных вариантов ключа шифрования. Причем многие криптографы понимали это еще до принятия DES в качестве стандарта [22], а первые попытки увеличения размера ключа DES без изменения самого алгоритма начались уже в 1978 году (см. [18]). Однако, DES продолжал активно использоваться в качестве стандарта США.
Фактически, первые реальные шаги по замене стандарта шифрования были сделаны в 1997 году, когда Институт стандартов и технологий США NIST (National Institute of Standards and Technology, http://www.nist.gov) объявил о проведении открытого конкурса алгоритмов шифрования, победитель которого должен был стать новым стандартом симметричного шифрования США. В конкурсе могли принять участие любые организации или частные лица, в том числе находящиеся за пределами США. И действительно, список участников конкурса оказался весьма разнообразен; среди авторов алгоритмов-претендентов были:
- всемирно известные криптологи, например, интернациональный коллектив авторов алгоритма Serpent Росс Андерсон (Ross Anderson), Эли Бихам (Eli Biham) и Ларс Кнудсен (Lars Knudsen);
- организации, давно работающие в данной области и обладающие как богатым опытом разработки криптоалгоритмов, так и сильнейшими специалистами в данной области, например, американская фирма Counterpane автор алгоритма Twofish;
- всемирно известные корпорации, обладающие большим научным потенциалом, например немецкий телекоммуникационный гигант Deutsche Telekom с алгоритмом Magenta;
- образовательные учреждения, известные своими достижениями в области криптографии, например Католический Университет г. Лювен (Katholieke Universiteit Leuven), Бельгия, с алгоритмом Rijndael;
- и наоборот, организации, весьма малоизвестные до проведения конкурса AES, например, фирма Tecnologia Apropriada (автор алгоритма FROG) из латиноамериканского государства Коста-Рика.
NIST установил всего два обязательных требования к алгоритмам-участникам конкурса [4]:
- 128-битный размер блока шифруемых данных,
- не менее трех поддерживаемых алгоритмом размеров ключей шифрования: 128, 192 и 256 бит.
Однако, несравнимо больше было «рекомендательных» требований к будущему стандарту шифрования США. Поскольку соответствовать обязательным требованиям было достаточно просто, анализ алгоритмов и выбор из них лучшего производился именно по его соответствию «необязательным» характеристикам. «Пожелания» института NIST были, в частности, таковы [4]:
- Алгоритм должен быть стойким против криптоаналитических атак, известных на время проведения конкурса.
- Структура алгоритма должна быть ясной, простой и обоснованной, что, во-первых, облегчало бы изучение алгоритма специалистами, а во-вторых, гарантировало бы отсутствие внедренных авторами алгоритма «закладок» (т.е. в данном случае, особенностей архитектуры алгоритма, которыми теоретически могли бы воспользоваться его авторы в злоумышленных целях).
- Должны отсутствовать слабые и эквивалентные ключи (т.е. ключи, являющиеся различными, но приводящие к одному и тому же результату шифрования).
- Скорость шифрования данных должна быть высокой на всех потенциальных аппаратных платформах от 8-битных до 64-битных.
- Структура алгоритма должна позволять распараллеливание операций в многопроцессорных системах и аппаратных реализациях.
- Алгоритм должен предъявлять минимальные требования к оперативной и энергонезависимой памяти.
- Не должно быть ограничений для использования алгоритма; в частности, алгоритм не должен ограничивать свое использование в различных стандартных режимах работы (см. [10]), в качестве основы для построения хэш-функций (см. статью «Назначение и структура алгоритмов шифрования», содержащую классификацию криптографических алгоритмов и описание наиболее часто встречающихся структур алгоритмов шифрования), генераторов псевдослучайных последовательностей и т.д.
Эти требования оказались достаточно жесткими и частично противоречащими друг другу; каждый конкретный алгоритм из участвовавших в конкурсе представлял собой некий найденный авторами компромисс между соответствиями данным требованиям.
Заявки от участников конкурса NIST принимал в течение полутора лет, после чего все присланные на конкурс алгоритмы изучались и обсуждались как в самом институте NIST, так и всеми желающими. Стоит сказать, что в NIST пришло немало отзывов, все они находятся в открытом доступе и их можно посмотреть на web-сайте института (см. выше).
Всего в конкурсе приняли участие 15 алгоритмов шифрования [1, 13]:
Алгоритмы | Авторы или организация | Основные результаты анализа |
CAST-256 | Entrust Technologies, Inc. | В алгоритме не обнаружено уязвимостей. Однако, скорость шифрования у данного алгоритма невысока; кроме того, у него высокие требования к оперативной и энергонезависимой памяти. |
Crypton | Future Systems, Inc. | Алгоритм без явных недостатков. Однако, Crypton уступает по всем характеристикам похожему на него алгоритму Rijndael. Эксперты конкурса сочли, что в финале конкурса Crypton однозначно проиграет Rijndael, поэтому не выбрали его во второй раунд конкурса. |
DEAL | Richard Outerbridge, Lars Knudsen | Множество недостатков: наличие подмножеств слабых ключей, подверженность дифференциальному криптоанализу1 , отсутствие усиления при использовании 192-битных ключей по сравнению с 128-битными. |
DFC | CNRS Centre National pour la Recherche Scientifique Ecole Normale Superieure | Достоинство алгоритма: очень высокая скорость шифрования на 64-битных платформах. При этом алгоритм весьма медленно шифрует на остальных платформах, а также имеет классы слабых ключей. |
E2 | NTT Nippon Telegraph and Telephone Corporation | Аналогично алгоритму CAST-256, в E2 не найдено уязвимостей, но требования к энергонезависимой памяти слишком высоки. |
FROG | TecApro Internacional S.A. | Алгоритм с наиболее оригинальной структурой и с наибольшим количеством недостатков: наличие уязвимостей, низкая скорость шифрования и высокие требования к ресурсам. |
HPC | Richard Schroeppel | Аналогично алгоритму DFC, HPC очень быстро шифрует на 64-битных платформах, но весьма медленно на остальных. Кроме того, сложная и медленная процедура расширения ключа ограничивает возможные применения алгоритма, а наиболее сложная из всех представленных на конкурс алгоритмов структура раунда усложняет анализ алгоритма и делает недоказуемым отсутствие закладок. |
LOKI97 | Lawrie Brown, Josef Pieprzyk, Jennifer Seberry | Низкая скорость шифрования, высокие требования к ресурсам, наличие уязвимостей. |
Magenta | Deutsche Telekom AG | Алгоритм подвержен атакам методами линейного2 и дифференциального криптоанализа; медленная скорость шифрования. |
MARS | IBM | У алгоритма отсутствуют серьезные недостатки, за исключением низкой скорости шифрования на ряде платформ, не имеющих аппаратной поддержки требуемых операций и некоторых других незначительных недостатков. Алгоритм был незначительно модифицирован в течение первого раунда; измененный вариант вышел в финал конкурса. |
RC6 | RSA Laboratories | RC6 имеет весьма похожие на MARS проблемы с реализацией на некоторых платформах. Эксперты посчитали это незначительным недостатком алгоритм вышел в финал конкурса. |
Rijndael | Joan Daemen, Vincent Rijmen | Каких-либо недостатков у алгоритма не обнаружено; алгоритм вышел в финал конкурса. |
SAFER+ | Cylink Corporation | Алгоритм подвержен ряду атак и имеет низкую скорость выполнения. |
Serpent | Ross Anderson, Eli Biham, Lars Knudsen | Выявлены некоторые незначительные недостатки, алгоритм вышел в финал конкурса. |
Twofish | Bruce Schneier, John Kelsey, Doug Whiting, David Wagner, Chris Hall, Niels Ferguson | Из недостатков эксперты отметили сложность алгоритма, затрудняющую его анализ. Алгоритм вышел в финал конкурса. |
В результате первого этапа конкурса были выбраны 5 алгоритмов без явно выраженных недостатков: MARS, RC6, Rijndael, Serpent и Twofish. Началось детальное изучение именно этих алгоритмов (что называлось «вторым этапом» или «финалом» конкурса AES), продолжавшееся еще год с небольшим. В результате победителем конкурса стал алгоритм Rijndael; ему было присвоено название AES, под именем которого он уже достаточно широко реализован и, видимо, по широте распространения обойдет своего предшественника алгоритм DES.
Стоит сказать, что алгоритму Rijndael посвящено уже множество статей и разделов книг (например, [20, 21]), поэтому рассмотрим здесь подробно другие алгоритмы, вышедшие в финал, а к алгоритму Rijndael, возможно, вернемся в одной из следующих статей.Алгоритм Serpent
Как было сказано выше, алгоритм Serpent разработан тремя известнейшими криптологами: Россом Андерсоном, Эли Бихамом и Ларсом Кнудсеном. Каждый из них знаменит своими криптоаналитическими работами, а также разработанными ранее алгоритмами шифрования (например, широкую известность получили алгоритмы Bear и Leon, разработанные Андерсоном и Бихамом [2]; не менее известен алгоритм Square, разработанный авторами алгоритма Rijndael Джоан Деймен (Joan Daemen) и Винсентом Риджменом (Vincent Rijmen) при участии Ларса Кнудсена [8]). Именно Эли Бихама без преувеличения можно назвать величайшим криптоаналитиком современности его авторству (часто в соавторстве с другими специалистами) принадлежит множество работ, посвященных методам вскрытия различных известных алгоритмов шифрования.
Еще до конкурса AES появился алгоритм Serpent-0, отличающийся от присланного на конкурс алгоритма Serpent-1 (или просто Serpent) только тем, что в нем были использованы таблицы замен алгоритма DES (в незначительно модифицированном виде). В Serpent используются уже оригинальные таблицы замен, которые, по словам авторов [3], вкупе с незначительным изменением процедуры расширения ключа усилили алгоритм против дифференциального и линейного криптоанализа.
Рассмотрим здесь именно тот алгоритм Serpent, который был прислан на конкурс AES и стал одним из его финалистов.
Структура алгоритма
Serpent представляет собой SP-сеть, в которой блок данных в процессе шифрования разбивается на 4 субблока по 32 бита (см. рис. 1) [3].
Алгоритм выполняет 32 раунда преобразований; перед первым раундом выполняется начальная перестановка IP, после заключительного раунда финальная перестановка FP. Начальная перестановка определена следующим образом:
0 | 32 | 64 | 96 | 1 | 33 | 65 | 97 | 2 | 34 | 66 | 98 | 3 | 35 | 67 | 99 |
4 | 36 | 68 | 100 | 5 | 37 | 69 | 101 | 6 | 38 | 70 | 102 | 7 | 39 | 71 | 103 |
8 | 40 | 72 | 104 | 9 | 41 | 73 | 105 | 10 | 42 | 74 | 106 | 11 | 43 | 75 | 107 |
12 | 44 | 76 | 108 | 13 | 45 | 77 | 109 | 14 | 46 | 78 | 110 | 15 | 47 | 79 | 111 |
16 | 48 | 80 | 112 | 17 | 49 | 81 | 113 | 18 | 50 | 82 | 114 | 19 | 51 | 83 | 115 |
20 | 52 | 84 | 116 | 21 | 53 | 85 | 117 | 22 | 54 | 86 | 118 | 23 | 55 | 87 | 119 |
24 | 56 | 88 | 120 | 25 | 57 | 89 | 121 | 26 | 58 | 90 | 122 | 27 | 59 | 91 | 123 |
28 | 60 | 92 | 124 | 29 | 61 | 93 | 125 | 30 | 62 | 94 | 126 | 31 | 63 | 95 | 127 |
Это означает, что бит 0 остается на своем месте, бит 32 входного значения становится битом 1, бит 64 битом 2 и т.д.
Финальная перестановка является инверсной начальной перестановке и выглядит так:
0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 |
64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |
1 | 5 | 9 | 13 | 17 | 21 | 25 | 29 | 33 | 37 | 41 | 45 | 49 | 53 | 57 | 61 |
65 | 69 | 73 | 77 | 81 | 85 | 89 | 93 | 97 | 101 | 105 | 109 | 113 | 117 | 121 | 125 |
2 | 6 | 10 | 14 | 18 | 22 | 26 | 30 | 34 | 38 | 42 | 46 | 50 | 54 | 58 | 62 |
66 | 70 | 74 | 78 | 82 | 86 | 90 | 94 | 98 | 102 | 106 | 110 | 114 | 118 | 122 | 126 |
3 | 7 | 11 | 15 | 19 | 23 | 27 | 31 | 35 | 39 | 43 | 47 | 51 | 55 | 59 | 63 |
67 | 71 | 75 | 79 | 83 | 87 | 91 | 95 | 99 | 103 | 107 | 111 | 115 | 119 | 123 | 127 |
Функция раунда весьма проста и состоит из следующих операций:
- Наложение 128-битного ключа раунда побитовой логической операцией «исключающее или» (XOR).
- Табличная замена. Обрабатываемый 128-битный блок данных разбивается на 32 фрагмента по 4 бита, над каждым из которых выполняется табличная замена 4 * 4 бит. Полученный результат объединяется обратно в 128-битный блок.
В каждом раунде используется одна и та же таблица; всего же в алгоритме определены 8 таблиц замен S0...S7, которые циклически используются в 32 раундах шифрования:
S0 3 8 15 1 10 6 5 11 14 13 4 2 7 0 9 12 S1 15 12 2 7 9 0 5 10 1 11 14 8 6 13 3 4 S2 8 6 7 9 3 12 10 15 13 1 14 4 0 11 5 2 S3 0 15 11 8 12 9 6 3 13 1 2 4 10 7 5 14 S4 1 15 8 3 12 0 11 6 2 5 4 10 9 14 7 13 S5 15 5 2 11 4 10 9 12 0 3 14 8 13 6 7 1 S6 7 2 12 5 8 4 6 11 14 9 1 15 13 3 10 0 S7 1 13 15 0 14 8 2 11 7 4 12 10 9 3 5 6 Ячейки таблицы содержат выходные значения; входное значение определяет требуемый номер столбца. Например, таблица S0 меняет 0 на 3, 1 на 8 и т.д.
Таблицы замен алгоритма Serpent определенным образом сгенерированы из таблиц алгоритма DES. В спецификации алгоритма [3] приведен псевдокод, использованный для генерации таблиц S0...S7.
- Линейное преобразование блока данных, которое определяется следующей таблицей:
16, 52, 56, 70, 83, 94, 105 | 72, 114, 125 | 2, 9, 15, 30, 76, 84, 126 | 36, 90, 103 |
20, 56, 60, 74, 87, 98, 109 | 1, 76, 118 | 2, 6, 13, 19, 34, 80, 88 | 40, 94, 107 |
24, 60, 64, 78, 91, 102, 113 | 5, 80, 122 | 6, 10, 17, 23, 38, 84, 92 | 44, 98, 111 |
28, 64, 68, 82, 95, 106, 117 | 9, 84, 126 | 10, 14, 21, 27, 42, 88, 96 | 48, 102, 115 |
32, 68, 72, 86, 99, 110, 121 | 2, 13, 88 | 14, 18, 25, 31, 46, 92, 100 | 52, 106, 119 |
36, 72, 76, 90, 103, 114, 125 | 6, 17, 92 | 18, 22, 29, 35, 50, 96, 104 | 56, 110, 123 |
1, 40, 76, 80, 94, 107, 118 | 10, 21, 96 | 22, 26, 33, 39, 54, 100, 108 | 60, 114, 127 |
5, 44, 80, 84, 98, 111, 122 | 14, 25, 100 | 26, 30, 37, 43, 58, 104, 112 | 3, 118 |
9, 48, 84, 88, 102, 115, 126 | 18, 29, 104 | 30, 34, 41, 47, 62, 108, 116 | 7, 122 |
2, 13, 52, 88, 92, 106, 119 | 22, 33, 108 | 34, 38, 45, 51, 66, 112, 120 | 11, 126 |
6, 17, 56, 92, 96, 110, 123 | 26, 37, 112 | 38, 42, 49, 55, 70, 116, 124 | 2, 15, 76 |
10, 21, 60, 96, 100, 114, 127 | 30, 41, 116 | 0, 42, 46, 53, 59, 74, 120 | 6, 19, 80 |
3, 14, 25, 100, 104, 118 | 34, 45, 120 | 4, 46, 50, 57, 63, 78, 124 | 10, 23, 84 |
7, 18, 29, 104, 108, 122 | 38, 49, 124 | 0, 8, 50, 54, 61, 67, 82 | 14, 27, 88 |
11, 22, 33, 108, 112, 126 | 0, 42, 53 | 4, 12, 54, 58, 65, 71, 86 | 18, 31, 92 |
2, 15, 26, 37, 76, 112, 116 | 4, 46, 57 | 8, 16, 58, 62, 69, 75, 90 | 22, 35, 96 |
6, 19, 30, 41, 80, 116, 120 | 8, 50, 61 | 12, 20, 62, 66, 73, 79, 94 | 26, 39, 100 |
10, 23, 34, 45, 84, 120, 124 | 12, 54, 65 | 16, 24, 66, 70, 77, 83, 98 | 30, 43, 104 |
0, 14, 27, 38, 49, 88, 124 | 16, 58, 69 | 20, 28, 70, 74, 81, 87, 102 | 34, 47, 108 |
0, 4, 18, 31, 42, 53, 92 | 20, 62, 73 | 24, 32, 74, 78, 85, 91, 106 | 38, 51, 112 |
4, 8, 22, 35, 46, 57, 96 | 24, 66, 77 | 28, 36, 78, 82, 89, 95, 110 | 42, 55, 116 |
8, 12, 26, 39, 50, 61, 100 | 28, 70, 81 | 32, 40, 82, 86, 93, 99, 114 | 46, 59, 120 |
12, 16, 30, 43, 54, 65, 104 | 32, 74, 85 | 36, 90, 103, 118 | 50, 63, 124 |
16, 20, 34, 47, 58, 69, 108 | 36, 78, 89 | 40, 94, 107, 122 | 0, 54, 67 |
20, 24, 38, 51, 62, 73, 112 | 40, 82, 93 | 44, 98, 111, 126 | 4, 58, 71 |
24, 28, 42, 55, 66, 77, 116 | 44, 86, 97 | 2, 48, 102, 115 | 8, 62, 75 |
28, 32, 46, 59, 70, 81, 120 | 48, 90, 101 | 6, 52, 106, 119 | 12, 66, 79 |
32, 36, 50, 63, 74, 85, 124 | 52, 94, 105 | 10, 56, 110, 123 | 16, 70, 83 |
0, 36, 40, 54, 67, 78, 89 | 56, 98, 109 | 14, 60, 114, 127 | 20, 74, 87 |
4, 40, 44, 58, 71, 82, 93 | 60, 102, 113 | 3, 18, 72, 114, 118, 125 | 24, 78, 91 |
8, 44, 48, 62, 75, 86, 97 | 64, 106, 117 | 1, 7, 22, 76, 118, 122 | 28, 82, 95 |
12, 48, 52, 66, 79, 90, 101 | 68, 110, 121 | 5, 11, 26, 80, 122, 126 | 32, 86, 99 |
Каждая ячейка таблицы соответствует биту выходного значения (от 0 до 127); в ячейке перечислены входные биты, XOR которых дает выходное значение. Например:
Y1 = X72 Å X114 Å X125 и т.д.,
Линейное преобразование может быть реализовано как в виде приведенной таблицы, так и с помощью следующих вычислений (см. рис. 2):
W2 = W2 <<< 3,
W1 = W1 Å W0 Å W2,
W3 = W3 Å W2 Å (W0 << 3),
W1 = W1 <<< 1,
W3 = W3 <<< 7,
W0 = W0 Å W1 Å W3,
W2 = W2 Å W3 Å (W1 << 7),
W0 = W0 <<< 5,
W2 = W2 <<< 22,
где Wn n-е 32-битное слово обрабатываемого блока,
<< и <<< соответственно, операции сдвига и циклического сдвига влево на указанное число бит. Основным критерием при разработке линейного преобразования было максимальное ускорение влияния каждого бита входного значения и ключа шифрования на каждый бит шифртекста. Как пишут авторы алгоритма [3], такое влияние достигается уже после трех раундов алгоритма Serpent.
Таким образом, преобразования, выполняемые в каждом раунде алгоритма, можно представить следующей формулой:
i номер раунда (от 0 до 31),
Ki ключ i-го раунда,
L линейное преобразование,
а символом S’ обозначено параллельное использование 32 соответствующих таблиц замен.
Последний раунд отличается от предыдущих тем, что вместо линейного преобразования в нем выполняется дополнительное наложение ключа; здесь используется 33-й фрагмент расширенного ключа K32:
Расшифрование
Расшифрование производится выполнением обратных операций в обратной последовательности. В частности, вместо таблиц замен S0...S7 применяются в обратной последовательности инверсные таблицы замен InvS0...InvS7:
InvS0 | 13 | 3 | 11 | 0 | 10 | 6 | 5 | 12 | 1 | 14 | 4 | 7 | 15 | 9 | 8 | 2 |
InvS1 | 5 | 8 | 2 | 14 | 15 | 6 | 12 | 3 | 11 | 4 | 7 | 9 | 1 | 13 | 10 | 0 |
InvS2 | 12 | 9 | 15 | 4 | 11 | 14 | 1 | 2 | 0 | 3 | 6 | 13 | 5 | 8 | 10 | 7 |
InvS3 | 0 | 9 | 10 | 7 | 11 | 14 | 6 | 13 | 3 | 5 | 12 | 2 | 4 | 8 | 15 | 1 |
InvS4 | 5 | 0 | 8 | 3 | 10 | 9 | 7 | 14 | 2 | 12 | 11 | 6 | 4 | 15 | 13 | 1 |
InvS5 | 8 | 15 | 2 | 9 | 4 | 1 | 13 | 14 | 11 | 6 | 5 | 3 | 7 | 12 | 10 | 0 |
InvS6 | 15 | 10 | 1 | 13 | 5 | 3 | 6 | 0 | 4 | 9 | 14 | 7 | 2 | 12 | 8 | 11 |
InvS7 | 3 | 0 | 6 | 13 | 9 | 14 | 15 | 8 | 5 | 12 | 11 | 7 | 10 | 1 | 4 | 2 |
Аналогичным образом вместо «прямого» линейного преобразования используется обратное, которое определяется следующей таблицей (принцип действия обратного преобразования аналогичен прямому и описан выше):
53, 55, 72 | 1, 5, 20, 90 | 15, 102 | 3, 31, 90 |
57, 59, 76 | 5, 9, 24, 94 | 19, 106 | 7, 35, 94 |
61, 63, 80 | 9, 13, 28, 98 | 23, 110 | 11, 39, 98 |
65, 67, 84 | 13, 17, 32, 102 | 27, 114 | 1, 3, 15, 20, 43, 102 |
69, 71, 88 | 17, 21, 36, 106 | 1, 31, 118 | 5, 7, 19, 24, 47, 106 |
73, 75, 92 | 21, 25, 40, 110 | 5, 35, 122 | 9, 11, 23, 28, 51, 110 |
77, 79, 96 | 25, 29, 44, 114 | 9, 39, 126 | 13, 15, 27, 32, 55, 114 |
81, 83, 100 | 1, 29, 33, 48, 118 | 2, 13, 43 | 1, 17, 19, 31, 36, 59, 118 |
85, 87, 104 | 5, 33, 37, 52, 122 | 6, 17, 47 | 5, 21, 23, 35, 40, 63, 122 |
89, 91, 108 | 9, 37, 41, 56, 126 | 10, 21, 51 | 9, 25, 27, 39, 44, 67, 126 |
93, 95, 112 | 2, 13, 41, 45, 60 | 14, 25, 55 | 2, 13, 29, 31, 43, 48, 71 |
97, 99, 116 | 6, 17, 45, 49, 64 | 18, 29, 59 | 6, 17, 33, 35, 47, 52, 75 |
101, 103, 120 | 10, 21, 49, 53, 68 | 22, 33, 63 | 10, 21, 37, 39, 51, 56, 79 |
105, 107, 124 | 14, 25, 53, 57, 72 | 26, 37, 67 | 14, 25, 41, 43, 55, 60, 83 |
0, 109, 111 | 18, 29, 57, 61, 76 | 30, 41, 71 | 18, 29, 45, 47, 59, 64, 87 |
4, 113, 115 | 22, 33, 61, 65, 80 | 34, 45, 75 | 22, 33, 49, 51, 63, 68, 91 |
8, 117, 119 | 26, 37, 65, 69, 84 | 38, 49, 79 | 26, 37, 53, 55, 67, 72, 95 |
12, 121, 123 | 30, 41, 69, 73, 88 | 42, 53, 83 | 30, 41, 57, 59, 71, 76, 99 |
16, 125, 127 | 34, 45, 73, 77, 92 | 46, 57, 87 | 34, 45, 61, 63, 75, 80, 103 |
1, 3, 20 | 38, 49, 77, 81, 96 | 50, 61, 91 | 38, 49, 65, 67, 79, 84, 107 |
5, 7, 24 | 42, 53, 81, 85, 100 | 54, 65, 95 | 42, 53, 69, 71, 83, 88, 111 |
9, 11, 28 | 46, 57, 85, 89, 104 | 58, 69, 99 | 46, 57, 73, 75, 87, 92, 115 |
13, 15, 32 | 50, 61, 89, 93, 108 | 62, 73, 103 | 50, 61, 77, 79, 91, 96, 119 |
17, 19, 36 | 54, 65, 93, 97, 112 | 66, 77, 107 | 54, 65, 81, 83, 95, 100, 123 |
21, 23, 40 | 58, 69, 97, 101, 116 | 70, 81, 111 | 58, 69, 85, 87, 99, 104, 127 |
25, 27, 44 | 62, 73, 101, 105, 120 | 74, 85, 115 | 3, 62, 73, 89, 91, 103, 108 |
29, 31, 48 | 66, 77, 105, 109, 124 | 78, 89, 119 | 7, 66, 77, 93, 95, 107, 112 |
33, 35, 52 | 0, 70, 81, 109, 113 | 82, 93, 123 | 11, 70, 81, 97, 99, 111, 116 |
37, 39, 56 | 4, 74, 85, 113, 117 | 86, 97, 127 | 15, 74, 85, 101, 103, 115, 120 |
41, 43, 60 | 8, 78, 89, 117, 121 | 3, 90 | 19, 78, 89, 105, 107, 119, 124 |
45, 47, 64 | 12, 82, 93, 121, 125 | 7, 94 | 0, 23, 82, 93, 109, 111, 123 |
49, 51, 68 | 1, 16, 86, 97, 125 | 11, 98 | 4, 27, 86, 97, 113, 115, 127 |
Процедура расширения ключа
Согласно требованиям конкурса AES, Serpent поддерживает три размера ключа шифрования: 128, 192 и 256 бит. Однако, фактически, ключ алгоритма Serpent может иметь произвольный размер, меньший 256. Такой «неполный» ключ перед выполнением его расширения дополняется по следующему правилу:
- Ключ дополняется одним единичным битом справа.
- Затем ключ дополняется справа нулевыми битами до достижения 256-битного размера.
Только после этого производится процедура расширения ключа, состоящая из следующих шагов:
- 256-битный дополненный (при необходимости) ключ шифрования представляется в виде 8 32-битных слов, обозначаемых w-8...w-1.
- Данные слова используются в качестве исходных значений для вычисления промежуточного ключа последовательности w0...w131:wi = (wi-8 Å wi-5 Å wi-3 Å wi-1 Å f Å i) <<< 11,где f округленная дробная часть золотого сечения (√5 + 1) / 2, т.е. 9E3779B9 в шестнадцатеричной записи.
- Вычисляются ключи раунда с использованием таблиц замен S0...S7 (аналогично описанному выше их использованию в алгоритме Serpent):K0 = S3({w0, w1, w2, w3}),
K1 = S2({w4, w5, w6, w7}),
K2 = S1({w8, w9, w10, w11}),
K3 = S0({w12, w13, w14, w15}),
K4 = S7({w16, w17, w18, w19}),
K5 = S6({w20, w21, w22, w23}),
K6 = S5({w24, w25, w26, w27}),
K7 = S4({w28, w29, w30, w31}),
...
K31 = S4({w124, w125, w126, w127}),
K32 = S3({w128, w129, w130, w131}).
Криптостойкость алгоритма
В процессе исследований эксперты не обнаружили каких-либо криптоаналитических атак на полнораундовую версию алгоритма Serpent. Это справедливо и в отношении остальных алгоритмов-финалистов. Однако, данные алгоритмы значительно различаются по своим характеристикам см. раздел «Достоинства и недостатки алгоритмов-финалистов» во второй части этой статьи.Алгоритм Twofish
Аналогично алгоритму Serpent, Twofish разработан коллективом известных криптологов под руководством Брюса Шнайера (Bruce Schneier) автора множества работ в области криптологии (в т. ч. известнейшей книги [22]), разработчика известного алгоритма шифрования Blowfish [15] и основателя американской компании Counterpane Systems, являющейся одним из мировых лидеров в области разработки средств криптографической защиты информации. Кроме него, в разработке алгоритма принимали участие Джон Келси (John Kelsey), Крис Холл (Chris Hall) и Нильс Фергюсон (Niels Ferguson) из той же компании Counterpane Systems, а также Дуг Уайтинг (Doug Whiting) из Hifn Incorporated (разработка аппаратных средств защиты Internet-коммуникаций) и Дэвид Вагнер (David Wagner) из Университета штата Калифорния.
Структура алгоритма
Twofish разбивает шифруемые данные на четыре 32-битных субблока (обозначим их A, B, C, D), над которыми производится 16 раундов преобразований, в каждом из которых выполняются следующие операции (см. рис. 3) [16]:
Щёлкните по картинке чтобы увеличить.
- Содержимое субблока B циклически сдвигается влево на 8 бит.
- Субблок A обрабатывается операцией g(), которая будет подробно описана ниже.
- Субблок B также обрабатывается операцией g().
- Субблок B накладывается на A с помощью сложения по модулю 232, после чего аналогичным образом выполняется наложение субблока A на субблок B.
- Фрагмент расширенного ключа K2r+8 (где r номер текущего раунда, начиная с 0) складывается с субблоком A по модулю 232.
- Аналогично предыдущему шагу, K2r+9 накладывается на субблок B.
- Субблок A накладывается на C операцией XOR.
- Содержимое субблока D циклически сдвигается влево на 1 бит.
- Субблок B накладывается на D операцией XOR.
- Содержимое субблока C циклически сдвигается вправо на 1 бит.
A = g(A),
B = g(B),
A = A + B mod 232,
B = A + B mod 232,
A = A + K2r+8 mod 232,
B = B + K2r+9 mod 232,
C = C Å A,
D = D <<< 1,
D = D Å B,
C = C >>> 1.
Операция g() обрабатывает 32-битных входной субблок выполнением перечисленных ниже шагов (см. рис. 4):
- Субблок делится на 4 фрагмента по 8 бит каждый.
- Фрагменты прогоняются через таблицы замен 8 * 8 бит S0...S3. Таблицы замен вычисляются динамически и зависят от ключа шифрования; алгоритм построения таблиц замен будет подробно описан ниже.
- Результат замен (обозначим его s0...s3) умножается на фиксированную матрицу M1:
где g0...g3 байты выходного значения функции g().
Умножение выполняется в конечном поле GF(28) с образующим полиномом x8 + x6 + x5 + x3 + 1.
Матрица M1 определена следующим образом (здесь и далее в таблицах указаны шестнадцатеричные значения):01 EF 5B 5B 5B EF EF 01 EF 5B 01 EF EF 01 EF 5B
В конце каждого раунда, за исключением последнего, субблоки A (значение до описанной выше обработки) и C меняются местами; субблоки B (значение до обработки) и D также меняются местами.
Перед первым раундом выполняется входное отбеливание наложение операцией XOR на обрабатываемые субблоки четырех фрагментов расширенного ключа K0...K3. Аналогично выполняется выходное отбеливание после последнего раунда с использованием подключей K4...K7.
Как видно, алгоритм Twofish имеет существенно более сложную структуру, чем Serpent, что компенсируется вдвое меньшим количеством раундов.
Процедура расширения ключа
Процедура расширения ключа формирует 40 32-битных подключей для использования в 16 раундах алгоритма и для выполнения операций отбеливания. Кроме того, на основе ключа шифрования вычисляются таблицы замен S0...S3.
Аналогично алгоритму Serpent, Twofish использует ключи шифрования любого размера до 256 бит включительно. Однако, дополнение ключа выполняется несколько иначе: исходный ключ, при необходимости, дополняется нулевыми битами до ближайшего стандартного размера, т.е. до 128, 192 или 256 бит. Процедура расширения ключа обрабатывает дополненный таким образом ключ.
Сначала выполняется предварительная обработка ключа, включающая в себя следующие шаги:
- Выполняется инициализация переменных, участвующих в дальнейших расчетах: k = N / 64,где N размер дополненного ключа шифрования в битах, т.е. k принимает значение 2, 3 или 4. Ключ шифрования представляется в виде 8k байт m0...m8k-1 или в виде 2k 32-битных слов, обозначаемых как M0...M2k-1.
- Формируются 3 массива, каждый из которых состоит из k 32-битных слов:Me = (M0, M2, ..., M2k-2),
Mo = (M1, M3, ..., M2k-1),
V = (Vk-1, Vk-2, ..., V0),где:
Матрица M2 определена следующим образом:
01 A4 55 87 5A 58 DB 9E A4 56 82 F3 1E C6 68 E5 02 A1 FC C1 47 AE 3D 19 A4 55 87 5A 58 DB 9E 03
Генерация подключей k0...k39 производится на основе вычисленных на предварительном этапе массивов Me и Mo следующим образом:
k2i+1 = (Ai + 2Bi mod 232) <<< 9,
где i = 0...19, а Ai и Bi промежуточные величины, вычисляемые так:
Bi = h((2i + 1)ρ, Mo) <<< 8.
Константа ρ определена следующим образом:
а функция h() заслуживает подробного описания.
Данная функция схематично представлена на рис. 5.
Она выполняется в несколько шагов, состав которых зависит от размера дополненного ключа в 64-битных фрагментах, т.е. от описанного выше значения k. В качестве параметров функция h() принимает 32-битное слово и массив 32-битных слов размерностью k. Последовательность выполнения такова:
- Входное слово делится на 4 8-битных фрагмента, которые прогоняются через специфические операции замены q0 и q1 (как показано на рис. 5). Результат замены объединяется в 32-битное слово, которое складывается с третьим словом входного массива (на рис. 5 в качестве входного массива показан массив Me). Данный шаг не выполняется, если k < 4 (т.е. k = 2 или k = 3). На рис. 5 показаны все возможные шаги функции h().
- Результат предыдущего шага или входное слово обрабатывается аналогичным образом (с другой последовательностью применения q0 и q1, которая является различной для каждого шага см. рис. 5), но складывается со вторым словом входного массива. Шаг 2 не выполняется, если k = 2.
- и
- выполняются всегда и подразумевают обработку результата предыдущего шага (или входного слова для шага 3 и k = 2), аналогичную предыдущим шагам с использованием, соответственно, первого и нулевого слов входного массива.
- Как и на предыдущих шагах, применяются замены q0 и q1, после чего выполняется следующее преобразование:
где y0...y3 байты результата выполнения замен на шаге 5, а матрица M1 была описана выше; H выходное значение функции h().
Операции q0 и q1 представляют собой не табличные замены 8 * 8 бит, а вычисляют выходные значения с использованием нескольких таблиц замен 4 * 4 следующим образом:
b0 = x mod 16,
a1 = a0 Å b0,
b1 = a0 Å (b0 >>>41) Å 8a0 mod 16,
a2 = t0(a1),
b2 = t1(b1),
a3 = a2 Å b2,
b3 = a2 Å (b2 >>>41) Å 8a2 mod 16,
a4 = t2(a3),
b4 = t3(b3),
y = 16b4 + a4,
где x входное значение,
y выходное значение,
>>>4 операция циклического вращения вправо 4-битных величин, т.е. раздельное вращение каждого нибла обрабатываемого байта;
ti табличные замены, различные для q0 и q1; для q0 таблицы выглядят так:
t0 | 8 | 1 | 7 | D | 6 | F | 3 | 2 | 0 | B | 5 | 9 | E | C | A | 4 |
t1 | E | C | B | 8 | 1 | 2 | 3 | 5 | F | 4 | A | 6 | 7 | 0 | 9 | D |
t2 | B | A | 5 | E | 6 | D | 9 | 0 | C | 8 | F | 3 | 2 | 4 | 7 | 1 |
t3 | D | 7 | F | 4 | 1 | 2 | 6 | E | 9 | B | 3 | 0 | 8 | 5 | C | A |
Выходное значение таблицы берется из позиции, соответствующей входному значению; например, t1 заменяет 0 на E, 1 на C и т.д.
Таблицы для q1 определены следующим образом:
t0 | 2 | 8 | B | D | F | 7 | 6 | E | 3 | 1 | 9 | 4 | 0 | A | C | 5 |
t1 | 1 | E | 2 | B | 4 | C | 3 | 7 | 6 | D | A | 5 | F | 9 | 0 | 8 |
t2 | 4 | C | 7 | 5 | 1 | 6 | 9 | A | 0 | E | D | 8 | 2 | B | 3 | F |
t3 | B | 9 | 5 | 1 | C | 3 | D | E | 6 | 4 | 7 | F | 2 | 0 | 8 | A |
Осталось описать зависимость от ключа таблиц замен S0...S3. Фактически, в алгоритме шифрования вместо описанной выше функции g() используется функция h(), использующая в качестве входного значения 32-битный субблок A или B, а в качестве входного массива описанный ранее массив V. Таким образом, замена выполняется на основе тех же таблиц t0...t3, которые используются в процедуре расширения ключа.
Видно, что процедура расширения ключа является сложной и занимает несравнимо больше времени, чем шифрование одного блока данных. Авторы алгоритма в его спецификации [16] описали несколько возможных вариантов оптимизации процедуры расширения ключа, один из которых можно выбрать в конкретной реализации алгоритма, исходя из следующих параметров:
- доступных объемов энергонезависимой и оперативной памяти,
- предполагаемой частоты смены ключа при шифровании данных,
- требований к скорости шифрования блоков данных.
Общий принцип оптимизации состоит в поисках требуемого компромисса между скоростью шифрования и временем выполнения процедуры расширения ключа: чем быстрее нужно шифровать, тем дольше будет выполняться расширение ключа, и наоборот.
Twofish-FK
Помимо описанного выше «стандартного» варианта алгоритма Twofish, авторы предложили еще и Twofish Family Key (или Twofish-FK) шаблон для формирования на основе Twofish вариантов алгоритма, несовместимых между собой и предназначенных, таким образом, для ограниченных применений, например, в рамках конкретных организаций для защиты внутреннего документооборота.
Несовместимость вариантов достигается путем применения дополнительного ключа (FK), константного для всех субъектов, применяющих конкретный из вариантов алгоритма Twofish-FK. Т.е. конкретное значение используемого FK формирует некий «контур совместимости» криптосредств, реализующих Twofish-FK.
Дополнительный ключ FK «подмешивается» на этапе расширения ключа следующим образом:
- Инициализируются переменные, используемые в дальнейших операциях (данный шаг выполняется однократно для конкретного FK):T0 = FK,
T1 = (EFK(0) | EFK(1)) Å FK,
T2 = EFK(2),
T3 = EFK(3),
T4 = EFK(4) mod 264,где EFK(N) результат зашифрования алгоритмом Twofish на ключе FK 128-битного блока, первый байт которого содержит значение N, а остальные байты обнулены,
| операция конкатенации.Стоит отметить, что переменные T0 и T1 имеют размерность 256 бит, T2 и T3 по 128 бит, а T4 64 бита.
- Наложение ключа FK, выполняется однократно для каждого ключа шифрования, используемого совместно с данным FK:
- Перед выполнением процедуры расширения ключа шифрования выполняется наложение T0 на ключ шифрования операцией XOR. Если ключ шифрования имеет размер, меньший 256 бит, то используется необходимое количество бит T0.
- После выполнения процедуры расширения ключа операциями XOR T2 накладывается на подключи K0...K3, T3 на подключи K4...K7, а T4 на каждую пару подключей, используемых в раундах шифрования.
- Перед использованием табличных замен выполняется наложение операцией XOR требуемого количества бит T1 на ключ шифрования.
Криптостойкость алгоритмов, построенных на основе Twofish-FK, по словам авторов алгоритма, полностью эквивалентна криптостойкости стандартного Twofish, поскольку подобное наложение дополнительного ключа никак не влияет на основные параметры алгоритма [16].Литература, источники
- AES Round 1 Information. // http://csrc.nist.gov January 26, 2001.
- Anderson R., Biham E. Two Practical and Provably Secure Block Ciphers: BEAR and LION. // http://citeseer.ist.psu.edu 1995.
- Anderson R., Biham E., Knudsen L. Serpent: A Proposal for the Advanced Encryption Standard. // http://csrc.nist.gov.
- Announcing Request for Candidate Algorithm Nominations for the Advanced Encryption Standard (AES). // http://csrc.nist.gov Department of Commerce National Institute of Standards and Technology Federal Register: September 12, 1997.
- Biham E., Dunkelman O., Keller N. Differential-Linear Cryptanalysis of Serpent. // http://citeseer.ist.psu.edu Technion, Haifa, Israel.
- Burwick C., Coppersmith D., D’Avignon E., Gennaro R., Halevi S., Jutla C., Matyas S.M.Jr., O’Connor L., Peyravian M., Safford D., Zunic N. MARS a candidate cipher for AES. // http://www.ibm.com IBM Corporation Revised, September, 22 1999.
- Courtois N., Castagnos G., Goubin L. What do DES S-boxes Say to Each Other? // http://eprint.iacr.org Axalto Cryptographic Research & Advanced Security, Cedex, France.
- Daemen J., Knudsen L., Rijmen V. The Block Cipher Square. // http://www.esat.kuleuven.ac.be.
- FIPS 46-3. Data Encryption Standard (DES). // http://csrc.nist.gov Reaffirmed 1999 October 25.
- FIPS 81. DES Modes of Operation. // http://csrc.nist.gov 1980 December 2.
- Kocher P.C. Timing Attacks on Implementations of Diffie-Hellman, RSA, DSS, and Other Systems. // http://citeseer.ist.psu.edu Cryptography Research, Inc., San Francisco, USA.
- Nechvatal J., Barker E., Bassham L., Burr W., Dworkin M., Foti J., Roback E. Report on the Development of the Advanced Encryption Standard (AES). // http://csrc.nist.gov National Institute of Standards and Technology.
- Nechvatal J., Barker E., Dodson D., Dworkin M., Foti J., Roback E. Status report on the first round of the development of the advanced encryption standard. // http://csrc.nist.gov National Institute of Standards and Technology.
- Rivest R.L., Robshaw M.J.B., Sidney R., Lin Y.L. The RC6 Block Cipher. // http://www.rsasecurity.com Version 1.1 August 20, 1998.
- Schneier B. Description of a new variable-length key 64-bit block cipher (blowfish). // http://www.schneier.com.
- Schneier B., Kelsey J., Whiting D., Wagner D., Hall C., Ferguson N. Twofish: A 128-bit Block Cipher. // http://www.schneier.com 15 June 1998.
- What are RC5 and RC6? // http://www.rsasecurity.com.
- Панасенко С. Алгоритм шифрования DES и его варианты. // Connect! Мир связи. 2006 №№ 3-6.
- Панасенко С. Интересные алгоритмы шифрования, часть 2. // BYTE/Россия. 2006 № 5 с. 74-79.
- Панасенко С.П., Батура В.П. Основы криптографии для экономистов: учебное пособие. Под ред. Л.Г. Гагариной. М.: Финансы и статистика, 2005 176 с.
- Соколов А.В., Шаньгин В.Ф. Защита информации в распределенных корпоративных сетях и системах. М.: ДМК Пресс, 2002 656 с.
- Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. Пер. с англ.: М.: Издательство ТРИУМФ, 2002 816 с.