Каждый блок открытого текста зашифровывается несколько раз в так называемых раундах (round) с помощью повторяющейся последовательности различных функций. Число раундов зависит от длины блока и ключа (см. таблицу 1).
Таблица 1 Число раундов в алгоритме Rijndael как функция от длины блока и ключа
Длина ключа в битах | Длина блока (в битах) | ||
128 | 192 | 256 | |
128 | 10 | 12 | 14 |
192 | 12 | 12 | 14 |
256 | 14 | 14 | 14 |
Rijndael не относится к алгоритмам на сетях Фейстеля, которые характеризуются тем, что блок текста разбивается на левую и правую половины, затем преобразование раунда применяется к одной половине, результат складывается по модулю 2 с другой половиной, после чего эти половины меняются местами. Самым известным блочным алгоритмом из этой серии является DES. Rijndael, напротив, состоит из отдельных уровней, каждый из которых по-своему воздействует на блок в целом. Для зашифрования блока последовательно выполняются следующие преобразования:
Первый раундовый ключ складывается с блоком по модулю 2 (XOR).
Выполняются Lr - 1 обычных раундов.
Подстановка(S-блок) | |
ShiftRow | |
MixColumn | |
Сложение с раундовым ключом |
Рис.1. Уровни преобразования внутри одного раунда алгоритма Rijndael
Выполняется завершающий раунд, в котором, в отличие от обычного, отсутствует преобразование MixColumn.
Каждый обычный раунд на этапе 2 состоит из четырех отдельных шагов.
Подстановка. Каждый байт блока заменяется значением, которое определяется S-блоком.
Перестановка. Байты в блоке переставляются с помощью преобразования ShiftRow.
Перемешивание. Выполняется преобразование MixColumn.
Сложение с раундовым ключом. Текущий раундовый ключ складывается с блоком по модулю 2.
Каждый уровень оказывает на каждый из блоков открытого текста определенное воздействие.
1. Влияние ключа
Сложение текста с ключом до первого раунда и на последнем шаге внутри каждого раунда влияет на каждый бит результата раунда. В процессе зашифрования результат каждого шага в каждом бите зависит от ключа.
2. Нелинейный уровень
Операция подстановки в S-блоке является нелинейной. Строение S-блоков обеспечивает почти идеальную защиту от дифференциального и линейного криптоанализа.
3. Линейный уровень
Преобразования ShiftRow и MixColumn обеспечивают максимальное перемешивание битов в блоке.
Далее в описании внутренних функций алгоритма Rijndael, через Lb будем обозначать длину блока в четырехбайтовых словах, через Lk - длину ключа пользователя в четырехбайтовых словах (то есть Lb, LkÎ {4, 6, 8}) и через Lr - число раундов (см. таблицу 1).
Открытый и зашифрованный тексты представлены в виде полей байтов и являются соответственно входом и выходом алгоритма.
Блок открытого текста, обрабатываемый как поле m0,..., m4Lb-1,представлен в виде двумерной структуры B (см. таблицу 2). в которой байты открытого текста отсортированы в следующем порядке:
т.е.
, где i = n mod 4 и; j = ën/4û.Таблица 2
b0,0 | b0,1 | b0,2 | b0,3 | b0,4 | … | b0,Lb-1 |
b1,0 | b1,1 | b1,2 | b1,3 | b1,4 | … | b1,Lb-1 |
b2,0 | b2,1 | b2,2 | b2,3 | b2,4 | … | b2,Lb-1 |
b3,0 | b3,1 | b3,2 | b3,3 | b3,4 | … | b3,Lb-1 |
Доступ к структуре B в функциях алгоритма Rijndael осуществляется по-разному, в зависимости от операции. S-блок оперирует с битами, ShiftRow - со строками (bi,0, bi,1, bi,2, …, bi,Lb-1) структуры B, а функции AddRoundKey и MixColumn - с четырехбайтовыми словами, обращаясь к столбцам
.И для зашифрования, и для расшифрования требуется сгенерировать Lr раундовых ключей, совокупность которых называется разверткой ключа (keyschedule). Развертка строится путем присоединения к секретному ключу пользователя, рекурсивно получаемых: четырехбайтовых слов
.Первые Lk слов
развертки ключа - это сам секретный ключ пользователя. Для LkÎ {4, 6} очередное четырехбайтовое слово ki определяется как сумма по модулю 2 предыдущего слова ki-1 со словом ki-Lk. При iº 0 modLk перед операцией XOR нужно применить функцию FLk (k, i), которая включает в себя циклический сдвиг k байтов влево (операция r (k)), подстановку S (r (k)) с использованием S-блока алгоритма Rijndael (к этой операции мы еще вернемся) и сложение по модулю 2 с константой c (ëi/Lkû). Итоговое уравнение функции F таково:FLk (k, i) = S (r (k)) Åc (ëi/Lkû).
Константы c (j) задаются равенством c (j) = (rc (j), 0, 0, 0), где значения rc (j) определяются рекурсивно как элементы поля F28:
rc (1) = 1, rc (j) = rc (j-1) х = хj-1.
Или в виде численных значений:
rc (1) = '01’, rc (j) = rc (j-1) •'02'.
Программно значение rc (j) реализуется (j- 1) - кратным рекурсивным вызовом функции xtime, с начальным значением аргумента, равным 1 или более быстро - с использованием таблицы предвычислений (см. таблицу 3).
Таблица 3. Константы rc (j) (в шестнадцатеричном виде)
'01’ | '02' | '04' | '08' | '10' | '20' | '40' | '80' | '1B' | '36' |
'6C | 'D8' | 'AB' | '4D' | '9A' | '2F' | '5E' | 'ВС | '63' | 'C6' |
'97' | '35' | '6A' | 'D4' | 'B3' | 7O' | 'FA' | 'EF' | 'C5 | '91' |
Для ключей длины 256 бит (то есть при Lk = 8) введена дополнительная операция подстановки: при iº 4 modLk перед операцией XOR значение ki-1 заменяется на s (ki-1).
Таким образом, развертка ключей состоит из Lb (Lr + 1) четырехбайтовых слов, включая и секретный ключ пользователя. На каждом раунде i = 0,..., Lr- 1 очередные Lb, четырехбайтовых слова с kLbi по kLb (I+1) выбираются из развертки и используются в качестве ключа раунда. Раундовые ключи рассматриваются, по аналогии с блоками открытого текста, как двумерная структура (см. таблицу 4).
Таблица 4. Представление раундовых ключей
k0,0 | k 0,1 | k 0,2 | k 0,3 | k 0,4 | … | k 0,Lb-1 |
k 1,0 | k 1,1 | k 1,2 | k 1,3 | k 1,4 | … | k 1,Lb-1 |
k 2,0 | k 2,1 | k 2,2 | k 2,3 | k 2,4 | … | k 2,Lb-1 |
k 3,0 | k 3,1 | k 3,2 | k 3,3 | k 3,4 | … | k 3,Lb-1 |
Для ключей длины 128 бит процесс генерации ключа изображен на рис.2.
Рис.2. Диаграмма раундовых ключей для Lk = 4
Пока не известны слабые ключи, использование которых неблагоприятно сказалось бы на стойкости алгоритма Rijndael
Блок подстановки, или S-блок алгоритма Rijndael показывает, каким значением следует заменять каждый байт блока текста на каждом раунде. S-блок представляет собой список из 256 байтов. Сначала каждый ненулевой байт рассматривается как элемент поля F28 и заменяется мультипликативно обратным (нулевые байты остаются неизменными). Затем выполняется следующее аффинное преобразование над полем F2 путем умножения на матрицу и сложения с вектором (11000110):
Здесь через х0 и у0 обозначены младшие, а через х7 и у7 - старшие биты в байте; вектор (11000110) длины 8 соответствует шестнадцатеричному числу '63'.
S-блок построен так, чтобы свести к минимуму чувствительность алгоритма к дифференциальному и линейному методам криптоанализа, а также к алгебраическим атакам. Последовательно применяя приведенную выше процедуру к числам от 0 до 255, получаем таблицу 5 (значения идут по строкам слева направо).
Таблица 5. Значения S-блока
99 | 124 | 119 | 123 | 242 | 107 | 111 | 197 | 48 | 1 | 103 | 43 | 254 | 215 | 171 | 118 |
202 | 130 | 201 | 125 | 250 | 89 | 71 | 240 | 173 | 212 | 162 | 175 | 156 | 164 | 114 | 192 |
183 | 253 | 147 | 38 | 54 | 63 | 247 | 204 | 52 | 165 | 229 | 241 | 113 | 216 | 49 | 21 |
4 | 199 | 35 | 195 | 24 | 150 | 5 | 154 | 7 | 18 | 128 | 226 | 235 | 39 | 178 | 117 |
9 | 131 | 44 | 26 | 27 | 110 | 90 | 160 | 82 | 59 | 214 | 179 | 41 | 227 | 47 | 132 |
83 | 209 | 0 | 237 | 32 | 252 | 177 | 91 | 106 | 203 | 190 | 57 | 74 | 76 | 88 | 207 |
208 | 239 | 170 | 251 | 67 | 77 | 51 | 133 | 69 | 249 | 2 | 127 | 80 | 60 | 159 | 168 |
81 | 163 | 64 | 143 | 146 | 157 | 56 | 245 | 188 | 182 | 218 | 33 | 16 | 255 | 243 | 210 |
205 | 12 | 19 | 236 | 95 | 151 | 68 | 23 | 196 | 167 | 126 | 61 | 100 | 93 | 25 | 115 |
96 | 129 | 79 | 220 | 34 | 42 | 144 | 136 | 70 | 238 | 184 | 20 | 222 | 94 | 11 | 219 |
224 | 50 | 58 | 10 | 73 | 6 | 36 | 92 | 194 | 211 | 172 | 98 | 145 | 149 | 228 | 121 |
231 | 200 | 55 | 109 | 141 | 213 | 78 | 169 | 108 | 86 | 244 | 234 | 101 | 122 | 174 | 8 |
186 | 120 | 37 | 46 | 28 | 166 | 180 | 198 | 232 | 221 | 116 | 31 | 75 | 189 | 139 | 138 |
112 | 62 | 181 | 102 | 72 | 3 | 246 | 14 | 97 | 53 | 87 | 185 | 134 | 193 | 29 | 158 |
225 | 248 | 152 | 17 | 105 | 217 | 142 | 148 | 155 | 30 | 135 | 233 | 206 | 85 | 40 | 223 |
140 | 161 | 137 | 13 | 191 | 230 | 66 | 104 | 65 | 153 | 45 | 15 | 176 | 84 | 187 | 22 |
При расшифровании порядок действий меняется на противоположный. Сначала выполняется обратное аффинное преобразование, затем мультипликативное обращение в поле F28. Обратный S-блок приведен в таблице 6.