1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
% Лекция 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}
|