% Лекция 20 (10.03.23)

Шифр AES является чисто алгебраической криптосистемой. В шифре AES
обрабатываются блоки длины 128 бит. Возможная длина ключа --- 128, 192 или 256
бит. При 128-битном ключе осуществляется 10 раундов шифрования. Обрабатываемый
128-битный блок разбивается на 16 блоков.

Они образуют поле $GF(2^8)$, то есть интерпретируются как многочлены степени 8
над полем вычетов $\Z_2 = GF(2)$.

\begin{example}
  $11001110 = x + x^2 + x^3 + x^6 + x^7$
\end{example}

Сложение $+$ --- это обычное сложение многочленов над $\Z_2$, иначе говоря,
поразрядное сложение байтов по модулю 2.

\begin{example}
  $01010111 + 10000011 = 11010100$
\end{example}

Чтобы получить произведение $\cdot$ байтов, их перемножают как многочлены над
$\Z_2$ и берут остаток от деления результата на неприводимый многочлен $m(x) =
x^8 + x^4 + x^3 + x + 1$.

% TODO: пример 1???
\begin{example}
  $01010111 \cdot 10000011 = \dots = 11000001$
\end{example}

Все блоки, проходящие через алгоритм, называются состояниями (States), входной
блок --- это начальное состояние (Initial State). Состояние представляется в
виде массива байтов размерности $4 \times 4$.

Таблица --- Состояние.
\begin{table}[H]
  \centering
  \begin{tabular}{|c|c|c|c|}
    \hline
    $S_{00}$ & $S_{01}$ & $S_{02}$ & $S_{03}$ \\ \hline
    $S_{10}$ & $S_{11}$ & $S_{12}$ & $S_{13}$ \\ \hline
    $S_{20}$ & $S_{21}$ & $S_{22}$ & $S_{23}$ \\ \hline
    $S_{30}$ & $S_{31}$ & $S_{32}$ & $S_{33}$ \\ \hline
  \end{tabular}
\end{table}

Ключ шифрования и раундовый 128-битные ключи (Key) также представляются в виде
массивов байтов.

Таблица --- Ключ.
\begin{table}[H]
  \centering
  \begin{tabular}{|c|c|c|c|}
    \hline
    $K_{00}$ & $K_{01}$ & $K_{02}$ & $K_{03}$ \\ \hline
    $K_{10}$ & $K_{11}$ & $K_{12}$ & $K_{13}$ \\ \hline
    $K_{20}$ & $K_{21}$ & $K_{22}$ & $K_{23}$ \\ \hline
    $K_{30}$ & $K_{31}$ & $K_{32}$ & $K_{33}$ \\ \hline
  \end{tabular}
\end{table}

Раундовое преобразование состоит из четырёх операций:
\begin{enumerate}
  \item Замена байтов SubBytes;
  \item Сдвиг строк ShiftRows;
  \item Перемешивание столбцов MixColumns;
  \item Прибавление раундового ключа AddRoundKey.
\end{enumerate}

\paragraph{Замена байтов SubBytes.}

Над байтом-аргументом осуществляются следующие действия:
\begin{enumerate}
  \item
    В поле $GF(2^8)$ для этого байта берётся обратный элемент (для нуля им
    считается ноль);
  \item
    К полученному байту $b$, рассматриваемому как вектор-столбец над $\Z_2$,
    применяется преобразование
    \begin{equation*}
      b\ = \fn{SubBytes}(b) = Ab + c
    \end{equation*}
    где
    \begin{equation*}
      A = \begin{vmatrix}
        1 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\
        1 & 1 & 0 & 0 & 0 & 1 & 1 & 1 \\
        1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 \\
        1 & 1 & 1 & 1 & 0 & 0 & 0 & 1 \\
        1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\
        0 & 1 & 1 & 1 & 1 & 1 & 0 & 0 \\
        0 & 0 & 1 & 1 & 1 & 1 & 1 & 0 \\
        0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 \\
      \end{vmatrix},\,
      c = \begin{vmatrix}
        1 \\
        1 \\
        0 \\
        0 \\
        0 \\
        1 \\
        1 \\
        0 \\
      \end{vmatrix}
    \end{equation*}
\end{enumerate}


\paragraph{Сдвиг строк ShiftRows.}

В аргументе-состоянии первая строка остаётся неизменной, вторая сдвигается
циклически влево на 1 байт, третья --- на 2 байта, четвёртая --- на 3 байта.

\begin{table}[H]
  \centering
  \caption{State}
  \begin{tabular}{|c|c|c|c|}
    \hline
    $S_{00}$ & $S_{01}$ & $S_{02}$ & $S_{03}$ \\ \hline
    $S_{10}$ & $S_{11}$ & $S_{12}$ & $S_{13}$ \\ \hline
    $S_{20}$ & $S_{21}$ & $S_{22}$ & $S_{23}$ \\ \hline
    $S_{30}$ & $S_{31}$ & $S_{32}$ & $S_{33}$ \\ \hline
  \end{tabular}
\end{table}

\begin{table}[H]
  \centering
  \caption{ShiftRows(State)}
  \begin{tabular}{|c|c|c|c|}
    \hline
    $S_{00}$ & $S_{01}$ & $S_{02}$ & $S_{03}$ \\ \hline
    $S_{11}$ & $S_{12}$ & $S_{13}$ & $S_{10}$ \\ \hline
    $S_{22}$ & $S_{23}$ & $S_{20}$ & $S_{21}$ \\ \hline
    $S_{33}$ & $S_{30}$ & $S_{31}$ & $S_{32}$ \\ \hline
  \end{tabular}
\end{table}

\paragraph{Перемешивание столбцов MixColumns.}

Образ столбца-аргумента $s_i, 0 \leq i \leq 3$, из состояния вычисляется как
произведение над $GF(2^8): s'_i = \fn{MixColumns}(s_i) = S s_i$, где
\begin{equation*}
  S = \begin{vmatrix}
    \set{2} & \set{3} & \set{1} & \set{1} \\
    \set{1} & \set{2} & \set{3} & \set{1} \\
    \set{1} & \set{1} & \set{2} & \set{3} \\
    \set{3} & \set{1} & \set{1} & \set{2} \\
  \end{vmatrix}
\end{equation*}
где $\set{n}$ --- двоичная восьмибитовая запись числа $n$.

Применение операции ко всем четырём столбцам состояния обозначается
$\fn{MixColumns}(\fn{State})$.


\paragraph{Прибавление раундового ключа AddRoundKey.}

Поразрядно по модулю 2 к состоянию прибавляется раундовый ключ.

Как осуществляется выработка раундовых ключей (KeySchedule)?

Первым этапом является расширение ключа (KeyExpansion).

Расширенный ключ в AES представляет собой линейный массив длиной 1408 битов,
разбитый на 44 слова, состоящих из 4 байтов каждое.

\begin{equation*}
  \underbrace{w_0 w_1 w_2 w_3}_{K_0} \underbrace{w_4 w_5 w_6 w_7}_{K_1} w_8 \dots w_{39}
  \underbrace{w_{40} w_{41} w_{42} w_{43}}_{K_{10}}
\end{equation*}

При этом первые 4 слова --- ключ шифрования $K = K_0$. Все остальные слова
определяются рекурсивно из слов с меньшими индексами:
\begin{enumerate}
  \item Если $4 \nmid i$, то $w_i = w_{i - 1} \oplus w_{i - 4}$;
  \item Пусть $4 \mid i$.
\end{enumerate}

В слове $w_{i - 1}$ осуществляется побайтовый сдвиг $w_{i - 1} = b_0 b_1 b_2 b_3
\mapsto b_1 b_2 b_3 b_0 = \fn{RotWord}(w_{i - 1}) = w'_{i - 1}$.

В итоге, $w_i = \fn{SubWord}(\fn{RotWord}(w_{i - 1})) \oplus \fn{Rcon} \left(
\frac{i}{4} \right) \oplus w_{i - 4}$. Здесь $\fn{Rcon}(j)$ --- раундовая
константа, равная $2^{j - 1}$.

Выбор раундового ключа (Round Key Selection) для раунда с номером $i$
производится выделением из расширенного ключа массива слов
\begin{equation*}
  w_{4i} w_{4i + 1} w_{4i + 2} w_{4i + 3}
\end{equation*}

Схема шифрования:
% TODO: рисунок 1 (опечатка 2 раунд -> 9 раунд)

Все четыре преобразования SubBytes, ShiftRows, MixColumns, AddRoundKey обратимы
(у последнего обратное совпадает с ним самим).

При дешифровании к выходному блоку криптограммы в обратной по отношению
к шифрованию последовательности выполняются инверсии соответствующих
преобразований. При этом меняется и порядок использования раундовых ключей
$(K_{10}, K_9, \dots, K_1, K_1)$.


\subsection{ГОСТ Р 34.12-2015}

В конце 1989 года был открыт и зарегистрирован в качестве государственного
стандарта шифрования ГОСТ 28147-89 <<Система обработки информации. Защита
криптографическая. Алгоритм криптографического преобразования>>.

Данный блочный шифр был разработан в 1978 году группой советских криптографов
во главе с И. А. Заботиным в 8-м главном управлении КГБ СССР.

Он был предназначен для шифрования сообщений, содержащих высшие грифы
секретности (государственная тайна) и сам имел гриф <<совершенно секретно>>.

В 1988 году гриф шифра был понижен до <<секретно>>, в 1989 году --- для
служебного пользования.

В 2015 году утверждён новый национальный стандарт РФ ГОСТ Р 34.12-2015
<<Информационная технология. Криптографическая защита информации. Блочные
шифры>>.

Разработан Центром защиты информации и специальной связи ФСБ России с участием
ОАО <<ИнфоТеКС>>. Утверждён и введён в действие Приказом Федерального агентства
по техническому регулированию и метрологии от 19 июня 2015 г. №749-ст.

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

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

В настоящем стандарте приведено описание двух базовых блочных шифров с длинами
блоков $n = 128$ бит (<<Кузнечик>>) и $n = 64$ бит (<<Магма>>) и длинами ключей
$k = 256$ бит.
