В алгоритме блочного шифрования AES преобразования над битами и байтами осуществляются специальными математическими операциями. Биты и байты понимаются как элементы поля.
16.4.1. Операции с байтами в AES
Чтобы определить операции сложения и умножения двух байтов, введём сначала представление байта в виде многочлена степени 7 или меньше. Байт
Далее байт трактуется как элемент конечного поля ${{\mathbb{GF}}(2^8)}$, заданного неприводимым многочленом, например
$$ m(x) = x^{8}+x^{4}+x^{3}+x +1. $$
Произведение многочленов $a(x)$ и $b(x)$ по модулю многочлена $m(x)$ записывают как
$$ c(x) = a(x) b(x) \mod m(x). $$
Остаток $c(x)$ представляет собой многочлен степени 7 или меньше. Его коэффициенты $(c_{7}, c_{6}, c_{5}, c_{4}, c_{3}, c_{2}, c_{1}, c_{0})$ образуют байт $c$, который и называется произведением байтов $a$ и $b$.
Сложение байтов осуществляется как $\oplus$ (исключающее ИЛИ), что является операцией сложения многочленов в двоичном поле.
Единичным элементом поля является байт $\mathrm{'00000001'}$, или $\mathrm{'01'}$ в шестнадцатеричной записи. Нулевым элементом поля является байт $\mathrm{'00000000'}$, или $\mathrm{'00'}$ в шестнадцатеричной записи. Одним из примитивных элементов поля является байт $\mathrm{'00000010'}$, или $\mathrm{'02'}$ в шестнадцатеричной записи. Байты часто записывают в шестнадцатеричной форме, но при математических преобразованиях они должны интерпретироваться как элементы поля ${{\mathbb{GF}}(2^8)}$.
Для каждого ненулевого байта $a$ существует обратный байт $b$ такой, что их произведение является единичным байтом:
$$ a b = 1 \mod m(x). $$
Обратный байт обозначается $b = a^{-1}$.
Для байта $a$, представленного многочленом $a(x)$, нахождение обратного байта $a^{-1}$ сводится к решению уравнения
$$ m(x) d(x) + b(x) a(x) = 1. $$
Если такое решение найдено, то многочлен $b(x) \mod m(x)$ является представлением обратного байта $a^{-1}$. Обратный элемент (байт) может быть найден с помощью расширенного алгоритма Евклида для многочленов.
Пример.
Найти байт, обратный байту $a = \mathrm{'C1'}$, в шестнадцатеричной записи. Так как $a(x) = x^{7} + x^{6} + 1$, то с помощью расширенного алгоритма Евклида находим
Пример.
В алгоритме блочного шифрования AES байты рассматриваются как элементы поля Галуа ${{\mathbb{GF}}(2^8)}$. Сложим байты $\mathrm{'57'}$ и $\mathrm{'83'}$. Представляя их многочленами, находим:
Пример.
В таблице[tab:irreducible-gf8] приведены примеры приводимых и неприводимых многочленов над полем ${{\mathbb{GF}}(2^8)}$.
Многочлен
Разложение
$\mathrm{'01'} x + \mathrm{'00'}$
неприводимый
$\mathrm{'01'} x + \mathrm{'01'}$
неприводимый
$\mathrm{'01'} x + \mathrm{'A9'}$
неприводимый
$\mathrm{'01'} x^2 + \mathrm{'00'} x + \mathrm{'00'}$
$(\mathrm{'01'} x) \cdot (\mathrm{'01'} x)$
$\mathrm{'1D'} x^2 + \mathrm{'AF'} x + \mathrm{'52'}$
$(\mathrm{'41'} x + \mathrm{'0A'}) \cdot (\mathrm{'E3'} x + \mathrm{'5A'})$
$\mathrm{'01'} x^4 + \mathrm{'01'}$
$(\mathrm{'01'} x + \mathrm{'01'})^4$
Таблица 16.4 — Примеры многочленов над полем ${{\mathbb{GF}}(2^8)}$
В алгоритме AES вектор-столбец $\mathbf{a}$ состоит из четырёх байтов $a_{0}, a_{1}, a_{2}, a_{3}$. Ему ставится в соответствие многочлен $\mathbf{a}(y)$ от переменной $y$ вида
причём коэффициенты многочлена (байты) интерпретируются как элементы поля ${{\mathbb{GF}}(2^{8})}$. Это значит, что при сложении или умножении двух таких многочленов их коэффициенты складываются и перемножаются, как определено выше.
Многочлены $\mathbf{a}(y)$ и $\mathbf{b}(y)$ умножаются по модулю многочлена
Умножение матриц производится в поле ${{\mathbb{GF}}(2^8)}$. Матричное представление полезно, если нужно умножать фиксированный вектор на несколько различных векторов.
Пример.
Вычислим для $\mathbf{a}(y) = (\mathrm{F2}, \mathrm{7E}, \mathrm{41}, \mathrm{0A})$ произведение $\mathbf{a}(y) \otimes \mathbf{c}(y)$: