% Лекция 25 (14.04.23) \subsection{Анализ хэш-функций} \paragraph{Использование парадокса <<дней рождений>>.} Существует два способа вскрытия однонаправленных хэш-функций грубой силой: \begin{enumerate} \item Дано значение хэш-функции сообщения $H(M)$, злоумышленник хочет уметь создавать другой документ $M'$ такой, что $H(M') = H(M)$; \item Злоумышленник хочет найти два случайных сообщения $M$ и $M'$ такие, что $H(M) = H(M')$. Такой способ называется <<столкновением>> и является более простым, чем предыдущий. \end{enumerate} Парадокс дней рождений является статистической проблемой. Сколько человек должно собраться в одной комнате, чтобы с вероятностью $\frac{1}{2}$ хотя бы у кого-нибудь из них был бы общий с Вами день рождения? Ответ --- 183. Сколько людей должно собраться, чтобы с вероятностью $\frac{1}{2}$ хотя бы у двоих из них был бы общий день рождения? Ответ --- 23. 23 человека, находящихся в одной комнате, образуют 253 различных пар. Найти кого-нибудь с тем же днём рождения --- аналогия с первым способом вскрытия, найти двух человек с произвольным одинаковым днём рождения --- аналогия со вторым способом, поэтому его также называют <<вскрытие в день рождения>>. Предположим, что однонаправленная хэш-функция с длиной хэш-кода $n$ бит безопасна, и лучшим способом её вскрытия является вскрытие грубой силой. Поиск сообщения, хэш-значение которого совпадает с заданным, в среднем потребовал бы хэширования $2^n$ случайных сообщений. А для обнаружения двух сообщения с одинаковым хэш-значением потребуется только $2^\frac{n}{2}$ случайных сообщений. ЭВМ, которая хэширует 1 миллион сообщения в секунду, потребовалось бы 600000 лет, чтобы найти второе сообщение с тем же 64-битовым хэш-значений. Тот же компьютер сможет найти пару сообщений с общим хэш-значением примерно за 1 час. Это означает, что если есть опасность вскрытия в день рождения необходимо выбирать длину хэш-значения в 2 раза длиннее, чем потребовалось бы в противном случае. Например, если необходимо уменьшить вероятность взлома системы до 1 шанса из $2^{80}$, надо использовать 160-битовую однонаправленную хэш-функцию. \paragraph{Атака <<встреча посередине>>.} Данная атака направлена на вычисление прообраза для некоторого хэш-значения. Атака <<встреча посередине>> считается одним из вариантов атаки, использующей парадокс <<дней рождения>>, хотя она и используется не для поиска коллизий. Атака применима к алгоритмам хэширования, раздельно обрабатывающим различные фрагменты хэшируемых сообщения, при этом возможно инвертирование данной обработки. Предположим, алгоритм хэширования $\fn{hash}()$ можно представить как совокупность алгоритма $\fn{hash1}()$, обрабатывающего первую половину сообщения, и алгоритма $\fn{hash2}()$, обрабатывающего вторую половину (см. пример на рисунке). % TODO: рис 1 Цель атакующего --- получение поддельного сообщения, хэш которого соответствует заданному значению $H$ (предположим, некий документ с таким хэшем подписан субъектом атаки). В атаке, использующей парадокс <<дней рождения>>, злоумышленник генерирует множество вариантов корректного и поддельного сообщений, после чего выполняет поиск коллизии. Здесь же злоумышленник генерирует множество вариантов первой половины поддельного сообщения и множество вариантов второй половины. Каждый из вариантов первой половины обрабатывается алгоритмом $\fn{hash1}()$: \begin{equation*} T_x = \fn{hash1}(M_{1_x}, IV), \end{equation*} где $M_{1_x}$ --- один из вариантов первой половины сообщения; $T_x$ --- промежуточное значение. Каждый из вариантов второй половины сообщения обрабатывается алгоритмом, обратным алгоритму $\fn{hash2}()$: \begin{equation*} T_y = \fn{hash2}^{-1}(M_{2_y}, H), \end{equation*} где $M_{2_y}$ --- один из вариантов второй половины сообщения. Атакующий выполняет поиск совпадений значений $T$; при нахождении совпадения неких $T_i = T_j$ можно считать, что соответствующие им половины сообщений $M_i$ и $M_j$ формируют то самое требуемое злоумышленнику поддельное сообщение. Таким образом, в процессе этой атаки сравниваются на совпадение не хэш-значения, а промежуточные варианты. Атака существенно более эффективна, чем описанный поиск коллизий с помощью парадокса <<дней рождения>>. Противодействие подобным атакам состоит в использовании в алгоритмах хэширования неинвертируемых преобразований. \paragraph{Специфические атаки на хэш-функции, построенные на базе блочных шифров.} Некоторые слабости блочных шифров не являются критичными в тех случаях, когда шифр используется для защиты конфиденциальности; однако, они могут привести к успешным атакам в тех случаях, когда блочный шифр используется в качестве основы для хэш-функции. В качестве примера таких слабостей можно привести свойство комплементарности ключей алгоритма шифрования DES (или свойство дополнительности шифра: $y = E_k(x) \implies \overline{y} = E_\overline{k}(\overline(x))$, слабые ключи и неподвижные точки (имеются в виду неподвижные точки в алгоритме шифрования, которые определяются на определённом ключе эквивалентен самому незашифрованному сообщению). Эти слабости могут привести к существенному упрощению поиска коллизий (который становится тривиальным при использовании свойства комплементарности ключей) или к использованию в различных целях манипуляций на уровне блоков и неподвижных точек. Не менее критичным для использования блочных шифров в качестве основы для хэш-функций являются следующие проблемы: \begin{itemize} \item наличие эквивалентных ключей; \item возможность атаки на связанных ключах. \end{itemize} Таким образом, использование алгоритма блочного шифрования для построения хэш-функции является допустимым только в том случае, если алгоритм шифрования обладает безупречной с точки зрения криптостойкости процедурой ключа. \subsection{Современные криптографические хэш-функции и стандарты} \paragraph{MD5.} Хэш-функция MD5 была разработана Р. Ривестом в 1991 году как усиленный вариант хэш-функции MD4. Необходимость замены была вызвана тем, что для хэш-функции MD4 сложность вычисления коллизий оказалась невысокой --- около 1 минуты на персональном компьютере. Длина аргумента хэш-функции может быть произвольной, длина значения --- 128 бит (отсюда следует, что сложность нахождения коллизии не может превышать $2^{64}$ операций вычисления хэш-функции). В ходе вычисления используются следующие функции 32-разрядных аргументов $u$, $v$, $w$: \begin{align*} f_1(u, v, w) &= uv \lor \overline{u}w; \\ f_2(u, v, w) &= uw \lor v\overline{w}; \\ f_3(u, v, w) &= u \oplus v \oplus w; \\ f_4(u, v, w) &= v \oplus (u \lor \overline{w}), \end{align*} % TODO: дописать?? % где символ $\lor$ --- поразрядная дизъюнкция векторов, символ поразрядной % коньюнкции С учётом равенств $\overline{a} = a \oplus 1$ и $a \lor b = a \oplus b \oplus ab$, эти функции можно записать в терминах кольца $G_n$: \begin{align*} f_1(u, v, w) &= w \oplus u (v \oplus w); \\ f_2(u, v, w) &= v \oplus w (u \oplus v); \\ f_3(u, v, w) &= u \oplus v \oplus w; \\ f_4(u, v, w) &= 1 \oplus v \oplus w (1 \oplus u). \end{align*} Каждая из этих булевых функций является сбалансированной. Булевы функции $f_1$, $f_2$, $f_4$ имеют нелинейность 2, булева функция $f_3$ аффинная (имеет нелинейность 0). На этапе предвычислений определяются следующие параметры: \begin{enumerate} \item 64 константы по 32 бита каждая: $y[j] = |\sin(j + 1)|$ для $o \leq j \leq 63$; \item Три перестановки $z[\cdot]$ на множестве $(0, 1, \dots, 15)$ как арифметические прогрессии в $\Z_{16}: z[16 \dots 31]$ --- прогрессия с первым членом 1 и разностью 5, $z[32 \dots 47]$ --- прогрессия с первым членом 5 и разностью 3, $z[48 \dots 63]$ --- прогрессия с первым членом 0 и разностью 7; \end{enumerate} % TODO: дописать