% Лекция 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: дописать}
