Skip to content

Commit

Permalink
Переписан раздел про структуру Меркла-Дамгора
Browse files Browse the repository at this point in the history
  • Loading branch information
vlsergey committed Jan 14, 2022
1 parent 13ab927 commit e1e2006
Show file tree
Hide file tree
Showing 5 changed files with 777 additions and 16 deletions.
1 change: 1 addition & 0 deletions _settings.tex
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ \chapter*{#1}%
\newcommand{\PK}{\textrm{PK}}
\newcommand{\SK}{\textrm{SK}}

\newcommand{\langda}[1]{дат. \foreignlanguage{danish}{\textit{#1}}}
\newcommand{\langde}[1]{нем. \foreignlanguage{german}{\textit{#1}}}
\newcommand{\langfr}[1]{фр. \foreignlanguage{french}{\textit{#1}}}
\newcommand{\langen}[1]{англ. \foreignlanguage{english}{\textit{#1}}}
Expand Down
18 changes: 2 additions & 16 deletions hash-functions/index.tex
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,6 @@ \chapter{Криптографические хеш-функции}\label{chapter

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

\example
Приведём пример метода построения хеш-функции, называемого методом Меркла~---~Дамгарда\index{структура!Меркла~---~Дамгарда}~\cite{Merkle:1979, Merkle:1990, Damgard:1990}.

Пусть имеется файл $X$ в виде двоичной последовательности некоторой длины. Разделяем $X$ на несколько отрезков фиксированной длины, например по 256 символов: $m_{1} ~\|~ m_{2} ~\|~ m_{3} ~\|~ \ldots ~\|~ m_{t}$. Если длина файла $X$ не является кратной 256 битам, то последний отрезок дополняем нулевыми символами и обозначаем $m'_{t}$.
Обозначим за $t$ новую длину последовательности. Считаем каждый отрезок $m_i, ~ i = 1, 2, \dots, t$ двоичным представлением целого числа.

Для построения хеш-функции используем рекуррентный способ вычисления. Предварительно введём вспомогательную функцию $\chi(m, H)$, называемую функцией компрессии или сжимающей функцией. Задаём начальное значение $H_{0} = 0^{256} \equiv \underbrace{000 \ldots 0}_{256} $. Далее вычисляем:
\[ \begin{array}{l}
H_1 = \chi( m_1, H_0), \\
H_2 = \chi( m_2, H_1), \\
\dots,\\
H_t = \chi( m'_t, H_{t-1}). \\
\end{array} \]
Считаем $H_{t} = h(X)$ хеш-функцией.
\exampleend

В программировании к свойствам хорошей хеш-функции относят:
\begin{itemize}
\item быструю скорость работы;
Expand Down Expand Up @@ -52,6 +36,8 @@ \chapter{Криптографические хеш-функции}\label{chapter

При произвольной длине последовательности $X$ длина хеш-функции $H(X)$ в российском стандарте ГОСТ Р 34.11-94 равна 256 символам, в американском стандарте SHA несколько различных значений длин: 160, 192, 256, 512 символов.

\input{merkle-damgard.tex}

\input{MD5.tex}

\input{GOST_R_34.11-94.tex}
Expand Down
34 changes: 34 additions & 0 deletions hash-functions/merkle-damgard.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
\section{Структура Меркла~---~Дамгора}\index{кострукция!Меркла~---~Дамгора|(}
\selectlanguage{russian}

Приведём пример метода построения хеш-функции, называемого структурой (конструкцией, методом) Меркла~---~Дамгора (рис.~\ref{fig:merkle-damgard}), впервые описанной в кандидатской диссертации Ральфа Меркла в 1979 году. Меркл и Дамгор независимо друг от друга показали, что если раундовая функция сжатия (обозначенная $f$ на рис.~\ref{fig:merkle-damgard}) устойчива к коллизиям, то итоговая хеш-функция будет также устойчива (\langen{Ralph Charles Merkle}, \langda{Ivan Bjerre Damgård}, \cite{Merkle:1979, Merkle:1990, Damgard:1990}).

\begin{figure}[htb]
\centering
\includegraphics[width=0.95\textwidth]{pic/merkle-damgard}
\caption{Структура Меркла~---~Дамгора}
\label{fig:merkle-damgard}
\end{figure}

Пусть есть задан открытый текст $M$ в виде двоичной последовательности некоторой длины. Текст дополняется, во-первых, дополнением (паддингом), во-вторых, длиной исходного сообщения таким образом, чтобы после дополнения обрабатываемая последовательность можно было разбить на целое число блоков фиксированной длины $M_1, M_2, \dots, M_n$.

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

\[\begin{array}{l}
H_0 = \text{IV},\\
H_i = f ( H_{i-1}, M_i ).\\
\end{array}\]

В зависимости от хеш-функции структура может быть дополнена финальным преобразованием, в котором вторым аргументом будет ещё одна некоторая функция от исходного сообщения. Например, в хеш-функции <<Стрибог>>\index{хеш-функция!Стрибог} таким аргументом является арифметическая функция всех блоков исходного открытого текста.

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

\begin{itemize}
\item Атака на нахождение второго прообраза (для некоторого известного открытого текста) может быть выполнена за $2^n / | M |$ операций, где $| M |$ -- длина открытого текста. Это меньше, чем требуется операций для полного перебора ($2^n$), особенно для длинных сообщений.
\item Если известен способ нахождения пары коллизий, то множественные коллизии найти незначительно сложнее.
\item В отсуствие финального преобразования при заданном значении хеш-функции $h = H(M)$ (и неизвестном исходном сообщении $M$) можно легко найти значение $H( pad(M) \| M' )$, где $pad(M)$ -- функция дополнения, а $M'$ -- выбранный злоумышленником дополнительный текст к исходному сообщению.
\end{itemize}

С использованием данной конструкции построены такие криптографические хеш-функции, как MD4\index{хеш-функция!MD4}, SHA-1\index{хеш-функция!SHA-1}, SHA-2\index{хеш-функция!SHA-2}, российский стандарт ГОСТ~Р~34.11-2012 (<<Стрибог>>)\index{хеш-функция!Стрибог} и многие другие.

\index{кострукция!Меркла~---~Дамгора|)}
Loading

0 comments on commit e1e2006

Please sign in to comment.