% Лекция 21 (17.03.23)

Введём обозначения:
\begin{itemize}
  \item
    $V^*$ --- множество всех двоичных строк конечной длины, включая пустую
    строку;
  \item
    $V_s$ --- множество всех двоичных строк длины $s$, где $s$ --- целое
    неотрицательное число, нумерация подстрок и компонент строки осуществляется
    справа налево, начиная с нуля;
  \item
    $U \times W$ --- прямое (декартово) произведение множества $U$ и
    множества $W$;
  \item
    $|A|$ --- число компонент (длина) строки $A \in V^*$ (если $A$ --- пустая
    строка, то $|A| = 0$);
  \item
    $A \| B$ --- конкатенация строк $A, B \in V^*$;
  \item
    $A \lll_{11}$ --- циклический сдвиг строки $A \in V_{32}$ на 11 компонент в
    сторону компонент, имеющих большие номера;
  \item
    $\oplus$ --- операция покомпонентного сложения по модулю 2 двух двоичных
    строк одинаковой длины;
  \item
    $Z_{2^s}$ --- кольцо вычетов по модулю $2^s$;
  \item
    $\boxplus$ --- операция сложения в кольце $\Z_{2^{32}}$;
  \item
    $\mathbb{F}$ --- конечное поле $GF(2)[x] / p(x)$, где $p(x) = x^8 + x^7 +
    x^6 + x + 1 \in GF(2)[x]$; элементы поля $\mathbb{F}$ представляются целыми
    числами, причём элементу $z_0 + z_1 \cdot \theta + \dots z_7 \cdot \theta^7
    \in \mathbb{F}$ соответствует число $z_0 + 2 \cdot z_1 + \dots + 2^7 \cdot
    z_7$, где $z_i \in \set{0, 1},\, i = 0, 1, \dots, 7$ и $\theta$ обозначает
    класс вычетов по модулю $p(x)$, содержащий $x$;
  \item
    $Vec_s : Z_{2^s} \to V_s$ --- биективное отображение, сопоставляющее
    элементу кольца $Z_{2^s}$ его двоичное представление;
  \item
    $Int_s : V_s \to Z_{2^s}$ --- отображение, обратное к отображению $Vec_s$;
  \item
    $\Delta : V_8 \to \mathbb{F}$ --- биективное отображение, сопоставляющее
    двоичной строке из $V_8$ элемент поля $\mathbb{F}$ следующим образом:
    строке $z_7 \| \dots \| z_1 \| z_0$, $z_i \in \set{0, 1}$, $i = 0, 1, \dots,
    7$, соответствует элемент $z_0 + z_1 \cdot \theta + \dots + z_7 \cdot
    \theta^7 \in \mathbb{F}$;
  \item
    $\triangledown : \mathbb{F} \to V_8$ --- отображение, обратное к
    отображению $\Delta$.
  \item
    $\Phi \Psi$ --- произведение отображений, при котором отображение $\Psi$
    действует первым;
  \item
    $\Phi^s$ --- композиция отображений $\Phi^{s - 1}$ и $\Phi$, причём
    $\Phi^1 = \Phi$.
\end{itemize}


\paragraph{Шифр <<Магма>>.}

Это по сути шифр ГОСТ 28147-89 с фиксированным набором подстановок (таблицы
замены $S$).

\begin{enumerate}
  \item
    \textbf{Значения параметров.}

    В качестве нелинейного биективного преобразования выступают подстановки
    $\pi_i = Vec_4 \pi_i' Int_4 : V_4 \to V_4$, где $\pi_i' : Z_{2^4} \to
    Z_{2^4}$, $i = 0, 1, \dots, 7$. Значения подстановок $\pi_i'$ записаны
    в стандарте в виде массивов:
    \begin{equation*}
      \pi_i' = (\pi_i'(0), \pi_i'(1), \dots, \pi_i'(15)),\, i = 0, 1, \dots, 7
    \end{equation*}

    Например,
    \begin{equation*}
      \pi_6' = (8, 14, 2, 5, 6, 8, 1, 12, 15, 4, 11, 0, 13, 10, 3, 7)
    \end{equation*}

  \item
    \textbf{Преобразования.}

    При реализации алгоритмов шифрования и расшифрования используются
    следующие преобразования:
    \begin{equation*}
      t : V_{32} \to V_{32}, t(a) = t(a_7 \| \dots \| a_0) =
      \pi_7(a_7) \| \dots \| \pi_0(a_0)
    \end{equation*}
    где $a = a_7 \| \dots \| a_0 \in V_{32}$, $a_i \in V_4$, $i = 0, \dots, 7$.

    \begin{equation*}
      g[k] : V_{32} \to V_{32},
      g[k](a) = (t(Vec_{32}(Int_{32}(a) \boxplus Int_{32}(k)))) \lll_{11}
    \end{equation*}
    где $k, a \in V_{32}$;

    \begin{equation*}
      G[k] : V_{32} \times V_{32} \to V_{32} \times V_{32},
      G[k](a_1, a_0) = (a_0, g[k](a_0) \oplus a_1)
    \end{equation*}
    где $k, a_0, a_1 \in V_{32}$;

    \begin{equation*}
      G^*[k] : V_{32} \times V_{32} \to V_{64},
      G^*[k](a_1, a_0) = (g[k](a_0) \oplus a_1) \| a_0
    \end{equation*}
    где $k, a_0, a_1 \in V_{32}$.

  \item
    \textbf{Алгоритм развёртывания ключа.}

    Итерационные ключи $K_i \in V_{32}$, $i = 1, 2, \dots, 32$, вырабатываются
    на основе исходного ключа $K = k_{255} \| \dots \| k_0 \in V_{256}$,
    $k_i \in V_1$, $i = 0, 1, \dots, 255$, и определяются равенствами:
    \begin{align*}
      K_1 &= k_{255} \| \dots \| k_{224}; \\
      K_2 &= k_{223} \| \dots \| k_{192}; \\
          &\dots \\
      K_8 &= k_{31} \| \dots \| k_{0}; \\
      K_{i + 8} &= K_i,\, i = 1, 2, \dots, 8; \\
      K_{i + 16} &= K_i,\, i = 1, 2, \dots, 8; \\
      K_{i + 24} &= K_{9 - i},\, i = 1, 2, \dots, 8; \\
    \end{align*}

  \item
    \textbf{Базовый алгоритм шифрования.}

    \begin{enumerate}
      \item
        Алгоритм зашифрования в зависимости от значений итерационных ключей
        $K_i \in V_{32}$, $i = 1, 2, \dots, 32$, реализует подстановку
        $E_{K_1, \dots, K_{32}}$, заданную на множестве $V_{64}$ в
        соответствии с равенством
        \begin{equation*}
          E_{K_1, \dots, K_{32}}(a) = G^*[K_{32}] G[K_{31}] \dots
          G[K_2] G[K_1](a_1, a_0)
        \end{equation*}
        где $a = a_1 \| a_0 \in V_{64},\, a_0, a_1 \in V_{32}$.

      \item
        Алгоритм расшифрования в зависимости от значений итерационных ключей
        $K_i \in V_{32},\, i = 1, 2, \dots, 32$, реализует подстановку
        $D_{K_1, \dots, K_{32}}$, заданную на множестве $V_{64}$ в
        соответствии с равенством
        \begin{equation*}
          D_{K_1, \dots, K_{32}}(a) = G^*[K_1] G[K_2] \dots
          G[K_{31}] G[K_{32}](a_1, a_0)
        \end{equation*}
        где $a = a_1 \| a_0 \in V_{64},\, a_0, a_1 \in V_{32}$.
    \end{enumerate}
    Сложность алгоритма $c = 2^{256}$.
\end{enumerate}


\paragraph{Шифр <<Кузнечик>>.}

\begin{enumerate}
  \item
    \textbf{Значения параметров.}

    \begin{enumerate}
      \item
        В качестве нелинейного биективного преобразования выступает подстановка
        $\pi = Vec_8 \pi' Int_8 : V_8 \to V_8$, где $\pi' : Z_{2^8} \to Z_{2^8}$.
        Значения подстановки $\pi'$ записаны в стандарте в виде массива:
        \begin{align*}
          \pi' &= (\pi'(0), \pi'(1), \dots, \pi'(255)) \\
          \pi' &= (252, 238, 221, \dots, 75, 99, 182)
        \end{align*}
      \item
        Линейное преобразование задаётся отображением $l : V_8^{16} \to
        V_8$, которое определяется следующим образом:
        \begin{align*}
          l(a_{15}, \dots, a_0) &=
            \triangledown(148 \cdot \Delta(a_{15}) + 32 \cdot \Delta(a_{14}) + 133 \cdot \Delta(a_{13}) +\\
            &+ 16 \cdot \Delta(a_{12}) + 194 \cdot \Delta(a_{11}) + 192 \cdot \Delta(a_{10}) +\\
            &+ 1 \cdot \Delta(a_9) + 251 \cdot \Delta(a_8) + 1 \Delta(a_7) + 192 \cdot \Delta(a_6) +\\
            &+ 194 \cdot \Delta(a_5) + 16 \cdot \Delta(a_4) + 133 \cdot \Delta(a_3) +\\
            &+ 32 \cdot \Delta(a_2) + 148 \cdot \Delta(a_1) + 1 \cdot \Delta(a_0))
        \end{align*}
        для любых $a_i \in V_8$, $i = 0, 1, \dots, 15$, где операции
        сложения и умножения осуществляются в поле $\mathbb{F}$, а константы
        являются элементами поля в указанном ранее смысле.
    \end{enumerate}
  \item
    \textbf{Преобразования.}

    При реализации алгоритмов шифрования используются следующие преобразования:
    \begin{equation*}
      X[k] : V_{128} \to V_{128}, X[k](a) = k \oplus a
    \end{equation*}
    где $k, a \in V_{128}$.

    \begin{equation*}
      S : V_{128} \to V_{128}, S(a) = S(a_{15} \| \dots \| a_0) =
      \pi(a_{15}) \| \dots \| \pi(a_0)
    \end{equation*}
    где $a = a_{15} \| \dots \| a_0 \in V_{128}, a_i \in V_8, i = 0, 1, \dots, 15$.

    \begin{equation*}
      R : V_{128} \to V_{128}, R(a) = R(a_{15} \| \dots \| a_0) =
      l(a_{15}, \dots, a_0) \| a_{15} \| \dots \| a_1
    \end{equation*}
    где $a = a_{15} \| \dots \| a_0 \in V_{128}, a_i \in V_8, i = 0, 1, \dots, 15$.

    $R^{-1} : V_{128} \to V_{128}$ --- преобразование, обратное к преобразованию
    $R$, которое может быть вычислено, например, следующим образом:
    \begin{equation*}
      R^{-1}(a) = R^{-1}(a_{15} \| \dots \| a_0) = a_{14} \| a_{13} \| \dots \|
      a_0 \| l(a_{14}, a_{13}, \dots, a_0, a_{15})
    \end{equation*}
    где $a = a_{15} \| \dots \| a_0 \in V_{128}, a_i \in V_8, i = 0, 1, \dots, 15$.

    \begin{equation*}
      L : V_{128} \to V_{128}, L(a) = R^{16}(a)
    \end{equation*}
    где $a \in V_{128}$.

    \begin{equation*}
      L^{-1} : V_{128} \to V_{128}, L^{-1}(a) = (R^{-1})^{16}(a)
    \end{equation*}
    где $a \in V_{128}$.

    \begin{equation*}
      F[k] : V_{128} \times V_{128} \to V_{128} \times V_{128},
      F[k](a_1, a_0) = (LSX[k](a_1) \oplus a_0, a_1)
    \end{equation*}
    где $k, a_0, a_1 \in V_{128}$.
  \item
    \textbf{Алгоритм развёртывания ключа.}

    Алгоритм развёртывания ключа использует итерационные константы $C_i \in
    V_{128},\, i = 1, 2, \dots, 32$, которые определены следующим образом:
    $C_i = L(Vec_{128}(i)),\, i = 1, 2, \dots, 32$.

    Итерационные ключи $K_i \in V_{128},\, i = 1, 2, \dots, 10$, вырабатываются
    на основе исходного ключа $K = k_{255} \| \dots \| k_0 \in V_{256},\,
    k_i \in V_1,\, i = 0, 1, \dots, 255$, и определяются следующим образом:
    \begin{align*}
      K_1 &= k_{255} \| \dots \| k_{128}; \\
      K_2 &= k_{127} \| \dots \| k_0; \\
      (K_{2i + 1}, K_{2i + 2}) &= F[C_{8(i - 1) + 8} \dots F[C_{8(i - 1) + 1}](
      K_{2i - 1}, K_{2i}),\, i = 1, 2, 3, 4
    \end{align*}

  \item
    \textbf{Базовый алгоритм шифрования.}

    \begin{enumerate}
      \item
        Алгоритм зашифрования в зависимости от значений итерационных ключей
        $K_i \in V_{128},\, i = 1, 2, \dots, 10$, реализует подстановку
        $E_{K_1, \dots, K_{10}}$, заданную на множестве $V_{128}$ в
        соответствии с равенством
        \begin{equation*}
          E_{K_1, \dots, K_{10}} = X[K_{10}] LSX[K_9] \dots LSX[K_2] LSX[K_1]
          (a)
        \end{equation*}
        где $a \in V_{128}$.

      \item
        Алгоритм расшифрования в зависимости от значений итерационных ключей
        $K_i \in V_{128},\, i = 1, 2, \dots, 10$, реализует подстановку
        $D_{K_1, \dots, K_{10}}$, заданную на множестве $V_{128}$ в
        соответствии с равенством
        \begin{equation*}
          D_{K_1, \dots, K_{10}}(a) = X[K_1] S^{-1} L^{-1} X[K_2] \dots
          S^{-1} L^{-1} X[K_9] S^{-1} L^{-1} X[K_{10}](a) 
        \end{equation*}
        где $a \in V_{128}$.
    \end{enumerate}
    Сложность алгоритма $c = 2^{256}$.
\end{enumerate}

