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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|
% Лекция 15 (12.12.22)
\subsection{Поточная шифрсистема RC4}
RC4 представляет собой поточный шифр с переменной длиной ключа.
Алгоритм разработан в 1987 году Р. Ривестом для компнии RSA Data Security
Алгоритм работает в режиме обратной связи по выходу. Ключевая последовательность
не зависит от исходного текста. Структура алгоритма включает блок замены
размерностью $8 \times 8 : S_0, \dots, S_{255}$.
Блок замены представляет собой зависимую от ключа переменной длины перестановку
чисел $0, \dots, 255$.
Имеется два счётчика $i$ и $j$, первоначально равные 0.
Для генерирования псевдослучайного байта выполняются следующие действия
\begin{align*}
i &= (i + 1) \pmod{256} \\
j &= (j + S_i) \pmod{256} \\
&\text{переставить } S_i \text{ и } S_j \\
t &= (S_i + S_j) \pmod{256} \\
k &= S_i \\
\end{align*}
Затем байт $k$ складывается по модулю 2 с байтом исходного текста для получения
криптограммы.
Блок замены инициализируется следующим образом. Сначала он заполняется линейно:
$S_0 = 0, S_1 = 1, \dots S_{255} = 255$.
Затем заполняется ещё один 256-байтовый массив ключом, при этом ключ может
повторяться необходимое число раз для заполнения всего массива $k_0, \dots,
k_{255}$.
Счётчик $j$ устанавливается в 0. После этого производятся следующие действия:
\begin{algorithm}
\For {$i = 0$ \to 255} {
$j = (j + k_i + S_i) \pmod{256}$\;
Переставить $S_i$ и $S_j$\;
}
\end{algorithm}
\subsection{Методы анализа поточных шифров}
Некоторые методы анализа поточных шифров на примере шифров гаммирования:
\begin{itemize}
\item Исследование вероятностных характеристик гаммы;
\item
Попытки линеаризации уравнений гаммообразования, то есть сведения задачи
нахождения ключей криптографических алгоритмов к решению некоторой системы
линейных уравнений;
\item
Применение методов анализа, основанные на наличии у функции усложнения
хороших приближений в классе линейных функций;
\item
Необходимо учитывать наличие между знаками гаммы зависимостей комбинаторного
характера.
\end{itemize}
\section{Блочные шифрсистемы}
\emph{Блочный шифр} --- шифр, в котором открытый текст перед шифрованием
разбивается на блоки, состояние из нескольких знаков, то есть исходное
сообщение обрабатывается блоками.
\subsection{Принципы построения}
Как правило, алфавитом, на котором действует блочный шифр, является множество
двоичных векторов-блоков открытого текста одинаковой длины (64, 128 и т. д.).
К. Шеннон сформулировал общий принцип построения шифрующих преобразований ---
принцип \emph{<<перемшивания>>}.
Суть его состоит в требовании, чтобы применение шифрующего преобразования к
наборам аргументов, отличающихся в незначительном числе позиций, приводило к
существенному изменению результата.
Обеспечить выполнение данного требования в сочетании с простотой реализации
конкретного отображения в общем случае представляется затруднительным.
Поэтому К. Шеннон предложил реализовывать сложные преобразования в виде
суперпозиции нескольких простых некоммутирующих отображений, что используется
при построении блочных шифров.
Блочные шифры реализуются путём многократного применения к блокам открытого
текста некоторых базовых преобразований.
Обычно используются базовые преобразования двух типов:
\begin{enumerate}
\item
<<Перемешивающие>> --- сложные в криптографическом отношении локальные
преобразования над отдельными частями шифруемых блоков.
Перемешивание усложняет восстановление взаимосвязи статистических
аналитических свойств открытого текста и криптограммы;
\item
<<Рассеивающие>> --- простые преобразования, переставляющие между собой
части шифруемых блоков.
Рассеивание распространяет влияние одного знака открытого текста на большое
число знаков криптограммы, что позволяет сгладить влияние статистических
свойств открытого текста на свойства криптограммы.
\end{enumerate}
Алгоритм шифрования выполняет некоторое число циклов (итераций). Каждый цикл в
применении преобразований первого и второго типов.
Такой принцип построения даёт возможность реализовать каждый цикл шифрования с
использованием однотипных узлов, а также выполнять расшифрование путём обработки
данных в обратном направлении.
Удобной моделью для реализации базовых преобразований служат \emph{регистры
сдвига}. При этом рассеивающие преобразования определяются функциями обратной
связи, а перемешивающие --- сдвигами информации в регистре.
\subsection{Структура алгоритмов}
\paragraph{Сеть Фейстеля.}
Для построения алгоритмов часто используется \emph{Сеть Фейстеля} (см. рисунок).
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{lecture15/feistel}
\caption{Сеть Фейстеля}
\end{figure}
Преобразование, реализуемое сетью Фейстеля в $i$-м цикле шифрования имеет вид
\begin{equation*}
\begin{cases}
Y_1 = X_2 \\
Y_2 = X_1 \oplus f_i(X_2, k_i)
\end{cases}
\end{equation*}
где $X$ --- входной блок, разделённый на две половины $X_1$ и $X_2$, а $(Y_1,
Y_2)$ --- результат зашифрования блока $X$ на ключе $k_i$ с помощью функции
$f_i$.
Алгоритм шифрования реализуется несколькими итерациями преобразования сети
Фейстеля с использованием ключа $k$.
При этом очередная $i$-я итерация использует в качестве входного блока $X$
результат предыдущей итерации и ключ $k_i$, вычисляемый определённым образом
по ключу $k$.
Функция $f_i$ может зависеть или не зависеть от номера итерации.
Даже если $f_i$ не является обратимой функцией, преобразование сети Фейстеля
обратимо:
\begin{equation*}
\begin{cases}
X_1 = Y_2 \oplus f_i(Y_1, k_i) \\
X_2 = Y_1
\end{cases}
\end{equation*}
На сети Фейстеля основаны, например, алгоритмы шифрования DES, ГОСТ 28147-89,
RC5.
\paragraph{SP-сети.}
В отличие от сети Фейстеля, SP-сети (Substitution-Permutation network,
подстановочно-перестановочная сеть) обрабатывает за один раунд целиком
шифруемый блок.
Обработка данных сводится в основном к заменам и перестановкам зависящим от
ключа $k_i$ (см. рисунок).
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{lecture15/sp}
\caption{SP-сеть}
\end{figure}
SP-сети являются гораздо менее распространёнными, чем сети Фейстеля. На их базе,
например, основаны алгоритмы шифрования Serpent, SAFER+.
\subsection{S-блоки}
Операторы подстановки в блочных шифрах называются S-боксами (блок подстановки,
узлы замены).
На вход в S-бокса подаётся $n$-битовый блок, а на выходе --- $m$-битовый блок,
где $m$ может быть отлично от $n$.
Пусть в S-боксе $x_1, x_2, \dots, x_n$ --- входы, $y_1, y_2, \dots, y_m$ ---
выходы, тогда связь между ними задаёт система уравнений:
\begin{equation*}
\begin{cases}
y_1 = f_1(x_1, x_2, \dots, x_n) \\
y_2 = f_2(x_1, x_2, \dots, x_n) \\
\dots \\
y_m = f_m(x_1, x_2, \dots, x_n) \\
\end{cases}
\end{equation*}
S-боксы делятся на линейные и нелинейные. В линейном S-боксе эту связь можно
записать в виде линейных соотношений:
\begin{equation*}
\begin{cases}
y_1 = a_{11} x_1 \oplus a_{12} x_2 \oplus \dots \oplus a_{1n} x_n \\
y_2 = a_{21} x_1 \oplus a_{22} x_2 \oplus \dots \oplus a_{2n} x_n \\
\dots \\
y_m = a_{m1} x_1 \oplus a_{m2} x_2 \oplus \dots \oplus a_{mn} x_n \\
\end{cases}
\end{equation*}
В нелинейном S-боксе нельзя задать линейные соотношения для каждого выхода.
Пример S-бокса представлен в таблице, где первый бит входа определяет строку,
два следующих бита входа определяют столбец. Два бита на выходе --- это значение
на пересечении выбранных строки и столбца.
\begin{table}[H]
\centering
\begin{tabular}{|c|c|c|c|c|}
\cline{2-5}
\multicolumn{1}{c|}{} &
\textbf{00} & \textbf{01} & \textbf{10} & \textbf{11} \\ \hline
\textbf{0} & 00 & 01 & 10 & 11 \\ \hline
\textbf{1} & 00 & 01 & 10 & 11 \\ \hline
\end{tabular}
\caption{Пример S-блока}
\end{table}
\begin{example}
Вход --- 110; Выход --- 11.
\end{example}
|