% Лекция 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$ бит.