% Лекция 22 (24.03.23)

\subsection{ГОСТ 34.13-2015}

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

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

Настоящий стандарт определяет следующие режимы работы алгоритмов блочного
шифрования:
\begin{itemize}
  \item режим простой замены (Electronic Codebook, ECB);
  \item режим гаммирования (Counter, CTR);
  \item режим гаммирования с обратной связью по выходу (Output Feedback, OFB);
  \item режим простой замены с зацеплением (Cipher Block Chaining, CBC);
  \item режим гаммирования с обратной связью по шифртексту (Cipher Feedback, CFB);
  \item режим выработки имитовставки (Message Authentication Code algorithm).
\end{itemize}

Данные режимы могут использоваться в качестве режимов для блочных шифров с
произвольной длиной блока $n$.


\subsubsection{Обозначения}

\begin{enumerate}
  \item $\boxplus_s$ --- операция сложения в кольце $\Z_{2^s}$;
  \item
    $MSB_s : V^* \backslash \cup_{i = 0}^{s - 1} V_i \to V_s$ --- отображение,
    ставящее в соответствие строке $z_{m - 1} \| \dots \| z_1 \| z_0$, $m \geq
    s$, строку $z_{m - 1} \| \dots \| z_{m - s + 1} \| z_{m - s}$, $z_i \in
    V_1$, $i = 0, 1, \dots, m - 1$;
  \item $T_s = MSB_s$;
  \item
    $LSB_s : V^* \backslash \cup_{i = 0}^{s - 1} V_i \to V_s$ --- отображение,
    ставящее в соответствие строке $z_{m - 1} \| \dots \| z_1 \| z_0$, $m \geq
    s$, строку $z_{s - 1} \| \dots \| z_1 \| z_0$, $z_i \in V_1$, $i = 0, 1,
    \dots, m - 1$;
  \item
    $A \ll r$ --- операция логического сдвига строки $A$ на $r$ компонент в
    сторону компонент, имеющих большие номера. Если $A \in V_s$, то
    $A \ll r \in V_s$, причём
    \begin{equation*}
      A \ll r = \begin{cases}
        LSB_{s - r}(A) \| 0^r, &\text{если } r < s, \\
        0^s, &\text{если } r \geq s;
      \end{cases}
    \end{equation*}
  \item
    $Poly_s : V_s \to GF(2)[x]$ --- отображение, ставящее в соответствие строке
    $z = (z_{s - 1} \| \dots \| z_0) \in V_s$ многочлен $Poly_s(z) =
    \sum_{i = 0}^{s - 1} z_i x^i$;
  \item $k$ --- параметр алгоритма блочного шифрования, называемый длиной ключа;
  \item $n$ --- параметр алгоритма блочного шифрования, называемый длиной блока;
  \item
    $E : V_n \times V_k \to V_n$ --- отображение, реализующее базовый алгоритм
    блочного шифрования и осуществляющее преобразование блока открытого текста
    $P \in V_n$ с использованием ключа (шифрования) $K \in V_k$ в блок
    шифртекста $C \in V_n : E(P, K) = C$;
  \item
    $e_K : V_n \to V_n$ --- отображение, реализующее шифрование с использованием
    ключа $K \in V_k$, то есть $e_K(P) = E(P, K)$ для всех $P \in V_n$;
  \item
    $d_K : V_n \to V_n$ --- отображение, реализующее расшифрование с использованием
    ключа $K \in V_k$, то есть $d_K = e_K^{-1}$.
\end{enumerate}


\subsubsection{Дополнение сообщения}

Отдельные из описанных режимов работы могут осуществлять криптографическое
преобразование сообщений произвольной длины, для других режимов требуется,
чтобы длина сообщения была кратна некоторой величине $l$.

В последнем случае при работе с сообщениями произвольной длины необходимо
применение процедуры дополнения сообщения до требуемой длины.

Пусть $P \in V^*$ --- исходное сообщение, подлежащее зашифрованию.
\begin{enumerate}
  \item
    Пусть $|P| \equiv r \pmod{l}$. Положим
    \begin{equation*}
      P^* = \begin{cases}
        P, &\text{если } r = 0, \\
        P \| 0^{l - r}, &\text{иначе}.
      \end{cases}
    \end{equation*}
    
    Описанная процедура в некоторых случаях не обеспечивает однозначного
    восстановления исходного сообщения. Например, результаты дополнения
    сообщения $P_1$, такого что $|P_1| = l \cdot q - 1$ для некоторого $q$,
    и $P_2 = P_1 \| 0$ будут одинаковы.
  \item
    Пусть $|P| \equiv r \pmod{l}$. Положим $P^* = P \| 1 \| 0^{l - r - 1}$.

    Данная процедура обеспечивает однозначное восстановление исходного
    сообщения. При этом если длина исходного сообщения кратна $l$, то длина
    дополненного сообщения будет увеличена.
  \item
    Пусть $|P| \equiv r \pmod{l}$. В зависимости от значения $r$ возможны
    случаи:
    \begin{itemize}
      \item если $r = n$, то последний блок не изменяется $P^* = P$;
      \item если $r < n$, то применяется процедура 2.
    \end{itemize}

    Данная процедура обязательна для режима выработки имитовставки.
\end{enumerate}


\subsubsection{Режимы работы алгоритмов блочного шифрования}

\paragraph{Режим гаммирования с обратной связью по выходу.}

Параметры: целочисленные величины $s$ и $m$, $0 < s \leq n$, $n \leq m$,
$m = n \cdot z$, $z \geq 1$ --- целое число.

При использовании режима не требуется применение процедуры дополнения
сообщения. При шифровании на одном ключе для каждого отдельного открытого
текста используется значение уникальной или непредсказуемой (случайной или
псевдослучайной) синхропосылки $IV \in V_m$. При шифровании используется
двоичный регистр сдвига $R$ длины $m$. Начальным заполнением регистра является
значение синхропосылки $IV$.

Зашифрование в режиме заключается в покомпонентном сложении открытого текста с
гаммой шифра, которая вырабатывается блоками длины $s$.

При вычислении очередного блока гаммы выполняется зашифрование $n$ разрядов
регистра сдвига с большими номерами базовым алгоритмом блочного шифрования.

Затем заполнение регистра сдвигается на $n$ бит в сторону разрядов с большими
номерами, при этом в разряды с меньшими номерами записывается полученный выход
базового алгоритма блочного шифрования.

Блок гаммы вычисляется путём усечения выхода базового алгоритма блочного
шифрования.

\begin{itemize}
  \item
    \textbf{Зашифрование.}

    Открытый текст $P \in V^*$ представляется в виде: $P = P_1 \| P_2 \| \dots
    \| P_q$, $P_i \in V_s$, $i = 1, 2, \dots, q - 1$, $P_q \in V_r, r \leq s$.

    Блоки шифртекста вычисляются по следующему правилу:
    \begin{align*}
      &R_1 = IV, \\
      &\begin{cases}
        Y_i = e_K(MSB_n(R_i)), \\
        C_i = P_i \oplus T_s(Y_i), i = 1, 2, \dots, q - 1, \\
        R_{i + 1} = LSB_{m - n}(R_i) \| Y_i,
      \end{cases} \\
      &Y_q = e_K(MSB_n(R_q)), \\
      &C_q = P_q \oplus T_r(Y_q).
    \end{align*}

    Результирующий шифртекст: $C = C_1 \| C_2 \| \dots \| C_q$.

    \begin{figure}[H]
      \centering
      \includegraphics[width=0.8\textwidth]{lecture22/gost-encrypt}
      \label{fig:gost-encrypt}
    \end{figure}
    
  \item
    \textbf{Расшифрование.}

    Шифртекста представляется в виде: $C = C_1 \| C_2 \| \dots \| C_q$,
    $C_i \in V_s$, $i = 1, 2, \dots, q - 1$, $C_q \in V_r$, $r \leq s$.

    Блоки открытого текста вычисляются по следующему правилу:
    \begin{align*}
      &R_1 = IV, \\
      &\begin{cases}
        Y_i = e_K(MSB_n(R_i)), \\
        P_i = C_i \oplus T_s(Y_i), i = 1, 2, \dots, q - 1, \\
        R_{i + 1} = LSB_{m - n}(R_i) \| Y_i,
      \end{cases} \\
      &Y_q = e_K(MSB_n(R_q)), \\
      &P_q = C_q \oplus T_r(Y_q).
    \end{align*}

    Исходный открытый текст: $P = P_1 \| P_2 \| \dots \| P_q$.

    \begin{figure}[H]
      \centering
      \includegraphics[width=0.8\textwidth]{lecture22/gost-decrypt}
      \label{fig:gost-decrypt}
    \end{figure}
\end{itemize}


\paragraph{Режим гаммирования с обратной связью по шифртексту.}

Параметры: целочисленные величины $s$ и $m$, $0 < s \leq n$, $n \leq m$.

Если в конкретной системе обработки информации на длину исходного сообщения
$P$ накладывается ограничение $|P| = s \cdot q$, то к исходному сообщению, при
необходимости, должна быть предварительно применена процедура дополнения.

При шифровании на одном ключе для каждого отдельного открытого текста
используется значение непредсказуемой (случайной или псевдослучайной)
синхропосылки $IV \in V_m$.

При шифровании используется двоичный регистр сдвига $R$ длины $m$. Начальным
заполнением регистра является значение синхропосылки $IV$.

Зашифрование заключается в покомпонентном сложении открытого текста с гаммой
шифра, которая вырабатывается блоками длины $s$.

При вычислении очередного блока гаммы выполняется зашифрование $n$ разрядов
регистра сдвига с большими номерами базовым алгоритмом блочного шифрования с
последующим усечением.

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

