diff --git a/_settings.tex b/_settings.tex index 6c57bef26..c6d972e8e 100644 --- a/_settings.tex +++ b/_settings.tex @@ -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}}} diff --git a/hash-functions/index.tex b/hash-functions/index.tex index bbd2fe23f..5f4e536cd 100644 --- a/hash-functions/index.tex +++ b/hash-functions/index.tex @@ -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 быструю скорость работы; @@ -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} diff --git a/hash-functions/merkle-damgard.tex b/hash-functions/merkle-damgard.tex new file mode 100644 index 000000000..421e3bbbe --- /dev/null +++ b/hash-functions/merkle-damgard.tex @@ -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{кострукция!Меркла~---~Дамгора|)} \ No newline at end of file diff --git a/hash-functions/pic/merkle-damgard.graphml b/hash-functions/pic/merkle-damgard.graphml new file mode 100644 index 000000000..ca9991b23 --- /dev/null +++ b/hash-functions/pic/merkle-damgard.graphml @@ -0,0 +1,740 @@ + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {"version":"2.0.0","theme":{"name":"light","version":"1.0.0"}} + + + 1 + + + + + + + + + + + 2 + + + + + + + + + + + 3 + + + + + + + + + + + 4 + + + + + + + + + + + 5 + + + + + + + + + + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + + + + дополнение + + + + + + + + + + + + + + + + + + + + 8 + + + + длина + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + 11 + + + + M₁ + + + + + + + + + + + + + + + + + 12 + + + + M₂ + + + + + + + + + + + + + + + + + 13 + + + + ... + + + + + + + + + + + + + + + + + 14 + + + + ... + + + + + + + + + + + + + + + + + 15 + + + + Mₙ₋₁ + + + + + + + + + + + + + + + + + + + + + 16 + + + + Mₙ + + + + + + + + + + + + + + + + + + + + + + + + + + 17 + + + + IV + + + + + + + + + + + + + + + + 18 + + + + f + + + + + + + + + + + + + + + + + + 19 + + + + f + + + + + + + + + + + + + + + + + + 20 + + + + f + + + + + + + + + + + + + + + + + + 21 + + + + f + + + + + + + + + + + + + + + + + + 22 + + + + f + + + + + + + + + + + + + + + + + + 23 + + + + f + + + + + + + + + + + + + + + + + + 24 + + + + + + + + + + + + + + + + + + + + + + + + + + 25 + + + + ... + + + + + + + + + + + + + + + + 26 + + + + H + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/hash-functions/pic/merkle-damgard.png b/hash-functions/pic/merkle-damgard.png new file mode 100644 index 000000000..10285edde Binary files /dev/null and b/hash-functions/pic/merkle-damgard.png differ