forked from vlsergey/infosec
-
Notifications
You must be signed in to change notification settings - Fork 0
/
diffie-hellman.tex
92 lines (76 loc) · 8.77 KB
/
diffie-hellman.tex
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
\subsection{Протокол Диффи~---~Хеллмана}\index{протокол!Диффи~---~Хеллмана}
\selectlanguage{russian}
Алгоритм с открытым ключом впервые был предложен Диффи и Хеллманом в работе 1976 года <<Новые направления в криптографии>> (\langen{Bailey Whitfield Diffie, Martin Edward Hellman, ``New directions in cryptography''},~\cite{Diffie:Hellman:1976}).
Рассмотрим протокол Диффи~---~Хеллмана обмена информацией двух сторон $A$ и $B$. Задача состоит в том, чтобы создать общий сеансовый ключ.
Пусть $p$ -- большое простое число\index{число!простое}, $g$ -- примитивный элемент группы $\Z_p^*$, ~ $y = g^x \mod p$, причём $p,y,g$ известны заранее. Функцию $y=g^{x} \mod p$ считаем однонаправленной, то есть вычисление функции при известном значении аргумента является лёгкой задачей, а её обращение (нахождение аргумента) при известном значении функции -- трудной.
Протокол обмена состоит из следующих действий.
\begin{enumerate}
\item Сторона $A$ выбирает случайное число $x: ~ 2 \leq x \leq p-1$, вычисляет и передаёт стороне $B$ сообщение:
\[ A \rightarrow B: ~ g^x \mod p. \]
\item Сторона $B$ выбирает случайное число $y: ~ 2\leq y \leq p-1$, вычисляет и передаёт стороне $A$:
\[ A \leftarrow B: ~ g^y \mod p. \]
\item Сторона $A$, используя известные ей значения $x$, $g^{y} \mod p$, вычисляет ключ:
\[ K_{A} =(g^{y})^{x}\mod p=g^{xy} \mod p. \]
\item Сторона $B$, используя известные ей значения $y$, $g^{x} \mod p$, вычисляет ключ:
\[ K_{B} =(g^{x})^{y}\mod p=g^{xy}\mod p. \]
В результате получаем равенство $K_A = K_B = K$.
\end{enumerate}
Таким способом создан общий секретный сеансовый ключ. В каждом новом сеансе используется этот же протокол для создания нового сеансового ключа.
Рассмотрим протокол Диффи~---~Хеллмана в ситуации, когда имеются три легальных пользователя $A,B,C$.
Каждая из сторон $A,B,C$ вырабатывает случайные числа $x,y,z$ соответственно и держит их в секрете.
\begin{enumerate}
\item Первый этап обмена информацией аналогичен вышеописанному обмену информацией между двумя сторонами:
\begin{enumerate}
\item $A \rightarrow B: ~ g^x \mod p$.
\item $B \rightarrow C: ~ g^y \mod p$.
\item $C \rightarrow A: ~ g^z \mod p$.
\end{enumerate}
\item Второй этап состоит из передач сообщений:
\begin{enumerate}
\item $A \rightarrow B: ~ (g^z)^x = g^{zx} \mod p$.
\item $B \rightarrow C: ~ (g^x)^y = g^{xy} \mod p$.
\item $C \rightarrow A: ~ (g^y)^z = g^{yz} \mod p$.
\end{enumerate}
\item На завершающем третьем этапе стороны вычисляют:
\begin{enumerate}
\item $A: ~ K_A = (g^{yz})^x = g^{xyz} \mod p$.
\item $B: ~ K_B = (g^{zx})^y = g^{xyz} \mod p$.
\item $C: ~ K_C = (g^{xy})^z = g^{xyz} \mod p$.
\end{enumerate}
\end{enumerate}
Как видно из произведённых действий, выработанные сторонами $A, B, C$ ключи совпадают: $K_A = K_B = K_C = K$. Следовательно, создан общий секретный сеансовый ключ $K$ для трёх участников.
Таким же образом можно построить протокол Диффи~---~Хеллмана для любого числа легальных пользователей.
Рассмотрим этот двусторонний протокол с точки зрения криптоаналитика, желающего узнать ключ $K$. Предположим, ему удалось перехватить сообщения $g^{x}\mod p$ и $g^{y}\mod p $. Используя заранее известные данные $g,p $ и эти сообщения, криптоаналитик старается найти хотя бы одно из чисел $(x,y)$, то есть решить задачу дискретного логарифма. В настоящее время эта задача считается вычислительно трудной при обычно выбираемых значениях $p\sim 2^{1024}$.
Существует атака активного криптоаналитика\index{криптоаналитик!активный}, названная <<человек посередине>> (man-in-the-middle)\index{атака!<<человек посередине>>}. Пусть имеются две легальные стороны $A$ и $B$ и нелегальная сторона $E$ -- активный криптоаналитик\index{криптоаналитик!активный}, который имеет возможность перехватывать и подменять сообщения как от $A$, так и от $B$:
\[ A \leftrightsquigarrow E \leftrightsquigarrow B. \]
%\[ A \leftrightarrow E \leftrightarrow B. \]
\begin{enumerate}
\item Подмена ключей.
\begin{enumerate}
\item Сторона $A$ передаёт стороне $B$ сообщение:
\[ A \overset{E}{\nrightarrow} B: ~ g^x \mod p. \]
\item Сторона $E$ перехватывает сообщение $g^x \mod p$, сохраняет его и, зная $g$, передаёт стороне $B$ своё сообщение:
\[ E \rightarrow B: ~ g^z \mod p. \]
\item Сторона $B$ передаёт стороне $A$ сообщение:
\[ A \overset{E}{\nleftarrow} B: ~ g^y \mod p. \]
\item Сторона $E$ перехватывает сообщение $g^y \mod p$, сохраняет его и передаёт стороне $A$ своё сообщение:
\[ A \leftarrow E: ~ g^z \mod p \]
или какое-то другое.
\item Таким образом, между сторонами $A$ и $E$ образуется общий секретный ключ $K_{AE}$, между $B$ и $E$ -- ключ $K_{BE}$, причём $A$ и $B$ не знают, что у них ключи со стороной $E$, а не друг с другом:
\[ \begin{array} {l}
K_{AE} = g^{xz} \mod p, \\
K_{BE} = g^{yz} \mod p. \\
\end{array} \]
\end{enumerate}
\item Подмена сообщений.
\begin{enumerate}
\item Сторона $A$ посылает $B$ сообщение $m$, зашифрованное на ключе $K_{AE}$:
% \rightsquigarrow
\[ A \overset{E}{\nrightarrow} B: ~ E_{K_{AE}}(m). \]
\item Сторона $E$ перехватывает сообщение, расшифровывает с ключом $K_{AE}$, возможно, подменяет на $m'$, зашифровывает с ключом $K_{BE}$ и посылает $B$:
\[ E \rightarrow B: ~ E_{K_{BE}}(m'). \]
\item То же самое происходит при обратной передаче от $B$ к $A$.
\end{enumerate}
\end{enumerate}
Криптоаналитик $E$ имеет возможность перехватывать и подменять все передаваемые сообщения. Если по тексту письма нельзя обнаружить участие криптоаналитика в обмене информацией, то атака <<человек посередине>>\index{атака!<<человек посередине>>} успешна.
Существует несколько протоколов для защиты от атаки этого типа.