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