Практически все операции
Элементы конечного поля могут быть представлены несколькими различными способами. Для любой степени простого числа существует единственное конечное поле, поэтому все представления GF (28) являются изоморфными. Несмотря на подобную эквивалентность, представление влияет на сложность реализации. Выберем классическое полиномиальное представление.
Байт b, состоящий из битов b7, b6,
b5, b4, b3, b2, b1, b0,
представляется в виде полинома с коэффициентами из {0, 1}:
b7х7 + b6х6 + b5х5 + b4х4 + b3х3 + b2х2 + b1х1 + b0
Пример: байт с шестнадцатеричным значением ' 57 ' (двоичное 01010111 )
соответствует
х6 + х4 + х2 + х + 1
Сложение
В полиномиальном представлении сумма двух элементов является
полиномом с коэффициентами, которые равны сумме по модулю 2 (т.е. 1 +
1 = 0 ) коэффициентов слагаемых.
Пример: '57' + '83' = 'DA' или в полиномиальной нотации:
(х6 + х4 + х2 + х + 1) + (х7 + х + 1) = х7 + х6 + х4 + х2
В бинарной нотации мы имеем: 01010111 + 10000011 = 11011010.
Очевидно, что сложение соответствует простому (обозначается как $$\oplus$$ )
на уровне байта.
Выполнены все необходимые условия Абелевой группы: операция сложения
(каждой паре элементов сопоставляется третий элемент группы,
называемый их суммой), ассоциативность, нулевой элемент (' 00 '),
обратный элемент (относительно операции сложения) и
Умножение
В полиномиальном представлении умножение в GF (28) соответствует
умножению полиномов по модулю неприводимого двоичного полинома
степени 8. m(x) и
определяется следующим образом:
m(x) = x8 + x4 + x3 + x + 1
или ' 11B ' в шестнадцатеричном представлении.
Пример: $$'57' ullet '83' = 'C1'$$
Или
(x6 + x4 + x2 + х + 1) (x7 + х + 1) = |
= x13 + x11 + x9 + x8 + x7 +
x7 + x5 + x3 + x2 + x +
x6 + x4 + x2 + х + 1 = |
= x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 + 1 |
(x8 + x4 + x3 + х + 1) (x5 + x3) + x7 + x6 + 1 = x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 +1
Следовательно,
x13 + x11 + x9 + x8 + x6 + x5
+ x4 + x8 + 1
Ясно, что результат является двоичным полиномом не выше 8 степени. В отличие от сложения, простой операции умножения на уровне байтов не существует.
Умножение, определенное выше, является ассоциативным, и существует
единичный элемент (' 01 '). Для любого двоичного полинома b(x) не выше
8-й степени можно использовать расширенный a(x) и c(x) таких, что
b(x) a(x) + m(x) c(x) = 1
Следовательно,
$$a(x) ullet b(x) \mod m(x) = 1$$или
b-1(x) = a(x) mod m(x)
Более того, можно показать, что
$$a(x) ullet (b(x) + c(x)) = a(x) ullet b(x) + a(x) ullet c(x)$$Из всего этого следует, что множество из 256 возможных значений байта
образует конечное поле GF (28) c в качестве сложения и
умножением, определенным выше.
Умножение на х
Если умножить b(x) на х, мы будем иметь:
b7x8 + b6x7 + b5x6 +
b4x5 + b3x4 + b2x3 +
b1x2 + b0x
$$x ullet b(x)$$ получается понижением предыдущего результата по модулю m(x).
Если b7 = 0, то данное понижение является тождественной операцией.
Если b7 = 1, m(x) следует вычесть (т.е. х может быть реализовано на уровне байта как левый сдвиг
и последующий побитовый c ' 1B '. Данная операция обозначается как b = xtime (a).
Полиномы могут быть определены с коэффициентами из GF(28). В этом
случае четырехбайтный вектор соответствует
Полиномы могут быть сложены простым сложением соответствующих
коэффициентов. Как сложение в GF(28) является побитовым , так и
сложение двух векторов является простым побитовым .
Умножение представляет собой более сложное действие. Предположим, что мы имеем два полинома в GF(28).
a(x) = a3x3 + a2x2 + a1x + a0 b(x) = b3x3 + b2x2 + b1x + b0
c(x) = a(x) b(x) определяется следующим образом:
Ясно, что в таком виде с(х) не может быть представлен четырехбайтным
вектором. Понижая с(х) по модулю полинома 4-й степени, результат
может быть полиномом степени ниже 4. В
M(x) = x4 + 1
так как
xj mod (x4 + 1) = xj mod 4
Модуль, получаемый из а(х) и b(x), обозначаемый $$d(x) = a(x) \otimes b(x)$$,
получается следующим образом:
Операция, состоящая из умножения фиксированного полинома а(х), может
быть записана как

Замечание: х4 + 1 не является несократимым полиномом в GF (28),
следовательно, умножение на фиксированный
Умножение на х
При умножении b(x) на х будем иметь:
b3x4 + b2x3 + b1x2 + b0x
$$x \otimes b(x)$$ получается понижением предыдущего результата по модулю 1 + х4.
Это дает
b2x3 + b1x2 + b0x + b3
Умножение на х эквивалентно умножению на матрицу, как описано выше со
всеми ai = '00' за исключением а1 = '01'. Имеем:

Следовательно, умножение на х соответствует циклическому сдвигу
байтов внутри вектора.
При разработке алгоритма учитывались следующие три критерия:
В большинстве
Каждый слой разрабатывался с учетом противодействия линейному и
XOR промежуточного
состояния с ключом Перед первым
Для того чтобы сделать структуру алгоритма более простой, слой
линейного перемешивания последнего
Различные преобразования выполняются над промежуточным результатом, называемым состоянием.
Состояние можно рассматривать как Nb, равное 32. Ключ также можно
рассматривать как Nk, равно длине ключа,
деленной на 32.
В некоторых случаях эти блоки также рассматриваются как одномерные массивы четырехбайтных векторов, где каждый вектор состоит из соответствующего столбца. Такие массивы имеют длину 4, 6 или 8 соответственно, и индексы в диапазонах 0 $$\dots$$ 3, 0 $$\dots$$ 5 или 0 $$\dots$$ 7. Четырехбайтные вектора иногда мы будем называть словами.
Если необходимо указать четыре отдельных байта в четырехбайтном
векторе, будет использоваться нотация (a, b, c, d), где a, b, c и d
являются байтами в позициях 0, 1, 2 и 3, соответственно, в
рассматриваемом столбце, векторе или слове.
(рис 6.1) Пример состояния (с Nb = 6) и ключа шифрования (с Nk = 4)Входы и выходы 0 до 4* Nb - 1. Следовательно, эти блоки имеют
длину 16, 24 или 32 байта, и массив индексируется в диапазонах 0 ...
15, 0 ... 23 или 0 ... 31. Ключ считается одномерным массивом 8-битных
байтов, пронумерованных от 0 до 4* Nk - 1.
Входные байты алгоритма отображаются в байты состояния в следующем
порядке: А0,0, А1,0, А2,0, А3,0, А0,1,
А1,1, А2,1, А3,1, ...
Байты K0,0, K1,0, K2,0, K3,0, K0,1,
K1,1, K2,1, K3,1, ... После выполнения
операции шифрования
Следовательно, если одноразмерный индекс байта в блоке есть n, и
двухмерный индекс есть (i,j), то мы имеем:
Более того, индекс i является также номером байта в четырехбайтном
векторе или слове, j является индексом вектора или слова во вложенном
блоке.
Число Nr и зависит от значений Nb и Nk, что
показано в следующей таблице.
| Nr | Nb = 4 | Nb = 6 | Nb = 8 |
|---|---|---|---|
| Nk = 4 | 10 | 12 | 14 |
| Nk = 6 | 12 | 12 | 14 |
| Nk = 8 | 14 | 14 | 14 |
Преобразование
Round (State, RoundKey)
{
ByteSub (State);
ShiftRow (State);
MixColumn (State);
AddRoundKey (State, RoundKey);
}
Заключительный
FinalRound (State, RoundKey)
{
ByteSub (State);
ShiftRow (State);
AddRoundKey (State, RoundKey);
}
Как мы видим, заключительный MixColumn.
Преобразование ByteSub
Преобразование ByteSub является нелинейной байтовой подстановкой,
выполняющейся для каждого байта состояния независимо. Таблица
подстановки является обратимой и сконструирована в виде композиции
двух преобразований:
00 ' отображается сам в себя.
Применение описанного
ByteSub (State)
На рисунке 6.2 показан результат применения преобразования ByteSub к State.
(рис 6.2) Применение ByteSub для каждого байта в StateByteSub есть применение байтовой подстановки в соответствии
с инверсной таблицей. Это получается
Преобразование ShiftRow
В ShiftRow строки состояния циклически сдвигаются на различные
значения. Нулевая строка не сдвигается. Строка 1 сдвигается на С1
байтов, строка 2 на С2 байтов, строка 3 на С3 байтов. Величины С1, С2
и С3 зависят от Nb. Значения приведены в следующей таблице.
| Nb | С1 | С2 | С3 |
|---|---|---|---|
| 4 | 1 | 2 | 3 |
| 6 | 1 | 2 | 3 |
| 8 | 1 | 3 | 4 |
ShiftRow (State)
ShiftRow является циклический сдвиг трех нижних строк
соответственно на Nb - С1, Nb - С2 и Nb - С3 байт, чтобы байт в
позиции j в строке i перемещался в позицию (j + Nb - Ci) .
Преобразование MixColumn
В MixColumn столбцы состояния рассматриваются как полиномы в GF (28)
и умножаются по модулю х4 + 1 на фиксированный
c(x) = '03' x3 + '01' x2 + '01' x + '02'
Данный х4 + 1 и, следовательно,
инвертируем. Как было описано выше, это может быть записано в виде

Применение данной операции ко всем столбцам состояния обозначается как
MixColumn (State)
MixColumn является аналогичным MixColumn. Каждый столбец
преобразуется умножением его на d(x), определяемый следующим
образом:
В результате получаем
d(x) = '0B' x3 + '0D' x2 + '09' x + '0E'
Сложение с ключом раунда
Выполняется операция побитового ключа Nb. Данное
преобразование обозначается как
AddRoundKey (State, RoundKey)
является
Ключи
ExpandedKey.ExpandedKey следующим способом:
первый ключ Nb слов, второй состоит из
следующих Nb слов и т.д.Расширение ключа
является линейным массивом четырехбайтных слов и
обозначается как W [Nb * (Nr + 1)]. Первые Nk слов состоят из Nk: существует версия функции
для Nk, равным или меньшим 6, и версия для Nk больше 6.
Для Nk <= 6 мы имеем:
KeyExpansion (byte Key [4*Nk]
word W[Nb * (Nr + 1)])
{
for (i = 0; i < Nk; i++)
W[i] =(Key [4*i], Key [4*i+1],
Key [4*i+2], Key [4*i+3]);
for (i = Nk; i < Nb * (Nr + 1); i++) {
temp = W [i - 1];
if (i % Nk == 0)
temp = SubByte (RotByte (temp)) ^
Rcon [i / Nk];
W [i] = W [i- Nk] ^ temp;
}
}
В данном случае является функцией, которая возвращает
четырехбайтное слово, в котором каждый байт является результатом
применения RotByte (W) возвращает слово, в котором байты
циклически переставлены таким образом, что для входного слова (a, b,
c, d) создается выходное слово (b, c, d, a).
Можно заметить, что первые Nk слов заполняются W[i] равно предыдущего слова W[i-1] и
позиций слова Nk до W[i - Nk]. Для слов в позициях, которые кратны Nk, сначала применяется преобразование к W[i-1] и константой RotByte, за которым следует применение табличной подстановки
для всех четырех байтов в слове (.
Для Nk > 6 мы имеем:
KeyExpansion (byte Key [4*Nk]
word W [Nb* (Nr+1)])
{
for (i=0; i < Nk; i++)
W[i]= (key [4*i], key [4*i+1],
key [4*i+2], key [4*i+3]);
for (i = Nk; i < Nb * (Nr + 1); i++) {
temp = W [i-1];
if (i % Nk == 0)
temp = SubByte (RotByte (temp)) ^
Rcon [i / Nk];
else if (i % Nk == 4)
temp = SubByte (temp);
W[i] = W[i - Nk] ^ temp;
}
}
Отличие в схеме для Nk <= 6 состоит в том, что для i-4 кратных Nk, применяется для W[i-1] перед .
Константы Nk и определяются следующим образом:
Rcon [i] = (RC [i], '00', '00', '00')
RC [i] являются элементами в GF (28) со значением x(i-1) таким, что:
Выбор ключа раунда
Ключ i получается из слов буфера ключа W [Nb * i] до W
[Nb * (i+1)].
состоит из
Nr - 1 В С-подобном представлении это выглядит так:
Rijndael (State, CipherKey)
{
KeyExpansion (CipherKey, ExpandedKey);
AddRoundKey (State, ExpandedKey);
for (i=1; i < Nr; i++)
Round (State, ExpandedKey + Nb*i);
FinalRound (State, ExpandedKey + Nb*Nr)
}
Расширение ключа может быть выполнено заранее, и может быть
специфицирован в терминах расширенного ключа.
Rijndael (State, ExpandedKey)
{
AddRoundKey (State, ExpandedKey);
for (i=1; i < Nr; i++)
Round (State, ExpandedKey + Nb*i);
FinalRound (State, ExpandedKey + Nb*Nr)
}
Замечание: расширенный ключ всегда получается из
Преимущества, относящиеся к аспектам реализации:
Простота разработки:
Переменная
Расширения:
Обработка ключа поддерживает
Структура алгоритма допускает произвольную ByteSub и MixColumn преобразования не зависят от ShiftRow.
Для каждой С1,
С2, С3.
Можно определить расширение
Nr = max (Nk, Nb) + 6
Это расширяет правило для количества
Дополнительные значения С1, С2 и С3 определены в следующей таблице.
| Nb | С1 | С2 | С3 |
|---|---|---|---|
| 5 | 1 | 2 | 3 |
| 7 | 1 | 2 | 4 |
Обсудим функции, отличные от шифрования, которые могут выполняться
алгоритмом
Существует много способов, с помощью которых
Существует три операции:
Reset:
Генератор
w - длина
слова в битах, r - число b - w = 32 и r = 20.
(рис 6.3) Алгоритм RC6Алгоритм является
f (x) = x (2x + 1) |
a + b - сложение целых по модулю 2w |
a - b - вычитание целых по модулю 2w |
$$a \oplus b$$ - w-битных слов |
a x b - умножение целых по модулю 2w |
a <<< b - ротация влево на b бит w-битного слова а |
a >>> b - ротация вправо на b бит w-битного слова а |
S [0, ..., 2r + 3] - w-битные подключи |
Практически все операции
Элементы конечного поля могут быть представлены несколькими различными способами. Для любой степени простого числа существует единственное конечное поле, поэтому все представления GF (28) являются изоморфными. Несмотря на подобную эквивалентность, представление влияет на сложность реализации. Выберем классическое полиномиальное представление.
Байт b, состоящий из битов b7, b6,
b5, b4, b3, b2, b1, b0,
представляется в виде полинома с коэффициентами из {0, 1}:
b7х7 + b6х6 + b5х5 + b4х4 + b3х3 + b2х2 + b1х1 + b0
Пример: байт с шестнадцатеричным значением ' 57 ' (двоичное 01010111 )
соответствует
х6 + х4 + х2 + х + 1
Сложение
В полиномиальном представлении сумма двух элементов является
полиномом с коэффициентами, которые равны сумме по модулю 2 (т.е. 1 +
1 = 0 ) коэффициентов слагаемых.
Пример: '57' + '83' = 'DA' или в полиномиальной нотации:
(х6 + х4 + х2 + х + 1) + (х7 + х + 1) = х7 + х6 + х4 + х2
В бинарной нотации мы имеем: 01010111 + 10000011 = 11011010.
Очевидно, что сложение соответствует простому (обозначается как $$\oplus$$ )
на уровне байта.
Выполнены все необходимые условия Абелевой группы: операция сложения
(каждой паре элементов сопоставляется третий элемент группы,
называемый их суммой), ассоциативность, нулевой элемент (' 00 '),
обратный элемент (относительно операции сложения) и
Умножение
В полиномиальном представлении умножение в GF (28) соответствует
умножению полиномов по модулю неприводимого двоичного полинома
степени 8. m(x) и
определяется следующим образом:
m(x) = x8 + x4 + x3 + x + 1
или ' 11B ' в шестнадцатеричном представлении.
Пример: $$'57' ullet '83' = 'C1'$$
Или
(x6 + x4 + x2 + х + 1) (x7 + х + 1) = |
= x13 + x11 + x9 + x8 + x7 +
x7 + x5 + x3 + x2 + x +
x6 + x4 + x2 + х + 1 = |
= x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 + 1 |
(x8 + x4 + x3 + х + 1) (x5 + x3) + x7 + x6 + 1 = x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 +1
Следовательно,
x13 + x11 + x9 + x8 + x6 + x5
+ x4 + x8 + 1
Ясно, что результат является двоичным полиномом не выше 8 степени. В отличие от сложения, простой операции умножения на уровне байтов не существует.
Умножение, определенное выше, является ассоциативным, и существует
единичный элемент (' 01 '). Для любого двоичного полинома b(x) не выше
8-й степени можно использовать расширенный a(x) и c(x) таких, что
b(x) a(x) + m(x) c(x) = 1
Следовательно,
$$a(x) ullet b(x) \mod m(x) = 1$$или
b-1(x) = a(x) mod m(x)
Более того, можно показать, что
$$a(x) ullet (b(x) + c(x)) = a(x) ullet b(x) + a(x) ullet c(x)$$Из всего этого следует, что множество из 256 возможных значений байта
образует конечное поле GF (28) c в качестве сложения и
умножением, определенным выше.
Умножение на х
Если умножить b(x) на х, мы будем иметь:
b7x8 + b6x7 + b5x6 +
b4x5 + b3x4 + b2x3 +
b1x2 + b0x
$$x ullet b(x)$$ получается понижением предыдущего результата по модулю m(x).
Если b7 = 0, то данное понижение является тождественной операцией.
Если b7 = 1, m(x) следует вычесть (т.е. х может быть реализовано на уровне байта как левый сдвиг
и последующий побитовый c ' 1B '. Данная операция обозначается как b = xtime (a).
Полиномы могут быть определены с коэффициентами из GF(28). В этом
случае четырехбайтный вектор соответствует
Полиномы могут быть сложены простым сложением соответствующих
коэффициентов. Как сложение в GF(28) является побитовым , так и
сложение двух векторов является простым побитовым .
Умножение представляет собой более сложное действие. Предположим, что мы имеем два полинома в GF(28).
a(x) = a3x3 + a2x2 + a1x + a0 b(x) = b3x3 + b2x2 + b1x + b0
c(x) = a(x) b(x) определяется следующим образом:
Ясно, что в таком виде с(х) не может быть представлен четырехбайтным
вектором. Понижая с(х) по модулю полинома 4-й степени, результат
может быть полиномом степени ниже 4. В
M(x) = x4 + 1
так как
xj mod (x4 + 1) = xj mod 4
Модуль, получаемый из а(х) и b(x), обозначаемый $$d(x) = a(x) \otimes b(x)$$,
получается следующим образом:
Операция, состоящая из умножения фиксированного полинома а(х), может
быть записана как

Замечание: х4 + 1 не является несократимым полиномом в GF (28),
следовательно, умножение на фиксированный
Умножение на х
При умножении b(x) на х будем иметь:
b3x4 + b2x3 + b1x2 + b0x
$$x \otimes b(x)$$ получается понижением предыдущего результата по модулю 1 + х4.
Это дает
b2x3 + b1x2 + b0x + b3
Умножение на х эквивалентно умножению на матрицу, как описано выше со
всеми ai = '00' за исключением а1 = '01'. Имеем:

Следовательно, умножение на х соответствует циклическому сдвигу
байтов внутри вектора.
При разработке алгоритма учитывались следующие три критерия:
В большинстве
Каждый слой разрабатывался с учетом противодействия линейному и
XOR промежуточного
состояния с ключом Перед первым
Для того чтобы сделать структуру алгоритма более простой, слой
линейного перемешивания последнего
Различные преобразования выполняются над промежуточным результатом, называемым состоянием.
Состояние можно рассматривать как Nb, равное 32. Ключ также можно
рассматривать как Nk, равно длине ключа,
деленной на 32.
В некоторых случаях эти блоки также рассматриваются как одномерные массивы четырехбайтных векторов, где каждый вектор состоит из соответствующего столбца. Такие массивы имеют длину 4, 6 или 8 соответственно, и индексы в диапазонах 0 $$\dots$$ 3, 0 $$\dots$$ 5 или 0 $$\dots$$ 7. Четырехбайтные вектора иногда мы будем называть словами.
Если необходимо указать четыре отдельных байта в четырехбайтном
векторе, будет использоваться нотация (a, b, c, d), где a, b, c и d
являются байтами в позициях 0, 1, 2 и 3, соответственно, в
рассматриваемом столбце, векторе или слове.
(рис 6.1) Пример состояния (с Nb = 6) и ключа шифрования (с Nk = 4)Входы и выходы 0 до 4* Nb - 1. Следовательно, эти блоки имеют
длину 16, 24 или 32 байта, и массив индексируется в диапазонах 0 ...
15, 0 ... 23 или 0 ... 31. Ключ считается одномерным массивом 8-битных
байтов, пронумерованных от 0 до 4* Nk - 1.
Входные байты алгоритма отображаются в байты состояния в следующем
порядке: А0,0, А1,0, А2,0, А3,0, А0,1,
А1,1, А2,1, А3,1, ...
Байты K0,0, K1,0, K2,0, K3,0, K0,1,
K1,1, K2,1, K3,1, ... После выполнения
операции шифрования
Следовательно, если одноразмерный индекс байта в блоке есть n, и
двухмерный индекс есть (i,j), то мы имеем:
Более того, индекс i является также номером байта в четырехбайтном
векторе или слове, j является индексом вектора или слова во вложенном
блоке.
Число Nr и зависит от значений Nb и Nk, что
показано в следующей таблице.
| Nr | Nb = 4 | Nb = 6 | Nb = 8 |
|---|---|---|---|
| Nk = 4 | 10 | 12 | 14 |
| Nk = 6 | 12 | 12 | 14 |
| Nk = 8 | 14 | 14 | 14 |
Преобразование
Round (State, RoundKey)
{
ByteSub (State);
ShiftRow (State);
MixColumn (State);
AddRoundKey (State, RoundKey);
}
Заключительный
FinalRound (State, RoundKey)
{
ByteSub (State);
ShiftRow (State);
AddRoundKey (State, RoundKey);
}
Как мы видим, заключительный MixColumn.
Преобразование ByteSub
Преобразование ByteSub является нелинейной байтовой подстановкой,
выполняющейся для каждого байта состояния независимо. Таблица
подстановки является обратимой и сконструирована в виде композиции
двух преобразований:
00 ' отображается сам в себя.
Применение описанного
ByteSub (State)
На рисунке 6.2 показан результат применения преобразования ByteSub к State.
(рис 6.2) Применение ByteSub для каждого байта в StateByteSub есть применение байтовой подстановки в соответствии
с инверсной таблицей. Это получается
Преобразование ShiftRow
В ShiftRow строки состояния циклически сдвигаются на различные
значения. Нулевая строка не сдвигается. Строка 1 сдвигается на С1
байтов, строка 2 на С2 байтов, строка 3 на С3 байтов. Величины С1, С2
и С3 зависят от Nb. Значения приведены в следующей таблице.
| Nb | С1 | С2 | С3 |
|---|---|---|---|
| 4 | 1 | 2 | 3 |
| 6 | 1 | 2 | 3 |
| 8 | 1 | 3 | 4 |
ShiftRow (State)
ShiftRow является циклический сдвиг трех нижних строк
соответственно на Nb - С1, Nb - С2 и Nb - С3 байт, чтобы байт в
позиции j в строке i перемещался в позицию (j + Nb - Ci) .
Преобразование MixColumn
В MixColumn столбцы состояния рассматриваются как полиномы в GF (28)
и умножаются по модулю х4 + 1 на фиксированный
c(x) = '03' x3 + '01' x2 + '01' x + '02'
Данный х4 + 1 и, следовательно,
инвертируем. Как было описано выше, это может быть записано в виде

Применение данной операции ко всем столбцам состояния обозначается как
MixColumn (State)
MixColumn является аналогичным MixColumn. Каждый столбец
преобразуется умножением его на d(x), определяемый следующим
образом:
В результате получаем
d(x) = '0B' x3 + '0D' x2 + '09' x + '0E'
Сложение с ключом раунда
Выполняется операция побитового ключа Nb. Данное
преобразование обозначается как
AddRoundKey (State, RoundKey)
является
Ключи
ExpandedKey.ExpandedKey следующим способом:
первый ключ Nb слов, второй состоит из
следующих Nb слов и т.д.Расширение ключа
является линейным массивом четырехбайтных слов и
обозначается как W [Nb * (Nr + 1)]. Первые Nk слов состоят из Nk: существует версия функции
для Nk, равным или меньшим 6, и версия для Nk больше 6.
Для Nk <= 6 мы имеем:
KeyExpansion (byte Key [4*Nk]
word W[Nb * (Nr + 1)])
{
for (i = 0; i < Nk; i++)
W[i] =(Key [4*i], Key [4*i+1],
Key [4*i+2], Key [4*i+3]);
for (i = Nk; i < Nb * (Nr + 1); i++) {
temp = W [i - 1];
if (i % Nk == 0)
temp = SubByte (RotByte (temp)) ^
Rcon [i / Nk];
W [i] = W [i- Nk] ^ temp;
}
}
В данном случае является функцией, которая возвращает
четырехбайтное слово, в котором каждый байт является результатом
применения RotByte (W) возвращает слово, в котором байты
циклически переставлены таким образом, что для входного слова (a, b,
c, d) создается выходное слово (b, c, d, a).
Можно заметить, что первые Nk слов заполняются W[i] равно предыдущего слова W[i-1] и
позиций слова Nk до W[i - Nk]. Для слов в позициях, которые кратны Nk, сначала применяется преобразование к W[i-1] и константой RotByte, за которым следует применение табличной подстановки
для всех четырех байтов в слове (.
Для Nk > 6 мы имеем:
KeyExpansion (byte Key [4*Nk]
word W [Nb* (Nr+1)])
{
for (i=0; i < Nk; i++)
W[i]= (key [4*i], key [4*i+1],
key [4*i+2], key [4*i+3]);
for (i = Nk; i < Nb * (Nr + 1); i++) {
temp = W [i-1];
if (i % Nk == 0)
temp = SubByte (RotByte (temp)) ^
Rcon [i / Nk];
else if (i % Nk == 4)
temp = SubByte (temp);
W[i] = W[i - Nk] ^ temp;
}
}
Отличие в схеме для Nk <= 6 состоит в том, что для i-4 кратных Nk, применяется для W[i-1] перед .
Константы Nk и определяются следующим образом:
Rcon [i] = (RC [i], '00', '00', '00')
RC [i] являются элементами в GF (28) со значением x(i-1) таким, что:
Выбор ключа раунда
Ключ i получается из слов буфера ключа W [Nb * i] до W
[Nb * (i+1)].
состоит из
Nr - 1 В С-подобном представлении это выглядит так:
Rijndael (State, CipherKey)
{
KeyExpansion (CipherKey, ExpandedKey);
AddRoundKey (State, ExpandedKey);
for (i=1; i < Nr; i++)
Round (State, ExpandedKey + Nb*i);
FinalRound (State, ExpandedKey + Nb*Nr)
}
Расширение ключа может быть выполнено заранее, и может быть
специфицирован в терминах расширенного ключа.
Rijndael (State, ExpandedKey)
{
AddRoundKey (State, ExpandedKey);
for (i=1; i < Nr; i++)
Round (State, ExpandedKey + Nb*i);
FinalRound (State, ExpandedKey + Nb*Nr)
}
Замечание: расширенный ключ всегда получается из
Преимущества, относящиеся к аспектам реализации:
Простота разработки:
Переменная
Расширения:
Обработка ключа поддерживает
Структура алгоритма допускает произвольную ByteSub и MixColumn преобразования не зависят от ShiftRow.
Для каждой С1,
С2, С3.
Можно определить расширение
Nr = max (Nk, Nb) + 6
Это расширяет правило для количества
Дополнительные значения С1, С2 и С3 определены в следующей таблице.
| Nb | С1 | С2 | С3 |
|---|---|---|---|
| 5 | 1 | 2 | 3 |
| 7 | 1 | 2 | 4 |
Обсудим функции, отличные от шифрования, которые могут выполняться
алгоритмом
Существует много способов, с помощью которых
Существует три операции:
Reset:
Генератор
w - длина
слова в битах, r - число b - w = 32 и r = 20.
(рис 6.3) Алгоритм RC6Алгоритм является
f (x) = x (2x + 1) |
a + b - сложение целых по модулю 2w |
a - b - вычитание целых по модулю 2w |
$$a \oplus b$$ - w-битных слов |
a x b - умножение целых по модулю 2w |
a <<< b - ротация влево на b бит w-битного слова а |
a >>> b - ротация вправо на b бит w-битного слова а |
S [0, ..., 2r + 3] - w-битные подключи |
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.