Смекни!
smekni.com

Методы и средства защиты компьютерной информации (стр. 2 из 8)

Каждый блок открытого текста зашифровывается несколько раз в так называемых раундах (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 - с четырехбайтовыми словами, обращаясь к столбцам

.

2.1 ВЫЧИСЛЕНИЕ КЛЮЧА РАУНДА

И для зашифрования, и для расшифрования требуется сгенерировать 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

2.2 S-БЛОК

Блок подстановки, или 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.