Serpent

Serpent (с латыни — «змея») — симметричный блочный алгоритм шифрования.

Serpent
Создатель Росс Андерсон, Эли Бихам, Ларс Кнудсен
Создан 1998
Опубликован 1998
Размер ключа 128/192/256 бит
Размер блока 128 бит
Число раундов 32
Тип SP-сеть

Разработан Россом Андерсоном, Эли Бихамом и Ларсом Кнудсеном. Некоторые предыдущие разработки авторов тоже носили названия в честь животных, например Tiger, Bear.

Алгоритм являлся одним из финалистов 2-го этапа конкурса AES. Как и другие алгоритмы, участвовавшие в конкурсе AES, Serpent имеет размер блока 128 бит и возможные длины ключа 128, 192 или 256 бит. Алгоритм представляет собой 32-раундовую SP-сеть, работающую с блоком из четырёх 32-битных слов. Serpent был разработан так, что все операции могут быть выполнены параллельно, используя 32 1-битных «потока».

При разработке Serpent использовался более консервативный подход к безопасности, нежели у других финалистов AES, проектировщики шифра считали, что 16 раундов достаточно, чтобы противостоять известным видам криптоанализа, но увеличили число раундов до 32, чтобы алгоритм мог лучше противостоять ещё неизвестным методам криптоанализа.

Став финалистом конкурса AES, алгоритм Serpent в результате голосования занял 2 место.

Шифр Serpent не запатентован и является общественным достоянием.

Основные принципы

Алгоритм создавался под лозунгом «криптографический алгоритм 21 века» для участия в конкурсе AES. При создании нового алгоритма Serpent его авторы придерживались консервативных взглядов на проектирование, что подтверждается первоначальным решением об использовании таблиц подстановок из известного много лет ранее алгоритма шифрования DES, который в течение долгого времени изучался ведущими специалистами в области криптографии и защиты информации и чьи свойства и особенности были хорошо известны научному миру. Одновременно с этим к новому алгоритму мог быть применен исчерпывающий анализ, уже разработанный для DES. Не использовались новые, непроверенные и неиспытанные технологии при создании шифра, который в случае принятия был бы использован для защиты огромных массивов финансовых транзакций и правительственной информации. Основным требованием к участникам конкурса AES было то, что алгоритм-претендент должен быть быстрее, чем 3DES, и предоставлять как минимум такой же уровень безопасности: он должен иметь блок данных длиной 128 бит и ключ длиной 256 бит. 16-раундовый Serpent был бы таким же надежным, как 3DES, но в два раза быстрее. Однако, авторы посчитали, что для большей надежности стоит увеличить количество раундов до 32. Это сделало шифр таким же быстрым, как DES, и намного более надежным, чем 3DES.

Структура алгоритма

Алгоритм Serpent представляет собой SP-сеть, в которой весь блок данных длиной 128 бит на каждом раунде разбивается на 4 слова длиной по 32 бита. Все значения, использующиеся при шифровании, представляются битовыми потоками. Индексы бит пробегают значения от 0 до 31 для 32-битных слов, от 0 до 127 для 128-битных блоков, от 0 до 255 для 256-битных ключей и так далее. Для внутренних вычислений все биты величин представлены в прямом порядке (little-endian).

Serpent шифрует открытый текст P длиной 128 бит в шифротекст C длиной так же 128 бит за 32 раунда с помощью 33 подключей длиной 128 бит. Длина используемого ключа может принимать различные значения, но для конкретики зафиксируем их длину в 128, 192 или 256 бит. Короткие ключи длиной менее 256 бит дополняются до полной длины в 256 бит.

Шифрование состоит из следующих основных шагов:

  • начальная перестановка;
  • 32 раунда, каждый из которых состоит из операции смешивания с 128-битным ключом (побитовое логическое исключающее «или»), табличная замена (S-box) и линейное преобразование. В последнем раунде линейное преобразование заменяется дополнительным наложением ключа;
  • конечная перестановка;

Начальная и конечная перестановки не имеют какой-либо криптографической значимости. Они используются для упрощения оптимизированной реализации алгоритма и повышения вычислительной эффективности.

Уравнения структуры алгоритма шифрования:

,

где

,

Уравнения структуры алгоритма расшифрования:

,

где

,

где - раундовые функции шифрования и расшифрования соответственно,  — это применение таблицы подстановки 32 раз параллельно и  — линейное преобразование.

Расшифрование

Расшифрование отличается от шифрования только тем, что должны быть использованы инверсные (обратные) таблицы замен, а также обратные линейные преобразования, но только для раундовой функции R. Ключи подаются в обратном порядке. Битовые операции раундовой функции расшифрования (в т. ч. замены и перестановки) должны проходить в порядке обратном порядку битовых операций раундовой функции шифрования.

Расширение ключа

Как и другие алгоритмы, участвовавшие в конкурсе AES, Serpent имеет возможные длины ключа 128, 192 или 256 бит. «Неполный» ключ длиной меньше 256 бит дополняется по следующему правилу: прибавляется единичный бит справа, за ним следует столько нулевых битов, чтобы длина ключа стала равна 256 битам.

Алгоритм выбора подключей из ключа

Сначала при необходимости ключ дополняется до 256 бит и преобразуется в 33 подключа длиной 128 бит следующим способом:

Исходный ключ представляется в виде 8 32-битных слов для вычисления промежуточного ключа по правилу:

,

где  — это дробная часть золотого сечения или 0x9e3779b9 в шестнадцатеричной системе счисления, а  — это циклический битовый сдвиг.

Раундовые ключи вычисляются из промежуточных ключей использованием таблиц подстановок следующим образом:

Промежуточные 32-битные величины перенумеровываются и получаются 128-битные подключи:

При стандартном описании алгоритма мы должны применить начальную перестановку к раундовому ключу, чтобы расположить биты ключа в надлежащем порядке, то есть

Начальная перестановка

Данная перестановка задается следующей таблицей, где указывается позиция, на которую перейдет соответствующий бит (например, 32-й бит перейдет на 1-ю позицию):

Начальная перестановка
0326496133659723466983356799
43668100537691016387010273971103
8407210494173105104274106114375107
124476108134577109144678110154779111
164880112174981113185082114195183115
205284116215385117225486118235587119
245688120255789121265890122275991123
286092124296193125306294126316395127

S-боксы (таблицы замен)

В алгоритме Serpent таблицы замен являются 4-битовыми перестановками со свойствами стойкости к дифференциальному криптоанализу, к линейному криптоанализу и тем свойством, что порядок выходных бит, как функции входных должен быть максимален, то есть быть равным 3.

Таблица подстановок генерируется из известных и хорошо изученных таблиц для алгоритма DES в итерационном процессе, пока не будут получены желаемые дифференциальные и линейные свойства. Таким образом, создается 8 таблиц подстановок.

Ниже представлены таблицы подстановок:

Таблица подстановок
S0:3815110651114134270912
S1:1512279051011114861334
S2:8679312101513114401152
S3:0151181296313124107514
S4:1158312011625410914713
S5:1552114109120314813671
S6:7212584611149115133100
S7:1131501482117412109356

И инверсные таблицы подстановок:

Таблица инверсных подстановок
InvS0:1331101065121144715982
InvS1:5821415612311479113100
InvS2:1291541114120361358107
InvS3:0910711146133512248151
InvS4:5083109714212116415131
InvS5:8152941131411653712100
InvS6:1510113536049147212811
InvS7:3061391415851211710142

Линейное преобразование

Линейное преобразование задается следующей таблицей, где биты перечислены от 0 до 127 (например, выходной 2 бит образован 2, 9, 15, 30, 76, 84, 126 битами, сложенными по модулю 2). В каждой строке описывается 4 выходных бита, которые вместе составляют входные данные на одну таблицу замен в следующем раунде. Стоит отметить, что данный набор представляет собой таблицу , где и есть то линейное преобразование.

Таблица линейного преобразования:

Линейное преобразование
{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}

Таблица обратного линейного преобразования, которое используется при расшифровке:

Обратное линейное преобразование
{ 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}

Конечная перестановка

Данная перестановка является обратной к начальной, то есть , и задается следующей таблицей:

Конечная перестановка
04812162024283236404448525660
646872768084889296100104108112116120124
15913172125293337414549535761
656973778185899397101105109113117121125
261014182226303438424650545862
667074788286909498102106110114118122126
371115192327313539434751555963
677175798387919599103107111115119123127

Эффективная реализация

Эффективная реализация алгоритма

Желание авторов сделать алгоритм именно таким, какой он есть, становится понятным при рассмотрении его эффективной низкоуровневой реализации.

Serpent был создан таким образом, чтобы все операции в процессе шифрования и расшифрования одного блока могли быть выполнены параллельно в 32 потока. К тому же низкоуровневое описание алгоритма намного проще, чем стандартное описание. Никаких начальных и конечных перестановок не требуется.

Шифрование состоит из 32 раундов. Открытый текст является первыми промежуточными данными . Затем выполняется 32 раунда, каждый i раунд состоит из:

  • смешивания с ключом. Производится побитовое исключающее «или» промежуточных данных с ключом длиной 128 бит;
  • применение таблиц подстановок. Входные данные длиной 128 бит разделяются на 4 слова по 32 бита. Таблица подстановок, реализованная последовательностью логических операций (как если это было бы реализовано аппаратно), применяется к этим 4 словам. В результате получается 4 выходных слова. Таким образом, центральный процессор выполняет подстановку по 32 копиям таблицы одновременно;
  • линейное преобразование.

32-битные слова преобразуются следующим образом:

,

где обозначает циклический битовый сдвиг, а  — битовый сдвиг. В последнем раунде это линейное преобразование заменено дополнительным смешиванием с ключом

Первой причиной выбора такого линейного преобразования является максимизация лавинного эффекта. Такие таблицы подстановок имеют свойство, что изменение каждого входного бита приведет к изменению 2 выходных битов. Таким образом, каждый входной бит открытого текста уже через 3 раунда влияет на все выходные биты. Аналогично каждый бит ключа влияет на результат шифрования.

Вторая причина состоит в простоте преобразования. Оно может быть реализовано на любом современном процессоре с минимальными затратами.

Безопасность и криптостойкость

При разработке и анализе алгоритма Serpent не было выявлено каких-либо уязвимостей в полной 32-раундовой версии. Но при выборе победителя конкурса AES это было справедливо и для остальных алгоритмов-финалистов.

По мнению создателей Serpent, алгоритм может быть взломан, только если будет создана новая мощная математическая теория.

Стоит отметить, что XSL-атака, если будет доказана эффективность её проведения, ослабит криптостойкость Serpent.

Литература

Ссылки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.