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

Является ли любая подстрока хеша (md5, sha1) более "случайной", чем другая?

Здесь 3 примера хешей md5

$ md5 -s "1" && md5 -s "2" && md5 -s "3"
MD5 ("1") = c4ca4238a0b923820dcc509a6f75849b
MD5 ("2") = c81e728d9d4c2f636f067f89cc14862c
MD5 ("3") = eccbc87e4b5ce2fe28308fd9f2a7baf3

Скажем, я хотел взять 8 символов из любого хэша. Является ли начало части хеш особенно более "случайным", чем конец? средний? Или все подстроки одинаково "случайны"?

4b9b3361

Ответ 1

Мне было любопытно, поэтому я пошел дальше и написал программу , чтобы проверить это. Для компиляции кода вам понадобится Crypto ++.

Отказ от ответственности: Когда дело доходит до криптографии или даже просто математики вообще, я знаю достаточно, чтобы стрелять себе в ногу. Итак, сделайте следующие результаты с зерном соли и имейте в виду, что у меня есть только поверхностное знание инструментов, которые я использую.

Я выбрал только три подстроки: первые 8 байтов, средние 8 байтов и последние 8 байтов. Короче говоря, они одинаково случайны.

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


1000 итераций:

First:  0.995914
Middle: 0.996546
Last:   0.998104

5000 итераций:

First:  0.998387
Middle: 0.998624
Last:   0.999501

10000 итераций:

First:  0.999614
Middle: 0.999457
Last:   1

30000 итераций:

First:  1
Middle: 1
Last:   1

"Случайность" измеряется классом Crypto ++ MaurerRandomnessTest. Для справки, исполняемый файл, скомпилированный из приведенного выше кода, имеет значение случайности 0.632411, а копия Шекспира Макбет, загруженная из Project Gutenburg, имеет значение случайности 0.566991.

Ответ 2

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

Ответ 3

Nitpick: "random" - это неправильное слово для использования здесь, поскольку функции хеширования детерминированы.

Что касается ответа на то, что вы имеете в виду:), желательным свойством хэш-функций является достижение эффекта Avalanche: в основном, чтобы каждый бит входные данные приводят к резким изменениям на выходе. Таким образом, для хорошо спроектированного хэша каждая подстрока должна быть одинаково одинаково затронута ( "быть как случайная" ), как и любая другая.