Лабораторная работа: Методы и средства защиты компьютерной информации
Далее в описании внутренних функций алгоритма Rijndael, через Lb будем обозначать длину блока в четырехбайтовых словах, через Lk - длину ключа пользователя в четырехбайтовых словах (то есть Lb , Lk Î {4, 6, 8}) и через Lr - число раундов (см. таблицу 1).
Открытый и зашифрованный тексты представлены в виде полей байтов и являются соответственно входом и выходом алгоритма.
Блок открытого текста, обрабатываемый как поле m0 ,..., m4L b-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) определяются рекурсивно как элементы поля F2 8:
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 байтов. Сначала каждый ненулевой байт рассматривается как элемент поля F2 8 и заменяется мультипликативно обратным (нулевые байты остаются неизменными). Затем выполняется следующее аффинное преобразование над полем F2 путем умножения на матрицу и сложения с вектором (11000110):
Здесь через х0 и у0 обозначены младшие, а через х7 и у7 - старшие биты в байте; вектор (11000110) длины 8 соответствует шестнадцатеричному числу '63'.
S -блок построен так, чтобы свести к минимуму чувствительность алгоритма к дифференциальному и линейному методам криптоанализа, а также к алгебраическим атакам. Последовательно применяя приведенную выше процедуру к числам от 0 до 255, получаем таблицу 5 (значения идут по строкам слева направо).