forked from vlsergey/infosec
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MAC.tex
69 lines (54 loc) · 8.92 KB
/
MAC.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
\section{Коды аутентификации сообщений}
\selectlanguage{russian}
Для обеспечения целостности и подтверждения авторства информации, передаваемой по каналу связи, используют \textbf{коды аутентификации сообщений}, $\MAC$ (message authentication code).
Кодом аутентификации сообщения называется \emph{криптографическая хэш-функция} $\MAC(K,m)$, зависящая от передаваемого сообщения $m$ и секретного ключа $K$ отправителя $A$, обладающая свойствами цифровой подписи:
\begin{itemize}
\item получатель $B$, используя такой же или другой ключ, имеет возможность проверить целостность и доказать принадлежность информации $A$;
\item код аутентификации невозможно фальсифицировать.
\end{itemize}
Код аутентификации может быть построен либо на симметричной криптосистеме, в таком случае обе стороны имеют один общий секретный ключ, либо на криптосистеме с открытым ключом, в которой $A$ использует свой секретный ключ, а $B$ -- открытый ключ отправителя $A$.
Наиболее универсальный способ аутентификации сообщений через схемы ЭП на криптосистемах с открытым ключом состоит в том, что сторона $A$ отправляет стороне $B$ сообщение
\[ m ~\|~ \textrm{ЭП}(K, h(m)), \]
где $h(m)$ -- криптографическая хэш-функция в схеме ЭП. Для аутентификации большого объема информации этот способ не подходит из-за медленной операции вычисления подписи. Например, вычисление одной ЭП на криптосистемах с открытым ключом занимает порядка 10 мс на ПК. При средней длине IP-пакета 1 Кб, для каждого из которых требуется вычислить код аутентификации, получим максимальную пропускную способность в $\frac{1 ~ \text{Kб}}{10 ~ \text{мс}} = 100$ Кб/с.
Поэтому для большого объема данных, которые нужно аутентифицировать, $A$ и $B$ создают общий секретный ключ аутентификации $K$. Далее код аутентификации вычисляется либо с помощью модификации блокового шифра, либо с помощью криптографической хэш-функции.
Для каждого пакета информации $m$ отправитель $A$ вычисляет $\MAC(K,m)$ и присоединяет его к сообщению $m$:
\[ m ~ \|~ \MAC(K,m). \]
Зная секретный ключ $K$, получатель $B$ может удостовериться с помощью кода аутентификации, что информация не была изменена, фальсифицирована, а была создана отправителем.
Требования к длине кода аутентификации в общем случае такие же, как и для криптографической хэш-функции, то есть длина должна быть не менее 160--256 бит. На практике часто используют усеченный код аутентификации.
Стандартные способы использования кода аутентификации сообщения следующие.
\begin{itemize}
\item Если шифрование данных не применяется, отправитель $A$ для каждого пакета информации $m$ отсылает сообщение
\[ m ~\|~ \MAC(K, m) .\]
\item Если используется шифрование данных симметричной криптосистемой с помощью ключа $K_e$, то код аутентификации с ключом $K_a$ может вычисляться как до, так и после шифрования:
\[ E_{K_e}(m) ~\|~ \MAC(K_a, E_{K_e}(m)) ~~ \text{ или } ~~ E_{K_e}(m ~\|~ \MAC(K_a, m)). \]
\end{itemize}
Первый способ, используемый в IPsec, хорош тем, что для проверки целостности достаточно вычислить только код аутентификации, тогда как во втором случае нужно дополнительно вначале расшифровать данные. С другой стороны, во втором способе, используемом в системе PGP, защищенность кода аутентификации не зависит от потенциальной уязвимости алгоритма шифрования.
Вычисление кода аутентификации от пакета информации $m$ с использованием блокового шифра $E$ осуществляется в виде
\[ \MAC(K, m) = E_K(H(m)), \]
где $H$ -- криптографическая хэш-функция.
Код аутентификации на основе хэш-функции обозначается $\HMAC$ (Hash-based MAC)\index{HMAC} и стандартно вычисляется в виде
\[ \HMAC(K, m) = H(K \| H(K \| m)), \]
где $\|$ является операцией конкатенации битовых строк. Возможно также вычисление в виде
\[ \HMAC(K, m) = H(K \| m \| K). \]
В протоколе IPsec\index{протокол!IPsec} (часть протокола IPv6\index{протокол!IPv6}) используется следующее вычисление кода аутентификации:
\[ \HMAC(K, m) = H((K \oplus ~ \textrm{opad}) ~\|~ H((K \oplus ~ \textrm{ipad}) ~\|~ m)), \]
где $\textrm{opad}$ -- последовательность повторяющихся байтов
\[ \text{\texttt{0x5C}}= [1011100]_2, \]
$\textrm{ipad}$ -- последовательность повторяющихся байтов
\[ \text{\texttt{0x36}} = [00110110]_2, \]
которые инвертируют половину бит ключа. Считается, что использование различных значений ключа повышает криптостойкость.
В протоколе защищенной связи SSL/TLS, используемом в интернет для инкапсуляции протокола HTTP\index{протокол!HTTP} в протокол SSL\index{протокол!SSL/TLS} (HTTPS\index{протокол!HTTPS}), код $\HMAC$ определяется почти так же, как в IPsec. Отличие состоит в том, что вместо операции XOR для последовательностей $\textrm{ipad}$ и $\textrm{opad}$ осуществляется конкатенация:
\[ \HMAC(K, m) = H((K ~\|~ \textrm{opad}) ~\|~ H((K ~\|~ \textrm{ipad}) ~\|~ m)). \]
Двойное хэширование\index{двойное хэширование} с ключом в
\[ \HMAC(K, m) = H(K \| H(K \| m)) \]
применяется для защиты от атаки на расширение сообщений. Вычисление хэш-функции от сообщения $m$, состоящего из $n$ блоков $m_1 m_2 \dots m_n$, можно записать в виде
\[ H_i = f(H_{i-1}, m_i), ~ H_0 \equiv IV = \textrm{const}, ~ H(m) \equiv H_n, \]
где $f$ -- известная сжимающая функция.
Пусть код аутентификации использует одинарное хэширование с ключом:
\[ \MAC(K, m) = H(K \| m) = H (m_0 = K \| m_1 \| m_2 \| \dots \| m_n). \]
Тогда криптоаналитик, не зная секретного ключа, имеет возможность вычислить код аутентификации для некоторого расширенного сообщения $m \| m_{n+1}$:
\[
\MAC(K, m \| m_{n+1}) = \underbrace{H \left( K \| m_1 \| m_2 \| \dots \| m_n \right.}_{\MAC(K, m)} \left. \| m_{n+1} \right) =
\] \[
f(\MAC(K, m), m_{n+1}).
\]