summaryrefslogtreecommitdiff
path: root/cryptography/lectures/lecture21.tex
diff options
context:
space:
mode:
Diffstat (limited to 'cryptography/lectures/lecture21.tex')
-rw-r--r--cryptography/lectures/lecture21.tex276
1 files changed, 276 insertions, 0 deletions
diff --git a/cryptography/lectures/lecture21.tex b/cryptography/lectures/lecture21.tex
new file mode 100644
index 0000000..688b6e2
--- /dev/null
+++ b/cryptography/lectures/lecture21.tex
@@ -0,0 +1,276 @@
+% Лекция 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}
+