From 5d8de74a3609fe5d453352923bc7daab6a8aaed4 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Mon, 27 Mar 2023 23:17:04 +0400 Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D0=B8=20=D0=BF=D0=BE=20=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B3=D1=80=D0=B0=D1=84=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B3=D0=BE=20=D1=81?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D1=81=D1=82=D1=80=D0=B0=20=D0=B4=D0=BE=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cryptography/lectures/lecture20.tex | 236 ++++++++++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 cryptography/lectures/lecture20.tex (limited to 'cryptography/lectures/lecture20.tex') diff --git a/cryptography/lectures/lecture20.tex b/cryptography/lectures/lecture20.tex new file mode 100644 index 0000000..9efc760 --- /dev/null +++ b/cryptography/lectures/lecture20.tex @@ -0,0 +1,236 @@ +% Лекция 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$ бит. -- cgit v1.2.3