НОВОСТИ AES — АМЕРИКАНСКИЙ СТАНДАРТ ШИФРОВАНИЯ, ЧАСТЬ I

Alvaros
Онлайн
Регистрация
14.05.16
Сообщения
21.452
Реакции
101
Репутация
204
2750f0b36c3cb4a8ae7634f665db628b.jpg


Эта публикация вызвана необходимостью дать возможность обучаемым изучать и моделировать процессы шифрования/расшифрования и дешифрования последнего стандарта США. Ознакомление с имеющимися публикациями в сети не соответствуют программе обучения в силу их поверхностного подхода, неполноты изложения, и отсутствия должной строгости. Например, нигде не встречается выбор и задание примитивного элемента, формирующего поле, без чего работу и подготовку специалиста, особенно криптоаналитические явления и процессы, организовать и моделировать невозможно. В этой работе используется описание, несколько отличное от оригинала AES, представленного FIPS PUB 197. Здесь описывается шифр AES, с использованием матриц над GF(2[SUP]8[/SUP]), но примечания работы сохраняются, т. е. шифр реализуется над конечным расширенным полем GF (2[SUP]8[/SUP]). На русском языке достаточно полная и доступная версия шифра изложена Зензиным О.С. и Ивановым М.А.


МАТЕМАТИЧЕСКИЕ ОСНОВЫ СТАНДАРТА ШИФРОВАНИЯ AES США


AES – блочный шифр с длиной блоков равной 128 битам, и шифр поддерживает ключи длиной
1e80c3b3087c0a57b68ad11261a9ec2b.svg
, равной 128, 192 или 256 бит. AES – это шифр с итерационным ключом: состоит из повторного применения раундового преобразования состояния блока State шифруемого текста. Число раундов шифра обозначается
85a43e47f464ed7e1e891c8f44e6877d.svg
зависит от длины ключа (
243bb4667f4f1dc89ae399ab6e9fd9f1.svg
для ключа 128 битов,
a1f0c00d4012729b91911e02eb30ba2f.svg
для ключа 192 бита и
409c49545a694bf5b3b67855568c7c6f.svg
для ключа 256 бит).

Шифр AES преобразует исходное состояние блока, обозначаемое символом S (State) и принадлежащее множеству матриц {M4(GF(2[SUP]8[/SUP]))} (то есть S є{M4(GF (2[SUP]8[/SUP]))} – матрица 4 × 4 байта, с ее элементами (коэффициентами) в GF (2[SUP]8[/SUP])), к другому шифрованному состоянию в {M4 (GF (2[SUP]8[/SUP]))}.

Пример 1. Блок данных длиной в 128 = 4·32, 4 слова по 32 разряда представляется квадратной таблицей байтов из 4-х строк и 4-х столбцов. Каждая строка содержит байты из 4-х разных 32 разрядных слов, а столбец – байты одного и того же 32-разрядного слова. Весь квадрат образован 4×4 = 16 байтами, которые могут обрабатываться как самостоятельные единицы.

Именно такой подход к представлению данных определяет и обеспечивает байт-ориентированную структуру шифра и обработку данных. Ключ шифра K расширяется в
4a602f8f03c517c878909ae936022544.svg
подключей, обозначаемых матрицей Ki ={M4(GF(2[SUP]8[/SUP]))}, принадлежащей множеству {M4 (GF(2[SUP]8[/SUP]))}, (i = 0, 1, ..., Nr). Перестановка элементов в матрице S, возникающая при операции сдвига строк обозначена символом р(х).

Представление данных, выбранное для элементов поля GF(2[SUP]8[/SUP])


В шифре AES используется байтовая структура данных. Представление, выбранное в [1] из векторного пространства GF(2[SUP]8[/SUP]), соответствующего полю GF(2[SUP]8[/SUP])[X]/< φ(x) >, где φ(x) – неприводимый многочлен,

4209216a9855a747c1ac108dfeabe385.svg


. Для удобства и лучшего понимания изучаемого материала, а для уяснения деталей выполнения вычислений с карандашом в руках ниже приводятся многочисленные числовые примеры и следующая таблица 1.

Таблица 1. Соответствие десятичных, шестнадцатеричных, двоичных чисел и многочленов
r3ozbdsqlusagas0zgwbkjumomc.png

В работе используются четыре представления для обозначения каждого элемента расширенного поля в GF(2[SUP]8[/SUP]), которые являются эквивалентными одно другому.

Представление данных, используемых в шифре AES


Выберем десятичное целое число, эквивалент которого будем представлять
различными формами в других системах счисления:

1. 212[SUB]10[/SUB], десятичным видом – числом в 10-ой системе счисления.

2. {11010100}b, представление элементов сообщения двоичным вектором – элементом векторного пространства GF(2[SUP]8[/SUP]) двоичных векторов,

3.
8785982510b591f48af2032e429c26e6.svg
, многочленное представление – элементом поля Галуа GF [2[SUP]8[/SUP]], соответствующим двоичному вектору,

4. {D4}[SUB]16[/SUB], – шестнадцатеричное представление – числом в 16-системе счисления,

⊕ – операция поразрядного суммирования векторов из GF(2[SUP]8[/SUP]) по mod2 (без переноса 1 в старший разряд).
⊗ – операция умножения элементов (векторов, многочленов, чисел) из поля GF(2[SUP]8[/SUP])

Алгоритм стандарта AES и шифра RIGNDAEL оперирует с байтами информации, которые отождествляются с элементами конечного поля Галуа GF(2[SUP]8[/SUP]). Степень расширения простого поля GF(2) равна 8. Все элементы расширенного поля при представлении их многочленами имеют показатель степень не более семи (≤ 7).

Достигается такое положение приведением всех результатов действий с элементами поля по модулю неприводимого многочлена степени 8, который является формирующим многочленом для этого поля. Кроме неприводимого многочлена для построения поля необходимо задавать примитивный элемент.

В рассматриваемом алгоритме примитивный элемент задан (его порядок должен быть равен порядку мультипликативной группы поля), а многочлен фиксирован и имеет вид φ(x). Не располагая этими характеристикам, работать со стандартом не получится



4209216a9855a747c1ac108dfeabe385.svg


или 1{1b} в 16-ричной форме.
Шестнадцатеричная запись неприводимого многочлена 1{1b} использует 9 разрядов и многочлен φ(x) не принадлежит полю GF(2[SUP]8[/SUP]).
Таблица П1 представления элементов поля GF(2[SUP]8[/SUP]) (в конце текста в Приложении).
В таблице П1 размещены все элементы поля в порядке возрастания показателя степени примитивного элемента (α = 00000011[SUB]2[/SUB] = 3[SUB]10[/SUB]), мультипликативный порядок которого равен 255.

Рассмотрим примеры выполнения арифметических операций над элементами поля при различных представлениях этих элементов. Любой байт исходного текста (элемент поля) формально можно представить строкой символов
c68d12fac160941a2744abd1e4fb3a0d.svg
, коэффициентов двоичного вектора в виде:

3cb7cd84dfbc595f67e677ac65403065.svg


Пример 2. Элемент расширенного поля GF(2[SUP]8[/SUP]) задан в виде двоичного вектора:


c3dc233e7396ce354da52a0f75157fdc.svg


Описание многочленом этого элемента имеет вид:


69cfee12a4d2bbea6b75ae481f461f59.svg


Если доопределить значения ai двоичными значениями, i = 0(1)7, например, так
0e5ac0869b2f62cfc7d63d14c1175366.svg
= {11000001}[SUB]2[/SUB], то получим многочлен

644a4a78c05e04392341725a7938cc3e.svg


так как
809e87a1a186a300a254bf34d9b988cf.svg


Шестнадцатеричное представление этого элемента α[SUB]16[/SUB] = {с1}={11000001}, а десятичное
α[SUB]10[/SUB] =
513067d00ff4fc9b2c9dcd3607c295f2.svg
= 128 + 64 + 1 = 193[SUB]10[/SUB].

При выбранном примитивном элементе поля степенное представление
α[SUB]i[/SUB] ={с1}= α[SUP]178[/SUP].
Входим в таблицу П1 элементов поля GF(2[SUP]8[/SUP]) со значением α[SUP]178[/SUP] и в соответствующих столбцах для этой строки находим описанные представления, а также другие характеристики этого элемента поля. Для понимания возможных преобразований с элементами поля рассмотрим операции с его элементами в деталях.

Суммирование элементов поля GF(2[SUP]8[/SUP])


Сложение в рассматриваемом поле представляет операцию поразрядного суммирования значений разрядов слагаемых без переноса единицы в старший разряд. Это операция исключающего ИЛИ (EXOR – EXLUSIV OR) часто обозначается просто XOR. В модулярной арифметике такое сложение называется суммированием по модулю два (mod2).

Пример 3. Выберем в качестве операндов многочлены
0854fc3cc7f2114036239e65d580f18c.svg

f977a5d630613fbe7eccd7cec6a62381.svg

Двоичное представление суммы многочленов по модулю два имеет вид
[A(x)⊕B(x)]mod2 = {11000001}⊕ {00001101} = {11001100};

16-ричное представление {c1}⊕{0D}={cc}sub>16=α[SUP]55[/SUP];
степенное представление α[SUP]178[/SUP] + α[SUP]238[/SUP] = α[SUP]55[/SUP]· {α[SUP]123[/SUP] + α[SUP]183[/SUP]} = α[SUP]55[/SUP]· 1 = α[SUP]55[/SUP].

Представление многочленами
a4402a1444f6fd8b6ff3af1be9ece8e7.svg

Заметим, что при сложении операндов степень многочлена результата не
увеличивается, и необходимость приведения его по модулю неприводимого многочлена поля φ(x) не возникает. Коэффициенты результата приводятся по модулю два, т. е. все четные коэффициенты обращаются в нуль.

В полях характеристики 2 действия сложения и вычитания операндов равнозначны. Для каждого элемента поля в аддитивной группе обратным к нему (противоположным) является он сам. Так, для элемента (а) противоположным является (-а), так как а + (-а) = 0. Нулевой элемент (единица аддитивной группы поля, нейтральный элемент) в шестнадцатеричном виде – это {00}[SUB]16[/SUB].

Умножение элементов поля GF(2[SUP]8[/SUP])



Операция обычного умножения операндов (в отличие от модулярного ⊗) обозначается точкой между операндами, или знак умножения вообще опускается, когда не возникает опасности разночтения. Операнды в двоичном представлении умножаются по обычным правилам «столбиком». Будем перемножать те же, что и ранее операнды.

Пример 4. Умножение операндов в двоичном представлении
А(х)· В(х) = {c1}·{0d}
zwdis-oykb1kitz1u9pdwzqhceq.png

Остаток от деления получает вид двоичного, многочленного и 16-ричного представлений (как элемент поля)
R(x) = 01011 1010[SUB]2[/SUB] =
9a72f3b91382b07dbf9d8a9efdc50ad9.svg
= {ba}[SUB]16[/SUB]. Старший разряд остатка равен нулю и не учитывается.
Степенное представление здесь не приводим, но по таблице П1 его можно найти.

Остаток от деления на неприводимый многочлен φ(x) в его двоичном представлении результата умножения операндов принимаем в качестве произведения операндов как элементов поля GF(2[SUP]8[/SUP]).
Выполним умножение операндов в представлении многочленами.

Пример 5. Умножение операндов элементов поля в многочленном представлении
А(х) ⊗ В(х) = {c1}⊗{0d}
A(x) ⊗ B(x) =
bbb210e25dff027c4fac337815ecfc05.svg
(moddφ(x),2) =
=(x[SUP]10[/SUP]+
2243b6047b9e90d8c133ece3a77849cb.svg
(moddφ(x),2) =
=(x[SUP]10[/SUP]+
36964fcb5833974eb3b3e0373d0681e3.svg
(moddφ(x),2).

Здесь символ (moddφ (x),2) обозначает приведение по двойному модулю: многочлен по модулю φ(x), а его коэффициенты по модулю два, т.е. четные коэффициенты обнуляются. Получившаяся степень (deg(A(x)⊗ B(x)) =10) результата произведения выводит (этот многочлен — результат) за пределы поля. Чтобы результат принадлежал полю, его приводят (редуцируют, делят) по модулю неприводимого многочлена. Выполним такое деление обычным способом (уголком)

Пример 6. Необходимость деления многочленов возникает при
их умножении А(х)⊗В(х)/ φ(x).(Операции деления в поле нет, когда надо что-то поделить, это что-то умножают на обратный элемент делителя в поле)
bmzgprvjz-foa8ql8vf3skqcihe.png

– остаток отделения на φ(x) принадлежит полю GF(2[SUP]8[/SUP]), и его принимаем в качестве окончательного результата
d9b8c20db88c35ade32b793fd1fa16c7.svg
модулярного умножения.

Иначе умножение A(x)⊗B(x) представимо как
5b720d424ed039b89fad9494f58b392c.svg
= {ba}[SUB]16[/SUB]=α[SUP]161[/SUP],
где R(x) остаток и degR(x)< deg φ(x).
Степенное представление для получения произведения элементов поля самое удобное.
A(x)· B(x) = α[SUP]178[/SUP]· α[SUP]238[/SUP] = α[SUP](178+238)[/SUP] = α[SUP]416[/SUP] = α[SUP]161[/SUP]α[SUP]255[/SUP] =α[SUP]161[/SUP] = {ba}[SUB]16[/SUB].

Для любого ненулевого элемента β поля справедливо β·1 =β. Мультипликативной единицей в GF(2[SUP]8[/SUP]) является элемент {01}[SUB]16[/SUB] =α[SUP]255[/SUP].
Все вычисленные произведения для различных представлений операндов эквивалентны (преобразуются в один элемент поля со значением {ba}[SUB]16[/SUB]).

Наряду с обычным (классическим) рассмотрением операции умножения элементов в двоичном поле существует более удобная схема. Именно такая схема и реализована в стандарте AES.

Рассмотрим сущность этого способа умножения



Пример 7. Другой способ умножения в конечном поле. Пусть задан произвольный многочлен седьмой степени
7377911fde25139c37e1fce478fe7655.svg

и значения его коэффициентов
57b0d42b17032b78d8d25460d18ab691.svg
.

Умножим его на
817b92407f764f57af9226e50cc788fd.svg
и получим
1dae6e72c577f66e25b8c0c69d276e11.svg
. Этот результат не принадлежит полю GF(2[SUP]8[/SUP]) степень его многочлена больше 7 и его необходимо привести по модулю φ(x) = 1{1b}, после чего такое произведение станет элементом поля GF(2[SUP]8[/SUP]).

С этой целью определяют значение
38e039e28015c366543a146ea90e8c43.svg
, если
118ec46bb9479d413f253f064b62b719.svg
то результат уже принадлежит полю, если же
a6f8f966c8a2cb722dd3f4e5d86917b7.svg
, то достаточно вместо деления выполнить лишь вычитание A(x)x – φ(x) или операцию XOR для произведения A(x)x с φ(x).

В этом случае при записи A(x) в сдвиговом регистре умножению на x полинома A(x), т.е.
4e566ae3b61d2da0f4a3b9d95c825136.svg
соответствует сдвиг полинома A(x) на один разряд в сторону старших разрядов (влево, т.е. увеличение вдвое) и, если требуется, применяется операция XOR с неприводимым многочленом поля 1{1b}[SUB]16[/SUB] =φ(x).

В алгоритме стандарта шифрования введена операция (функция) xtime( ), которая по существу и выполняет умножение полинома на х, так как это описано ранее. Многократное применение xtime обеспечивает умножение на x[SUP]8[/SUP]. Далее вычисляя сумму различных степеней, можно получить результат умножения произвольных элементов поля GF(2[SUP]8[/SUP]).

Пример 8. Перемножим многочлены A(x) = {c1}[SUB]16[/SUB] и B(x) = {11}[SUB]16[/SUB], используя их 16-ичные представления и представляя суммой {11} ={10⊕01}.
{c1}⊗{11}={11000001}⊗{00010001}={c1}⊗{10⊕01}={a4}⊕{c1}=01100101 ={65}[SUB]16[/SUB].

Детализируем все действия. Элемент х в поле GF(2[SUP]8[/SUP]) имеет представление
x = {02}[SUB]16[/SUB]=(00000010)[SUB]2[/SUB].
{c1}⊗{11}={c1}⊗{10}⊕{c1}⊗{01}= α[SUP]178[/SUP]· α[SUP]100[/SUP]⊕α[SUP]178[/SUP]· α[SUP]0[/SUP]={a4}⊕{c1}, так как α[SUP]178[/SUP]· α[SUP]100[/SUP]=α[SUP](178+100-255)[/SUP]=α[SUP]23[/SUP]={a4}

Тогда умножение на него приводит просто к сдвигу первого операнда на 1 разряд влево.
{c1}⊗ {02} = xtime{c1} = 11000001⊗ 00000010= 110000010 — 9-ти разрядное двоичное число. Этот результат выходит за пределы нашего поля. Его возвращают вычитанием неприводимого многочлена поля φ(х), преобразуя в элемент поля. Итоговый результат 10011001 = {99}


e02c645eda322eca48cf306cba36c7c1.svg


{c1}⊗ {04} = xtime(99) = 10011001⊗ 00000010 =100110010 — 9-ти разрядное двоичное число. Этот результат выходит за пределы нашего поля. Его возвращают вычитанием неприводимого многочлена поля φ(х), преобразуя в элемент поля. Итоговый результат 00101001 = {29}


5bdb46fe977dea661e59d68352ad1937.svg


Очередной шаг процедуры
{c1}⊗ {08} = xtime(29) = 00101001⊗ 00000010 = 0101 0010 = {52}.
Здесь результат не суммируем с φ(x), так как коэффициент
8114962b5937d92b5af0d77bcd2da07e.svg
.

И еще один шаг
{c1}⊗ {10} = xtime(52) = 01010010⊗00000010 = 10100100 = {a4}[SUB]16[/SUB].
Здесь также не суммируем с φ(x), так как коэффициент
8114962b5937d92b5af0d77bcd2da07e.svg
.
Таким образом, найдено значение первого слагаемого в сумме для исходного
выражения, где второе слагаемое равно {c1}[SUB]16[/SUB].
Теперь находим окончательно
{c1}⊗ {11} = {c1}⊗ {10}⊕ {c1}⊗ {01} = {a4} ⊕ {c1} =10100100⊕ 11000001 = {65} или


552deef082de3c12201d05812dfe68d1.svg



проверка обычным умножением (степенное представление)
A(x)∙ B(x) = {c1}∙{11} = α[SUP]178[/SUP]∙α[SUP]4[/SUP] = α[SUP]182[/SUP]
(по таблицам находим в строке для α1[SUP]182[/SUP]) α[SUP]182[/SUP] соответствует {65}[SUB]16[/SUB].

Еще большего эффекта при производстве вычислений можно достигнуть, если укрупнить элементы, с которыми выполняются манипуляции. Так в криптоалгоритме RIJNDAEL используются 32-разрядные (4-х-байтовые) слова. Составляющие байт разряды не анализируются по отдельности. Такой подход позволяет 4-байтовому слову в соответствие поставить многочлен А(х) степени не более трех, и коэффициенты которого лежат в поле GF(2[SUP]8[/SUP]).

Операция умножения таких слов
8f171e370d285ef21e6c27f6812ffa36.svg
и
28a58b6cec1e3cedbad323cde28ad4b4.svg
,
где
0bdd5ba403200e82a6d37c6d4fa362b3.svg
єGF(2[SUP]8[/SUP]), i = 0(1)3, выполняется по модулю многочлена степени не более четырех. Взятие результата произведения по модулю неприводимого многочлена степени 4 обеспечивает всегда получение результата произведения, как элемента поля.

В качестве такого многочлена выбран многочлен
045fcc22afcff157dfd8ab025db3f022.svg
. Он имеет наиболее простую запись, и для него справедливо
16cfbb3e894097d2c49409ea6decc251.svg
.
Последнее свойство оказывается очень полезным при вычислениях.
Для рассматриваемых многочленов операция сложения выполняется аналогично (XOR поразрядное по mod2)
$inline$A(x)⊕ B(x) = (a_3⊕ b_3) x^3 ⊕ (a_2⊕ b_2) x^2 ⊕ (a_1⊕ b_1)x ⊕ (a_0⊕ b_0)$inline$.

Умножение многочленов.
$inline$A(x)⊗ B(x) = C(x) = (c_6x^6 ⊕ c_5x^5 ⊕ c_4x^4⊕ c_3x^3 ⊕ c_2x^2 ⊕ c_1x^1 ⊕ c_0) mod(x^4+1)$inline$.
Коэффициенты
002f3d75b5a506174233aa90c8079ab0.svg
определяются из соотношений
d18f3c159f1e577aad427fa207e658f8.svg
,
53898f4ce486441e74581d966e024bbb.svg
,
0793af6c094339d497930c1511ce2a9d.svg
,
0f84f2c2f5e2bce2cbf47a742a1419df.svg
,
40c17ac3da163a8e8595ca6a0ec65f35.svg
,
a0abd97f721f3ec5da19ab60bfd5c829.svg
,
97dfebd7a7be03a316b02f2ca3f427d0.svg
.

Окончательно результатом D(x) умножения ⊗ двух многочленов по модулю
ce417a5cdee2cdcac3a3a7669500e3b3.svg
будет
$inline$D(x) = A(x)⊗B(x) = d_3x^3 ⊕ d_2x^2 ⊕ d_1x ⊕ d_0$inline$, где
b83a30edc8afc43cd9c2700e320e6f3b.svg
,
03d89b41460dbbdc3036a4e7a98542b7.svg
,
0a22dbcb71a4e3522b3cae02d8e79164.svg
,
19a359d05e1404264e21a8517ea65f49.svg
,
или более кратко в векторно – матричной записи,
m6sd4pxxttgwhf3lzaud7xir4ow.png


выполним умножение В(х) на х по
6b283be2b1616102377e7429e5220c47.svg
, учитывая свойства многочлена. Такому умножению, как и ранее, соответствует циклический сдвиг байтов в пределах слова в направлении старшего байта. Так как
e1151ee8e75bb7492ac6098299af0d92.svg
, то
cc79caf912ec00e4c884dbdcdf084473.svg

реализуется циклический сдвиг байтов.

Приложение


Таблица П1 — расширенного поля, неприводимый многочлен φ(х)=Р (х), примитивный элемент α=3[SUB]16[/SUB]
2vuqrvjl3r61u3e38qdimxd93ss.png


gnng8gz_ydo16y28ixqwlcuqbji.png


2vuqrvjl3r61u3e38qdimxd93ss.png


2vuqrvjl3r61u3e38qdimxd93ss.png
 
Сверху Снизу