Подтвердить что ты не робот

Создайте свои собственные столкновения MD5

Я делаю презентацию о столкновениях MD5, и я хотел бы дать людям понять, насколько вероятен столкновение.

Было бы хорошо иметь два блока текста, которые хеш-то же самое, и объяснить, сколько комбинаций [a-zA-Z] были необходимы, прежде чем я ударил столкновение.

Очевидным ответом является хеш всякой возможной комбинации до тех пор, пока два хэша не будут одинаковыми. Итак, как вы собираетесь кодировать это. В качестве быстрого эксперимента я пробовал хэшировать каждую комбинацию из 5 столбцов [A-Z], сохраняя это в хэш-таблице .net и захватывая исключение столкновений. Две проблемы с этим - хэш-таблица в конечном итоге истекает, и я уверен, что мне понадобится МНОГО больше персонажей.

Очевидно, что эта структура данных слишком велика для обработки в памяти, поэтому теперь мне нужно будет задействовать базу данных. Также звучит как хороший проект, чтобы проверить лазурь - немного похоже на этих парней.

Может ли кто-нибудь указать мне на эффективный способ сделать это?

4b9b3361

Ответ 1

Следующие два разных хэш-последовательности из 128 байтов одинаковы:

Хеш MD5: 79054025255fb1a26e4bc422aef54eb4

Различия ниже выделены (выделены жирным шрифтом). Извините, что это трудно понять.

d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 
55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b 
d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0 
e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70

и

d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89 
55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b 
d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0 
e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70

Визуализация столкновения/блока1 (Источник: Links.Org)

alt text

Визуализация столкновения /block 2 (Источник: Links.Org)

alt text

Ответ 2

Если вы говорите о том, насколько вероятным может быть прямое столкновение - одно, где нет намеренной попытки вызвать одно - тогда вы будете разочарованы: вам нужно будет генерировать в среднем 2 ^ 64 открытых текста перед вами может ожидать столкновения, и это существенно больше, чем вы сможете сделать в разумное (или действительно даже даже время, требуемое).

Если вы хотите продемонстрировать трудность преднамеренного создания столкновения, другие ответы уже продемонстрировали это. Дополнительное ограничение требовать, чтобы строки были полностью текстовыми, делает даже эти подходы в значительной степени непрактичными.

Ответ 3

Я бы посмотрел на Hashcash. С помощью эффективного алгоритма хеширования, такого как md5, время вычисления столкновения экспоненциально с количеством бит. То, что делает Hashcash, вычисляет частичные столкновения. То есть совпадение, например, младших 16 бит хэша. Чтобы совместить младшие 16 бит, нужно было бы в среднем использовать хэширование 2 ^ 15 различных комбинаций. Если вы знаете, сколько времени потребуется, чтобы придумать столкновение 16, 24 или 32 бита, вы можете легко вычислить время для большего количества бит.

Ответ 4

Это сложно сделать только с текстовыми файлами, AFAIK. Вы можете столкнуться с некоторыми столкновениями, но иметь их также просто [a-zA-Z] нелегко (пока).

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

См. эта проблема (часть H2) и solution. Например, этот файл PS и этот тот же MD5sum, но они оба хорошо сформированы PostScript файлы, которые имеют совершенно другой текст в них при их открытии.

Ответ 5

Весь смысл таких хэшей заключается в том, что столкновения крайне маловероятны. Вы не собираетесь генерировать один случайно - ваша машина почти наверняка умрет от старости, пока вы не добьетесь успеха. Весь смысл использования хэша исчезнет, ​​если вы сможете разумно генерировать столкновения!