Структура Меркла — Дамгора


Структура Меркла — Дамгора (англ. Merkle–Damgård construction, MD) — метод построения криптографических хеш-функций, предусматривающий разбиение входных сообщений произвольной длины на блоки фиксированной длины и работающий с ними по очереди с помощью функции сжатия, каждый раз принимая входной блок с выходным от предыдущего прохода.

Впервые описана в 1979 году в докторской диссертации Ральфа Меркла[1]. Меркл и Дамгор[англ.] независимо показали: если функция сжатия устойчива к коллизиям, то и хеш-функция будет также устойчива[2][3] — чтобы доказать устойчивость структуры, сообщение дополняется блоком, который кодирует длину первоначального сообщения (упрочнение Меркла — Дамгора).

Структура предусматривает вектор инициализации — фиксированное значение, которое зависит от реализации алгоритма, и которое применяется к первому проходу — применению функции сжатия к нему и первому блоку сообщения. Результат каждого прохода передаётся на следующий вход и очередному блоку сообщения; последний блок дополняется нулями, если необходимо, также, добавляется блок с информацией о длине целого сообщения. Для упрочнения хеша последний результат иногда пропускают через функцию финализации (англ. finalisation function), которая может использоваться также для уменьшения размера выходного хеша сжатием результата последнего применения в хеш меньшего размера или чтобы гарантировать лучшее смешивание битов и усилить влияние небольшого изменения входного сообщения на хеш (обеспечить лавинный эффект). Функция финализации часто строится с использованием функции сжатия.

Популярность структуры Меркла — Дамгора обусловлена следующим результатом: если односторонняя функция сжатия устойчива к коллизиям, то и хеш-функция, построенная на её основе, будет также устойчива к коллизиям. При этом структура имеет несколько нежелательных свойств:

Для того, чтобы передать сообщение в функцию сжатия, необходимо дополнить последний блок до полного определёнными данными (обычно нулями). Например, для сообщения «HashInput» и размера блока для функции сжатия 8 байт (64 бит) получится 2 блока: