Проще говоря, хэш-функция работает, создавая большой запутанный беспорядок во входных данных.
См., Например, MD5 . Он обрабатывает входные данные 512-битными блоками. Каждый блок разбит на 16 32-битных слов. Есть 64 шага, каждый шаг, используя одно из 16 входных слов. Таким образом, каждое слово используется четыре раза в течение алгоритма. Вот откуда возникает односторонность: любой входной бит вводится в нескольких местах, и между двумя такими входами функция смешивает все текущие данные вместе, так что каждый входной бит влияет на большую часть 128-битного рабочего состояния. Это не позволяет вам инвертировать функцию или вычислять коллизию, просматривая только часть данных. Вы должны посмотреть на все 128 бит, а пространство 128-битных блоков слишком велико, чтобы его можно было эффективно пройти.
Теперь MD5 не справляется с этой задачей, поскольку можно обнаружить коллизии для этой функции. С точки зрения криптографа, MD5 - это повернутая функция шифрования. Обработка одного блока сообщений M (512 бит) использует входное состояние V (128-битное значение) и вычисляет новое состояние V 'как V' = V + E (M, V), где '+' - это слово- мудрое дополнение, и «E» оказывается симметричной функцией шифрования (она же «блочный шифр»), которая использует M в качестве ключа и V в качестве сообщения, которое должно быть зашифровано. При ближайшем рассмотрении E can - это своего рода «расширенная сеть Фейстеля», похожая на блочный шифр DES, с четырьмя четвертями вместо двух половин. Детали здесь не важны; я хочу сказать, что то, что делает «хорошую» хеш-функцию среди хеш-функций, использующих эту структуру (называемую «Меркле-Дамгард»), аналогично тому, что делает блочный шифр «безопасным». Успешные атаки на MD5 с использованием столкновений используют дифференциальный криптоанализ, инструмент, который был разработан для атаки на блочные шифры.
От хорошего блочного шифра до хорошей хеш-функции есть шаг, который нельзя сбрасывать со счетов. Со структурой Merkle-Damgård хеш-функция является безопасной, если базовый блочный шифр устойчив к «атакам по связанному ключу», довольно неясное свойство, против которого блочные шифры редко укрепляются, потому что для симметричного шифрования атаки по ключевым ключам практически не имеют практического влияние. Например, шифрование AES оказалось не таким устойчивым к атакам с использованием соответствующих ключей, как хотелось бы, и это не вызвало общей паники. Это сопротивление не было частью свойств, которые искали при разработке AES. Это просто предотвращает превращение AES в хэш-функцию. Существует хеш-функция под названием Whirlpool, которая основана на производной от Rijndael, Rijndael - это первоначальное имя того, что стало AES; но Whirlpool позаботится о том, чтобы модифицировать части Rijndael, которые слабы для связанных ключевых атак.
Также есть другие структуры, которые можно использовать для построения хеш-функции. Текущие стандартные функции (MD5, SHA-1 и семейство «SHA-2», также известные как SHA-224, SHA-256, SHA-384 и SHA-512) - это функции Меркля-Дамгарда, но многие из преемники нет. Постоянно проводится конкурс, организованный NIST (федеральной организацией США, которая занимается такими вещами), для выбора новой стандартной хеш-функции, получившей название «SHA-3». Подробнее см. на этой странице . На данный момент их число сократилось до 14 с первоначальных 51 (не считая дюжины дополнительных, которые не прошли административную проверку отправки полной заявки с кодом, который компилируется и выполняется правильно).
Давайте теперь взглянем более концептуально. Безопасная хеш-функция должна выглядеть как случайный оракул : оракул - это черный ящик, который при вводе сообщения M на вход выводит ответ h (M) , который выбирается случайным образом, равномерно, в выходном пространстве (т. Е. Во всех n -битных строках, если длина хэш-функции равна n ). Если в качестве входных данных снова выдается то же сообщение M , оракул выдает то же значение, что и ранее. Помимо этого ограничения, вывод оракула на неиспользуемый ранее ввод M непредсказуем. Можно представить оракула как контейнер для гнома, который бросает кости и тщательно записывает входные сообщения и соответствующие выводы в большую книгу, чтобы он выполнил свой контракт с оракулом. Невозможно предсказать, каким будет следующий вывод, так как сам гном не знает этого.
Если существует случайный оракул, то инвертирование хеш-функции будет стоить 2 ^ n : для получения заданного вывода нет лучшей стратегии, чем использование отдельных входных сообщений, пока не будет получено ожидаемое значение , Из-за равномерного случайного выбора вероятность успеха составляет 1 / (2 ^ n) при каждой попытке, а среднее количество запросов к гному, бросающему кости, будет 2 ^ n * 1036. *. Для коллизий (при нахождении двух различных входных данных, которые дают одно и то же хеш-значение), стоимость составляет около * 1,4 * 2 ^ (n / 2) * (грубо говоря, с * 1.4 * 2 ^ (n / 2) * выходами мы можем собрать около 2 ^ n пар выходных данных, каждая из которых имеет вероятность совпадения 1 / (2 ^ n) , т. е. имея два разных входа, которые имеют одинаковый выход). Это лучшее, что можно сделать со случайным оракулом.
Поэтому мы ищем хеш-функции, которые так же хороши, как случайный оракул: они должны смешивать входные данные таким образом, чтобы мы не могли найти столкновение более эффективно, чем то, что стоило бы просто вызвать функцию 2 ^ (н / 2) раза. Беда хеш-функции - это математическая структура, то есть ярлыки, которые позволяют атакующему просматривать внутреннее состояние хеш-функции (которое является большим, по крайней мере, n бит) как изменение математического объекта, который живет в очень короче место. 30 лет общественных исследований симметричных систем шифрования позволили создать целый ряд понятий и инструментов (диффузия, лавина, дифференциалы, линейность ...), которые могут быть применены. Суть, однако, в том, что у нас нет доказательств того, что случайный оракул действительно может существовать. Мы хотим хеш-функцию, которую нельзя атаковать. То, что у нас есть , является кандидатами в хеш-функции, для которых в настоящее время не известно ни одной атаки , и, что еще лучше, у нас есть некоторые функции, для которых некоторые виды атаки могут Доказано, что не работает.
Еще предстоит кое-какое исследование.