summaryrefslogtreecommitdiff
path: root/cryptography/lectures/lecture24.tex
blob: 8304647de62c8c148315f483b120a0193723950d (plain)
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
% Лекция 24 (07.04.23)

\section{Хэш-функции}

\subsection{Основные свойства}

Пусть $V$ --- некоторый конечный алфавит, через $V^*$ обозначается совокупность
всех слов в этом алфавите, то есть множество конечных последовательностей,
составленных из элементов множества $V$.

Пусть $k$ --- натуральное число, через $V^k$ обозначим множество всех слов
длины $k$ над алфавитом $V$.

\emph{Хэш-функция} --- отображение $h : V^* \to V^k$, которое каждому слову
произвольной длины сопоставляет слово длины $k$. Если $p \in V^*$, то $h(p)$
называется \emph{свёрткой слова $p$} или \emph{digest для $p$}.

В криптографии хэш-функции применяются для решения следующих задач:
\begin{enumerate}
  \item
    Построения систем контроля целостности данных при их передаче или хранении.

    В данном случае для каждого набора данных вычисляется значение хэш-функции
    (называемое \emph{кодом аутентификации} сообщения или \emph{имитовставкой}),
    которое передаётся или хранится вместе с самими данными.

    При получении данных пользователь вычисляет значение свёртки и сравнивает с
    имеющимся контрольным значением. Несовпадение говорит об изменении данных.

    Данная хэш-функция должна позволять осуществлять обнаружение не только
    случайных ошибок в наборах данных, возникающих при их хранении и передаче,
    но и сигнализировать об активных атаках злоумышленника, пытающегося
    осуществить навязывание ложной информации.

    Для этого хэш-функция должна зависеть от секретного параметра --- ключа
    пользователя, который должен быть известен передающей и проверяющей
    сторонам. Такие хэш-функции называются \emph{ключевыми}.

    Имитовставки, формируемые с помощью ключевых хэш-функций, не должны
    позволять противнику создавать поддельные сообщения при атаках типа имитация
    и модифицировать передаваемые сообщения при атаках типа <<подмена>>;
  \item
    Аутентификации источника данных.

    В данном случае стороны друг другу не доверяют, поэтому в такой ситуации
    применяют схемы цифровой подписи, позволяющие осуществлять аутентификацию
    источника данных.

    Как правило, при этом сообщение сначала <<сжимается>> с помощью хэш-функции,
    а затем подписывается личной подписью с помощью секретного ключа
    пользователя.

    В данном случае хэш-функция не зависит от секретного ключа, может быть
    фиксирована и известна всем.

    Основными требованиями к ней являются гарантии невозможности подмены
    подписанного документа, а также подбора двух различных сообщения
    с одинаковым значением хэш-функции (такая пара сообщений образует
    \emph{коллизию}).

    Как правило, хэш-функции строят на основе так называемых \emph{одношаговых
    сжимающих функций $y = f(x_1, x_2)$} двух переменных, где $x_i$ и $y$ ---
    двоичные векторы длины $m$ и $n$ соответственно, причём $n$ --- длина
    свёртки.

    Для получения значения $h(M)$ сообщение $M$ сначала разбивается на блоки
    длины $m$ (последний блок при необходимости дополняется до полного), а
    затем к полученным блокам $M_1, M_2, \dots, M_N$ применяют следующую
    последовательную процедуру вычисления свёртки:
    % TODO: сделать ссылку и нумерацию
    \begin{align*}
      H_0 &= v; \\
      H_i &= f(M_i, H_{i - 1}),\, i = 1, \dots, N; \quad (6.1) \\
      h(M) &= H_N;
    \end{align*}
    Здесь $v$ --- некоторый фиксированный начальный вектор.

    Если функция $f$ зависит от ключа, то этот вектор можно положить равным
    нулевому вектору, иначе этот вектор можно составить из фрагментов,
    указывающих дату, время, номер сообщения и т.~п.

    При таком подходе свойства хэш-функции $h$ полностью определяются свойствами
    одношаговой сжимающей функции $f$.

    Отображение $h : V^* \to V^k$ является \emph{криптографической
    (односторонней) хэш-функцией}, если оно удовлетворяет следующим четырём
    условиям:
    \begin{enumerate}
      \item
        Для любого слова $p \in V^*$ значение $h(p)$ вычислительно легко
        устанавливается;
      \item
        \emph{(Противодействие определению прообраза)} Если известно, что $q$
        является свёрткой некоторого слова, то практически невозможно найти
        слово $p$, для которого $h(p) = q$;
      \item
        \emph{(Противодействие обнаружению второго прообраза)} Для данного слова
        $p$ невозможно найти другое слово $p'$ с такой же свёрткой: $h(p') =
        h(p)$;
      \item
        \emph{(Противодействие коллизии)} Невозможно найти два разных слова $p$
        и $p'$ с одинаковой свёрткой: $h(p) = h(p')$.
    \end{enumerate}
\end{enumerate}


\subsection{Бесключевые и ключевые хэш-функции}

\paragraph{Ключевые функции хэширования.}

Данные функции называются \emph{кодами аутентификации сообщений} (MAC) и
применяются в системах с симметричными ключами.

Они дают возможность без дополнительных средств гарантировать правильность
источника данных и целостность данных в системах с доверяющими друг другу
пользователями.

В криптографических приложениях к ним предъявляются следующие основные
требования:
\begin{itemize}
  \item
    Невозможность фабрикации (высокая сложность подбора сообщения с правильным
    значением свёртки);
  \item
    Невозможность модификации (высокая сложность подбора для заданного сообщения
    с известным значением свёртки другого сообщения с правильным значением
    свёртки).
\end{itemize}

Иногда эти свойства объединяют в одно более сильное свойство --- свойство
\emph{вычислительной устойчивости}: высокая сложность подбора для заданного
множества сообщения $\set{x_1, \dots, x_t}$ с известными значениями свёрток ещё
одного сообщения $x$, $x \neq x_i$, $i = 1, \dots, t$, с правильным значением
свёртки.

От ключевых хэш-функций не требуется устойчивости к коллизиям. Обычные атаки на
ключевые хэш-функции заключаются в имитации, а также в подмене передаваемых
сообщений с целью навязывания приёмной стороне ложных сообщений.

Типы построения:
\begin{enumerate}
  \item
    В качестве примера хэш-функции, построенной на основе одношаговой сжимающей
    функции --- алгоритм, который совпадает с режимом выработки имитовставки
    в ГОСТ Р 34.13-2015.
  \item
    Ещё одной основой для построения ключевых хэш-функций могут служить
    бесключевые хэш-функции: для вычисления значения свёртки ключ приписывается
    к исходному сообщению, а именно
    \begin{align*}
      H &= h(k, y, M, k), \text{или} \\
      H &= h(k, y_1, h(k, y_2, M)),
    \end{align*}
    где $y, y_1, y_2$ --- дополнения ключа $k$ до размера, кратного длине блока
    $n$.
  \item
    Также существуют ключевые хэш-функции, разработанные независимо с учётом
    эффективной реализации на современных ЭВМ (например, в алгоритме MAA
    (message authenticator algorithm)).
\end{enumerate}


\paragraph{Бесключевые функции хэширования.}

Данные хэш-функции называются кодами обнаружения ошибок (MDC, MIC). Они дают
возможность с помощью дополнительных средств (шифрования, использования
защищённого канала или цифровой подписи) гарантировать целостность данных.

Могут применяться в системах как с доверяющими, так и не доверяющими друг
другу пользователями.

Обычно требуется выполнение следующих свойств:
\begin{itemize}
  \item
    Однонаправленность (высокая сложность нахождения сообщения с заданным
    значением свёртки);
  \item
    Устойчивость к коллизиям (высокая сложность нахождения пары сообщения с
    одинаковыми значениями свёртки);
  \item
    Устойчивость к нахождению второго прообраза (высокая сложность нахождения
    второго сообщения с тем же значением свёртки для заданного сообщения с
    известным значением свёртки).
\end{itemize}

% TODO: утв 6.1, ссылка на уравнение
\begin{statement}
  Если функция хэширования $h$ построена на основе одношаговой сжимающей
  функции $f$ по правилу (6.1), то из устойчивости к коллизиям функции $f$
  следует устойчивость к коллизиям функции $h$.
\end{statement}

% TODO: утв 6.2
\begin{statement}
  Если хэш-функция устойчива к коллизиям, то она устойчива к нахождению второго
  прообраза.
\end{statement}

% TODO: утв 6.3
\begin{statement}
  Устойчивая к коллизиям функция не обязана быть однонаправленной.
\end{statement}

% TODO: утв 6.4
\begin{statement}
  Пусть $h : X \to Y$ --- хэш-функция и $|X| > 2|Y|$. Тогда если существует
  эффективный алгоритм обращения функции $h$, то существует вероятностный
  алгоритм нахождения коллизии функции $h$ с вероятностью успеха, большей
  $\frac{1}{2}$.
\end{statement}

Пусть $E_k$ --- алгоритм блочного шифрования, $n$ --- размер блока, $l$ ---
размер ключа, $G$ --- некоторое отображение, ставящее в соответствие вектору
длины $n$ вектор длины $l$. Примеры одношаговых сжимающих функций, построенных
на основе алгоритма $E_k$:
\begin{itemize}
  \item $f(x, H) = E_x(H) \oplus H$ (Дэвис --- Мейер);
  \item $f(x, H) = E_{G(H)}(x) \oplus x$ (Матиас --- Мейер --- Осеас);
  \item $f(x, H) = E_{G(H)}(x) \oplus x \oplus H$ (Миагучи --- Принель).
\end{itemize}

{\LARGE TODO: дописать}