Байтовые операции. Байты рассматриваются как элементы конечного поля Галуа GF(28) порядка 28, где байту b =(b 7, b 6, b 5, b 4, b 3, b 2, b 1, b 0) соответствует полином
b (x) = b 7 х 7+ b 6 х 6+… b 1 х + b0.
В этом поле определены бинарные операции Å и ×.
Ø операция Å представляет собой поразрядное суммирование байтов по модулю 2 (или Х0R-суммирование).
Ø операция × это умножение полиномов, соответствующих байтам, по модулю неприводимого двоичного полинома m (х)= х 8+ х 4+ х 3+ х +1.
Ø и существует обратный элемент по умножению, который можно найти с помощью расширенного алгоритма Евклида.
Произведение многочлена b (x)на х равно полиному
b (x)× x = b 7 х 8 + b 6 х 7 + b 5 х 6 + b 4 х 5 + b 3 х 4 + b 2 х 3 + b 1 х 2 + b0 х,
приведенному по модулю т(х).
Замечание. Приведение по модулю т(х) означает вычисление остатка от деления на т(х), то есть результат должен иметь степень не выше 7. При этом
Ø если b 7 = 0, результатом будет сдвинутый влево на одну позицию байт b, к которому приписывается справа 0:
b ¢=(b 6, b 5, b 4, b 3, b 2, b 1, b 0,0);
|
|
Ø если b 7 = 1, то результат получается с помощью Х0R-суммирования полиномов b (x)× x и m (х) длиной по 9 бит с отбрасыванием старшего бита или, что равносильно, байтов b ¢и байта ¢0В¢ (в шестнадцатеричном представлении), так как полиному т(х) соответствуют биты ¢1 0000 1011¢, две младших четверки бит равны шестнадцатеричным цифрам 016 и В16(1110).
Операцию умножения х на многочлен b (x)обозначают x time(b). Умножение многочлена b (x)на xk равносильно k -кратной композиции операции x time(b).
Операции с 4-байтовыми векторами. Состояния, представляющие собой 4-байтовые векторы можно представлять с помощью полиномов степени не выше 3 с коэффициентами из поля Галуа GF(28), которые сами являются полиномами степени не выше 7. Сложение 4-байтовых векторов производится путем Х0R-суммирования, что равносильно суммированию в поле GF(28) коэффициентов при соответствующих степенях полиномов.
Умножение двух полиномов производится с последующим приведением произведения по модулю полинома М (х) = х4+ 1. При этом, если
с(х) = а(х) + b(х), где
, то
Полином М (х)не является неприводимым над GF(28), следовательно, умножение на фиксированный полином не всегда является обратимым. Однако в шифре Rijndael умножение реализуется на фиксированный полином, для которого обратный существует.
Произведение многочлена b (x)на x равно полиному
b (x) × x = b 3 х 4 + b 2 х 3 + b 1 х 2 + b0 х,
приведенному по модулю М(х). Результатом приведения является полином
b 2 х 3 + b 1 х 2 + b0 х + b 3.
Таким образом, умножение на х равносильно левому циклическому сдвигу байтов внутри вектора.
Функция зашифрования
|
|
Слои, составляющие каждый цикл (кроме последнего цикла), peaлизованы следующими четырьмя преобразованиями:
I) заменой байтов - SubBytes(S) - побайтовая нелинейная подстановка в State -блоках (S-Box) с использованием фиксированной таблицы замен (affain map table);
II) сдвигом строк - ShiftRows(S) - циклический сдвиг строк массива State на различное количество байт;
III) перемешиванием столбцов - MixColumns(S) - умножение столбцов состояния, рассматриваемых как многочлены над GF (28);
IV) наложением циклового ключа - AddRoundKey(S) - поразрядное XOR содержимого State с текущим фрагментом развернутого ключа.
I) Замена байтов (нелинейная подстановка SubBytes) действует на все байты b состояния независимо и определяется функцией l, имеющей вид
l(b)=((x 4+ x 3+ x 2+ x +1)× b (x)+ x 6+ x 5+ x +1) mod (x 8+1).
Обратное ему преобразование выглядит как
l-1(b)=((x 6+ x 3+ x) × b (x)+ x 2+1) mod (x 8+1).
Результаты всех прочих операций над байтами приводятся не по модулю x 8+1, а по модулю m (х)= х 8+ х 4+ х 3+ х +1.
Многократное вычисление в процессе зашифрования данного выражения оказывало бы неоправданную вычислительную нагрузку на исполняющую систему, поэтому для практической реализации наиболее приемлемым решением является использование предварительно вычисленной таблицы замены S-Box. Ее использование сводит операцию SubBytes() к простейшей выборке байта из массива l(b)= Sbox (b). Логика работы S-Box при преобразовании байта b ={xy} отражена в шестнадцатеричном виде на рисунке 4.15.
Рисунок 4.15 Таблица S-Box замены байт
Рисунок 4.16. Таблица S-Box инверсной замены байт.
В функциях расшифрования применяется операция, обратная SubBytes() - InvSubBytes(), которая реализуется так же просто, как и предыдущая посредством инверсной таблицы S-Box - l-1(b)= InvSbox (b), ее логика работы при преобразовании байта {xy} отражена в шестнадцатеричном виде на рисунке 4.16.
В другом варианте реализации подстановки преобразование байта состоит их двух операций:
1) для каждого байта состояния (представленного двоичным полиномом b (x) степени не выше 7) находим обратный элемент b-1 (x) в поле GF(28), при этом '00' переходит в '00';
2) к полученному байту, представленному двоичным вектором (b 0, b 1, ..., b 7), применяем невырожденное аффинное преобразование А нaд GF(2):
II)Сдвиг строк состояния ShiftRows(S) относится к слою линейного перемешивания и реализуется как циклический сдвиг вправо трех последних строк матрицы состояния на С1 С2 и С3 байт соответственно. Значения С1 С2 и С3 зависят от величины Nb:
C1 | C2 | C3 | ||
Nb =4 | 1 | 2 | 3 | AES |
Nb =6 | 1 | 2 | 3 | |
Nb = 8 | 1 | 3 | 4 |
state | |||
s0 | s4 | s8 | s12 |
s1 | s5 | s9 | s13 |
s2 | s6 | s10 | s14 |
s3 | s7 | s11 | s15 |
III)Перемешивание столбцов состояния MixColumns(S) относится также к слою линейного перемешивания и реализуется так. Столбцы рассматриваются как полиномы степени не выше 3 над полем GF (28) и умножаются по модулю полинома M (x)= x 4+1 на фиксированный полином c (x):
.
Здесь ¢03¢ означает запись константы длиной 8 бит в виде двух шестнадцатеричных цифр от 0 до Е, каждая длиной 4 бита. Это преобразование может быть представлено в матричном виде следующим образом:
.
IV)Наложение i-го циклового ключа. В данной операции раундовый ключ добавляется к состоянию посредством поразрядного XOR. Длина ключа равна числу бит в состоянии (Nb. в 32-разрядных словах)
Далее, в зависимости от величины Nk, массив State подвергается раундовой трансформации Np раз (в AES 10, 12 или 14), причем финальный раунд является несколько укороченным - в нем отсутствует преобразование MixColumns().
Выходными данными описанной последовательности операций является шифртекст – результат действия функции зашифрования AES.
Ключевое расписание
Генерация цикловых (раундовых) ключей из ключа шифра включает две процедуры:
1. расширение ключа(Key Expansion) и
2. выбор цикловых ключей(Round Key Selection).
|
|
Генерация реализуется на основе следующих принципов:
² ключ шифра k преобразуется в расширенный ключ(Expanded Key);
² общее количество бит цикловых ключей равно длине блока, умноженной на Nr +1, где Nr - число циклов шифрования;
² цикловые ключи образуются из расширенного ключа следующим образом:
1-й цикловой ключ состоит из первых Nb слов,
2-й - из следующих Nb слов и т. д.
Расширение ключа шифра k происходит с использованием одного из двух вариантов рекуррентного закона. Представим расширенный ключ как последовательность 4-байтовых слов {w[ i ]}, i = 0,1,2,...
Первые Nk слов содержат ключ шифрования. Каждое последующее слово w [ i ] получается посредством XOR предыдущего слова w [ i -1] и слова на Nk позиций ранее (при Nk< 6):
Для слов, позиция i которых кратна Nk, перед XOR применяется преобразование к w [ i -1], а затем еще прибавляется раундовая константа RС [ i ]
,
где Т - циклический сдвиг байтовой последовательности на 1 байт, С(t) есть 4-байтовый вектор (RC[ t ],'00', '00', '00'), 1-й байт которого вычисляется по закону
,
где x time(b) мы обозначили операцию умножения х на многочлен b (x),
RС [ ]– массив 32-битных раундовых констант; значение RС [ j ]=2 j- 1.
Если Nk>6, то рекуррентный закон отличается от ранее заданных только при i, для которых i -4 кратно Nk, а именно
.
На выбор ключа k никаких ограничений не накладывается, но расширенный ключ необходимо вычислять из ключа шифра k и нельзя определять другим способом.
Таким образом, алгоритм шифрования rijndael состоит из начального наложения циклового ключа, Nr -1 идентичных циклов шифрования и последнего цикла, в котором отсутствует перемешивание столбцов.