Как вам мой алгоритм хэширования?

Создал свой собственный алгоритм хэширования. При смене одного бита полностью меняется хэш, длина его всегда 64 (если не считать пробелов). На диапазоне 00000..99999 ни одной коллизии. Правда работает медленно (относительно sha* например). Но с другой стороны, это защита от подбора или поиска тех самых коллизий. Вот собственно код.

P.S. Делал всё как-нибуть и по этому константы являются рандомными числами, получеными питоновским скриптом:
["%.8X" % random.randint(0, 2 ** 32 - 1) for i in range(0, 8)]

P.P.S. Если понравился, можете спокойно юзать. Я не из АНБ :)

Модеры, вы зачем ответы удаляете? Я так ржал, а вы убрали и всё. Даже если там жесткая критика, смешно ведь. Если можно, верните ответы=)

UPD: Коллизии -- одно. Но я встречал в хэшах по 3-5 однаковых цыфр под ряд (в одном из восьми чисел, из которых состоит хэш). Я уверен, что это дыра. Попробую ее заделать
  • Вопрос задан
  • 2567 просмотров
Пригласить эксперта
Ответы на вопрос 4
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Внутреннее состояние в unsigned int и char *data -- это ошибки: char бывает знаковым и беззнаковым, а int может иметь разную ширину в зависимости от системы.
Дальше, вы замешиваете входные данные в хэш побайтово, это дыра для дифференциального криптоанализа.
Дальше, состояние вы тащите в интах, а за время хеширования одного байта у вас состояние не прокручивается полностью (ваши сдвиги, максимум на 3, за цикл хеширования сдвинут состояние максимум на 24 бита из 32). Мало того, что это неряшливо, это также значит, что старшие и младшие части слов хеша будут иметь разную структуру.
Короче, даже без углубления в анализ видно, что алгоритм непродуман и слаб.

Правда работает медленно (относительно sha* например).

При том, что даже sha1 делает больше раундов, чем ваше произведение.

если не будет совпадений, то возможно он нормальный

К тому же вам, очевидно, не хватает знаний о том, как оценивается качество криптографических хеш-алгоритмов.
Ответ написан
deadbyelpy
@deadbyelpy
веб-шмеб
Спасибо, давно так не смеялся, без обид, но таких хеш функций можно в день штук 10 делать.
По коду ничего особенного не вижу. Вам скучно было, вот и поделились?
Ответ написан
Spetros
@Spetros
IT-шник
Длина 64 в каких единицах? В битах? Тогда диапазон 00000..99999 входных значений для поиска коллизий слишком мал.

Код тоже так себе, хеш должен считаться в цикле без счетчиков.
А тут, если подать слишком большой объем данных, то произойдет переполнение со всеми вытекающими.
Ответ написан
@throughtheether
human after all
Во-первых, для школьника неплохо. Во-вторых, лично мне непонятна сфера применения этой хэш-функции. Для проблем, связанных с безопасностью, уже есть проверенные решения. Для проблем, связанных с детерминистским распределением объектов по контейнерам (пример: разделение нагрузки а-ля etherchannel, ECMP) она слишком медленная. В-третьих, автор будет еще большим молодцом, если самостоятельно найдет коллизии.
константы являются рандомными числами
На мой взгляд, попытка добавить "случайности" в алгоритм без его всестороннего исследования преждевременна и может вести к ложной уверенности в "безопасности" алгоритма.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы