HAIFA

Материал из testwiki
Версия от 09:12, 21 февраля 2023; imported>Gromolyak
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

HAIFA (Шаблон:Lang-en) — итеративный метод построения криптографичеких хеш-функций, являющийся усовершенствованием классической структуры Меркла — Дамгора.

Был предложен в 2007 году в целях повышения устойчивости ко многим атакам и поддержки возможности получать хеш-суммы различных длин. На основе алгоритма были разработаны такие хеш-функции, как BLAKE[1] и SHAvite-3[2].

История

Создателями алгоритма являются Эли Бихам и Ор Дункельман — израильские криптографы из Хайфского университета. Бихам — ученик Ади Шамира, разработавшего большое количество новых криптографических алгоритмов, в том числе взлома существующих; Дункельман — коллега Шамира по одному из проектов, а в дальнейшем продолжил свои исследования самостоятельно[3].

Структура Меркла — Дамгора долгое время считалась устойчивой к атаке на нахождение второго прообраза, пока в 1999 году профессор Принстонского университета Ричард Дин не доказал, что это предположение неверно для длинных сообщений, если при данной функции сжатия возможно легко находить фиксированные точки последовательности. Также на структуру Меркла — Дамгора могла быть успешно произведена атака множественный коллизий и хэрдинг-атака (атака по известному префиксу)[4][5].

Алгоритм

Структура Меркла — Дамгора представляет собой следующий алгоритм:

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

Есть сообщение M, разбитое на несколько частей: M1,M2...Mk. Есть некоторое начальное значение — IV и некоторая функция C, которая подсчитывает промежуточное представление хеш-функции H определённым образом[5]:

h0=IV

Далее итеративно:

hi=C(hi1,Mi)
H(M)=hk

В основу нового алгоритма HAIFA легло добавление количества захешированных бит и некоторого случайного значения. Вместо обычной функции сжатия, которую теперь можно обозначить следующим образом[4]:

{0,1}mc×{0,1}n{0,1}mc, где mc — размер h, n — размер блока, m=mc (чаще всего выходной размер совпадает с размером h)

используется:

{0,1}mc×{0,1}n×{0,1}b×{0,1}s{0,1}mc, где b,s — длины количества бит и соли,

внутреннее же представление подсчитывается (в соответствии с введенными выше обозначениями):

hi=C(hi1,Mi,bits,salt) , где
bits — количество бит, захешированных к этому времени.

Чтобы захешировать сообщение, нужно выполнить следующие шаги:

  1. Дополнить сообщение M в соответствии с нижеописанной схемой.
  2. Подсчитать начальное значение IVm для внутренней ячейки размера m в соответствии с алгоритмом, описанным ниже.
  3. Пройти по всем блокам дополненного сообщения, вычисляя на каждом шаге значение функции сжатия hi от текущего блока Mi, hi1 и теперь уже добавляя соль и bits в качестве аргументов. Если к сообщению добавляется дополнительный блок (в самый конец), то для этого блока выставляем значение bits равное нулю.
  4. Обрезать последнее, выходное, значение функции, если необходимо[4].

Дополнение сообщения

В HAIFA сообщение M дополняется единицей, необходимым количеством нулей, длиной сообщения в битах и размером выходного блока h. Т.е добавляем последовательность (количество нулей в данном случае должно быть таким, чтобы N1+N0N(Mlength+Hsize)modN[4] , где N1, N0 — количество единиц и нулей, N — размер блока:

1+0..0+bits+mc

Хеширование сообщения, дополненного размером выходного блока, избавляет от проблемы нахождения коллизий, так как если два сообщения M1 и M2 хешируются с размерами блока l1 и l2 , то от коллизий спасает именно последний блок. В свою очередь, добавлением bits = 0 в самом последнем блоке, создаётся сигнал для обозначения последнего и дополняющего блока[4].

Возможность дополнения исходного сообщения в данном алгоритме позволяет обрезать захешированное, тем самым изменяя размер конечного хеша[4].

Длина хеша

Часто на практике требуются различные длины итогового хеша (как, например, сделано для SHA-256, у которого существуют две урезанные версии), поэтому в данной структуре также была реализована возможность варьировать его длину с помощью специального алгоритма (чтобы сохранить стойкость к атаке на второй прообраз, нельзя использовать очевидное решение взятия m бит из итогового хеша).

  1. IV — начальное значение
  2. m — желательная длина выхода
  3. Считаем преобразованное начальное значение : IVm=C(IV,m,0,0)
  4. Таким образом получаем m «зашитое» в первые r бит, за которыми следуют 1 и нули.
  5. После того, как посчитался последний блок, итоговым значением являются m бит последнего значения функции сжатия цепочки[4].

Стойкость алгоритма

Доказательство того, что HAIFA устойчив к коллизиям, если функция сжатия устойчива к коллизиям, проводится аналогично доказательству для Меркла — Дамгора[4].

Количество захешированных бит значительно затрудняет поиск и использование фиксированных точек. Даже найдя такие hi и Mi , для которых выполняется hi=C(hi,Mi,bits,salt), нельзя бесконечно размножать эти значения в данном алгоритме, потому что количество битов будет все время меняться[4].

Соль (salt), как и bits, тоже вносит свой вклад в стойкость алгоритма[4]:

  1. Дает возможность устанавливать безопасность хеш-функций в теоретической модели.
  2. Заставляет атаки, базирующиеся на предварительных расчетах, переносить все свои вычисления в онлайн-режим, так как значение соли неизвестно заранее.
  3. Повышает безопасность электронных подписей (так как каждый раз приходится учитывать то, что есть некоторое случайное значение).

Ниже приведены оценки стойкости HAIFA к различным типам атак.

Атаки, основанные на фиксированных точках

Шаблон:Mainref В атаке на второй прообраз ищется такое значение M' , для которого H(M)=hi=H(Mi), то есть хеш от M' равен какому-либо промежуточному значению в итерациях, и далее соединить часть оставшегося сообщения M (находящуюся справа от Mi) с нашим угаданным M'. Однако алгоритм был признан устойчивым к этой атаке, так как в усовершенствованном варианте в конец сообщения дописывался его размер. Ричард Дин же в своей работе указал совершенно новый способ атаки, основанный на предположении о том, что для данной функции C легко найти фиксированные точки (по определению фиксированная точка — та, для которой выполняется соотношение h=C(h,Mi)). В его алгоритме недостающая длина сообщения восполнялась добавлением множества фиксированных точек, то есть мы могли достаточным количеством повторений значения h дополнить нашу длину до нужной.

В данном случае HAIFA защищает от атаки, основанной на фиксированных точках, так как наличие соли и поля, содержащего количество захешированных бит сводит к минимуму вероятность появления повторения значений сжимающей функции[4].

Атака множественных коллизий

Шаблон:Mainref Для множественных коллизий французский криптограф Шаблон:Iw описал возможность нахождения 2t сообщений, имеющих один и тот же хеш. Его работа базируется на факте, что возможно найти t таких одноблочных коллизий, в которых C(hi1,Mi)=C(hi1,Mi*), и далее конструировать различные сообщения, всего 2t вариантов, выбирая на каждом из t шагов либо сообщение Mi, либо Mi* .

Составление сообщения с помощью множественных коллизий

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

Хэрдинг-атака

Шаблон:Mainref Хэрдинг-атака основана на том, что атакующий пытается найти такой суффикс по заданному префиксу, который будет давать нужное значение хеша.

  1. Изначально строится дерево из различных 2t внутренних значений, ищутся сообщения Mj, которые приводят к коллизиям среди этих состояний. То есть в узлах дерева находятся различные значения h, на ребрах — значения Mj.
  2. Строим коллизии по вновь полученным значениям h (с предыдущего уровня дерева) до тех пор, пока не дойдем до конечного значения H.
  3. Затем атакующий получает информацию о префиксе.
  4. Получив эту информацию, он пытается подобрать связующее сообщение между эти префиксом и желаемым суффиксом. Связующее сообщение должно удовлетворять условию, что значение сжимающей функции от него равен одному из внутренних значений h на первом уровне дерева. Далее суффикс строится обычным проходом по дереву (так как на его ребрах уже находятся сообщения, которые приведут к необходимому результату). Ключевым моментом является возможность производить предварительные вычисления, в онлайн-режиме останется подобрать только нужное промежуточное значение h и M.

Доказано, что на HAIFA невозможно провести первую фазу хэрдинг-атаки (построение дерева решений), пока неизвестно значение соли. То есть тот brute-force, который излагался выше, уже провести нельзя. Условие успешного отражения атаки — длина подмешиваемого сообщения, если желаемая сложность атаки ставится на уровне O(2m), должна быть не менее mc2 символов. Если этого правила не придерживаться, то возможны некоторые предварительные расчеты, приводящие к взлому алгоритма. Если значение соли все же было найдено, то потребуется некоторое время для поиска нужного места в сообщении в силу наличия поля bits[4].

Сложность атак на алгоритмы Меркла — Дамгора и HAIFA

Шаблон:Mainref

Тип атаки Идеальная хеш-функция MD HAIFA

(фиксированное значение

соли)

HAIFA

(с различными значениями соли)

Шаблон:Iw

(k'<2s целей)

2mc 2mc 2mc 2mc
Атака на один из первых прообразов 2mc/k 2mc/k 2mc/k 2mc
Атака на второй прообраз

(k блоков)[6][7]

2mc 2mc/k 2mc 2mc
Атака на один из вторых прообразов

(k блоков, k'<2s сообщений)

2mc/k 2mc/k 2mc/k 2mc
Коллизии 2mc/2 2mc/2 2mc/2 2mc/2
Множественные коллизии

(k — количество коллизий)[6]

2mc(k1)/k log2k2mc/2 log2k2mc/2 log2k2mc/2
Herding[8][9] - Offline:2mc/2+t/2

Online:2mct

Offline:2mc/2+t/2

Online:2mct

Offline:2mc/2+t/2+s

Online:2mct

Приложения

HAIFA, по мнению разработчиков, может являться основой для множества криптографических алгоритмов, так как представляет cобой новую усовершенствованную базовую конструкцию. Доказано, что с её использованием могут быть разработаны функции рандомизированного хеширования[10], обёрнутая функция Меркла — Дамгора (Шаблон:Lang-en, RMC[11][12], ширококонвейрного хеша[13].

Ширококонвейерный хеш

Получить конструкцию ширококонвейерного (Шаблон:Lang-en) хеша с помощью HAIFA достаточно легко; в самом алгоритме для повышения сложности длина внутренних блоков была сделана в два раза больше, чем длина конечного блока (поэтому есть две функции сжатия C' и C'). Можно непосредственно вывести формулу для широконвейерного хеша, с учётом того, что находить в HAIFA последний блок тривиально, так как bits там выставлены ноль[4].

Пример ширококонвейерного

Формула для перевода из HAIFA в ширококонвейрный хеш:

CHAIFA(hi1,Mi,bits,s)={C(C(IV2,hi1||fixpad(Mi))),if  last blockC(hi1,Mi), otherwise

где C:{0,1}mc×{0,1}n{0,1}mc

C:{0,1}mc{0,1}m

IV2 — второй вектор инициализации[13].

Прикладное значение

Способ, предложенный учёными в HAIFA, имеет важное прикладное значение для реализации алгоритмов электронной подписи: с введением количества бит и соли стало сложнее добавлять префиксы и суффиксы к сообщению (herd attack), а следовательно подменять сообщения для подписи[14].

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:Добротная статья