% Лекция 16 (19.12.22) В обратимом S-боксе число входных битов должно быть равным число битов выхода. Возможны варианты при построении S-боксов. Например, в каждом раунде алгоритма DES размер блока данных сначала расширяется с 32 до 48 бит, что позволяет подмешивать 48-битный раундовый ключ, а после S-боксов --- обратно сокращается до 32 бит. Перемешивающие слои должны реализовывать связи между входными и выходными битами S-боксов при которых выполняются условия: \begin{enumerate} \item Каждый S-бокс удовлетворяет критериям типа лавинного эффекта (зависимость всех выходных битов от каждого входного бита) или критериям распространения, и значит, реализует совершенное преобразование входных наборов. При выполнении данного условия изменение одного бита входного набора любого S-бокса приводит к изменению нескольких (в среднем не менее двух) битов его выхода; \item На следующем раунде совокупность входных битов каждого S-бокса зависит от выходов нескольких S-боксов предыдущего цикла. \end{enumerate} Второе условие выполняется с помощью слоя, переставляющего координаты промежуточных блоков (например, координаты циклически сдвигаются). Выполнение обоих условий позволяет после нескольких раундов достичь ряда положительных свойств, в частности, выполнения критериев типа лавинного эффекта или критериев распространения, например, в 16-раундовом DES совершенным является преобразование после пяти циклов, в 32-раундовом алгоритме ГОСТ 28147-83 --- после трёх циклов. \subsection{Режимы шифрования} \paragraph{Electronic Codebook.} \emph{Режимами шифрования} называются алгоритмы обработки данных, построенные на основе базового режима ECB (Electronic Codebook, электронная кодовая книга, простая замена). Криптографическая стойкость блочного шифра определяется в основном стойкостью базового режима. Свойства: \begin{enumerate} \item При замене и перестановке блоков криптограммы блоки расшифровываются корректно; \item Шифрование на одном ключе одинаковых блоков открытого текста даёт одинаковые блоки криптограммы независимо от их положения в сообщении; \item В силу хорошего перемешивания информации шифрующими подстановками, каждый из $2n$ битов выходного блока $Y$ искажается с вероятностью $\frac{1}{2}$ при искажении одного лишь случайно выбранного бита входного блока $X$. Единичная ошибка в блоке $X$ порождает в среднем $n$ ошибок внутри $2n$-битового шифроблока $Y$. На другие шифроблоки сообщения ошибка не распространяется. \end{enumerate} Длина большинства сообщений не кратна $2n$. Поэтому при шифровании последнего неполного блока данных возникает задача корректного определения алгоритма шифрования. Эта проблема решается с помощью различных способов дополнения блоков текста. \begin{enumerate} \item Простейший способ заключается в дополнении неполного $m$-битного блока открытого текста строкой длины $2n - 8$ бит определённого вида, например, нулевой строкой, и байтом, в котором указано число $2n - m$, равное дефициту последнего блока в битах. После этого блок шифруется обычным образом. Если $2n - m < 8$, то длина сообщения увеличивается на один блок. \item Второй способ называется \emph{похищением криптограммы}. Пусть $v^m : V_r \to V_m$ и $w^m : V_r \to V_{r - m}$, где $1 \leq m < r$, реализующие в совокупности <<рассечение>> блока $(x_1, \dots, x_r) \in V_r$ на две части \begin{align*} v^m(x_1, \dots, x_r) &= (x_1, \dots, x_m) \\ w^m(x_1, \dots, x_r) &= (x_{1 + m}, \dots, x_r) \end{align*} Пусть $x_t$ и $y_t$ есть неполные $m$-битовые блоки открытого и шифрованного текстов, $x_{t - 1}$ и $y_{t - 1}$ есть соответствующие предыдущие полные блоки. Тогда алгоритм шифрования исполняется следующим образом: \begin{align*} y_t &= v^m \left( E_k(x_{t - 1}) \right) \\ y_{t - 1} &= E_k(x_t, w^m (E_k(x_{t - 1}))) \end{align*} При расшифровании сначала вычисляется блок $w = E^{-1}_k(y_{t - 1})$, после чего определяется $x_t = v^m(w)$ и $x_{t - 1} = E^{-1}_k(y_t, w^m(w))$. \end{enumerate} \paragraph{Cipher Block Chaining.} Режим CBC (сцепление блоков шифротекста, режим простой замены с зацеплением) блочного шифра описывается уравнением шифрования \begin{equation*} y_t = E_k(x_t \oplus y_{t - 1}),\, t = 1, 2, \dots \end{equation*} где $y_0$ --- случайный вектор из $V_{2n}$, который называется вектором инициализации (начальным вектором, синхропосылкой) и вырабатывается перед каждым сообщением. Вектор $y_0$ может передаваться в линию связи как в открытом, так и в шифрованном виде (в частности, с помощью режима ECB). Однако, важно избегать повторения синхропосылки в разных сообщениях, шифруемых одинаковым ключом. Это затрудняет атаку на криптограмму, основанную на наличии стандартов в начале сообщения. В качестве синхропосылки используется некоторая строка случайных байтов либо метка времени. На рисунке \ref{fig:cbc-scheme} представлена блок-схема шифрования (в верхней части) и расшифрования (в нижней части) в режима CBC. \begin{figure}[ht] \centering \includegraphics[width=0.6\textwidth]{lecture16/cbc-scheme.pdf} \caption{Схема зашифрования-расшифрования в режиме CBC} \label{fig:cbc-scheme} \end{figure} Искажение одного бита в блоке $x_t$ влечёт за собой искажение в среднем половины битов во всех блоках криптограммы, начиная с $y_t$. Для расшифрования это несущественно, так как восстановленный текст будет содержать ту же единственную ошибку. Искажение $i$-го бита в блоке $y_t$ влечёт искажение около половины битов в блоке $x_t$ и $i$-го бита в блоке $x_{t + 1}$. Следующие блоки расшифровываются корректно (самовосстанавливаются). В то же время режим CBC совершенно не устойчив к ошибкам синхронизации. Дополнение блоков можно выполнять как в режиме ECB. Если требуется совпадение длин исходного сообщения и криптограммы, то используются следующие способы: \begin{enumerate} \item При неполном $m$-битовом блоке $x_t$ открытого текста соответствующий блок $y_t$ криптограммы вычисляется так: \begin{equation*} y_t = x_t \oplus v^m (E_k(y_{t - 1})) \end{equation*} \item Это вариант похищения криптограммы. Пусть $a$ есть $(2n - m)$-битовая строка из нулей и $w = E_k(x_{t - 1} \oplus y_{t - 2})$. Тогда шифрование происходит следующим образом: \begin{equation*} y_t = v^m(w), y_{t - 1} = E_k((x_t, a) \oplus w) \end{equation*} При расшифровании сначала вычисляется блок данных $w' = E^{-1}_k(y_{t - 1}) \oplus (y_t, a)$, после чего определяется \begin{equation*} x_t = v^m(w'), x_{t - 1} = E^{-1}_k(y_t, w^m(w')) \oplus y_{t - 2} \end{equation*} \end{enumerate}