% Лекция 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}
