Рейтинг:0

SHA-256 не соответствует равномерному распределению?

флаг vn
Bob

Я играл с SHA-2-256 в Джулии и заметил, что полученные хэши не следуют равномерному распределению. Мое понимание алгоритмов безопасного хеширования заключается в том, что они должны хорошо аппроксимировать равномерное распределение, поэтому они непредсказуемы.

Вот код Джулии, который я использую:

с использованием BitIntegers, Distributions, HypothesisTests, Random, SHA

функция sha256_rounds()
    rounds::Array{Array{UInt8,1}} = Array{Array{UInt8,1}}(undef, 10000) # 10000 выборок
    hash::Array{UInt8} = Array{UInt8}(undef, 64) # 64-байтовый массив

    для i = 1:10000
        hash = sha2_256(string(rand(UInt64), base = 16)) # Случайное число, преобразование в шестнадцатеричную строку, затем начальное число
        раунды[i] = хэш
    конец

    ответные раунды
конец

sha256_str_vals = [join([string(x, base = 16) for x in y]) for y in sha256_rounds()] # Соедините байты вместе в строки
sha256_num_vals_control = [parse(UInt256, x, base = 16) for x in sha256_str_vals] # Получить числовое значение из строк

OneSampleADTest(sha256_num_vals, Uniform()) # Один образец теста Андерсона-Дарлинга

И результат теста:

Один образец теста Андерсона-Дарлинга
--------------------------------
Данные о населении:
    интересующий параметр: еще не реализован
    значение под h_0: NaN
    балльная оценка: NaN

Резюме теста:
    результат с достоверностью 95%: отклонить h_0
    одностороннее значение p: <1e-7

Подробности:
    количество наблюдений: 10000
    выборочное среднее значение: 8,73991847621225e75
    образец SD: 2.2742656031884893e76
    Статистика A²: Inf

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

kelalaka avatar
флаг in
ваше хэш-значение хранит $64*8 = 512$ бит, однако SHA-256 имеет 256-битное значение, определите его как `hash::Array{UInt8} = Array{UInt8}(undef, 32) # 32-байтовый массив`
fgrieu avatar
флаг ng
Я помню более ранние подобные заявления о том, что вывод [хеш](http://eprint.iacr.org/2002/099) или [блочный шифр](http://eprint.iacr.org/2003/003) не случайно. Они [оказались неверными](https://eprint.iacr.org/2003/022). Выходные данные SHA-256 (для различных входных данных, подготовленных независимо от констант в SHA-256) можно использовать для проверки статистических тестов. Независимо: утверждение должно быть выражено независимо от кода Джулии и включать описание проведенного статистического теста.
kelalaka avatar
флаг in
Посмотрите аналогично [Как получить вывод SHA-1 с первыми 2-битными нулями?] (https://crypto.stackexchange.com/q/83224/18298)
Meir Maor avatar
флаг in
Я проголосовал за повторное открытие даже без улучшений, предложенных Фгрие. SHA256 не провалит простой статистический тест, я бы попробовал протестировать отдельные биты и пары битов, чтобы убедиться в его приблизительной однородности. Если вы настаиваете на тесте, который вы применили, посмотрите, как вы конвертируете в числовое значение, ошибка, скорее всего, там.
Paul Uszak avatar
флаг cn
Это на самом деле очень просто. Сгенерируйте 1 ГБ материала в режиме счетчика и запустите на нем ent. Если пройдет, так тому и быть. Если это не удается, то и ваш код тоже...
Рейтинг:2
флаг ng

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

  • sha256_num_vals_control вычисляется, но не используется, когда предположительно предполагалось, что это так.
  • Я не вижу ни попытки нормализовать сгенерированный материал к интервалу $[0,1)$, ни вход в OneSampleADTest указание диапазона.

Я заключаю образцы для OneSampleADTest не отформатированы должным образом для этого теста. Уродливый внутри, мусор снаружи.

Даже если бы семплы были правильно отформатированы, криптографии не позаботились бы об ошибках в OneSampleADTest в определенной версии Julia и используемой библиотеке. Было бы важно, чтобы вывод SHA-256 для различных входных данных, подготовленный независимо от констант в SHA-256, можно было отличить от случайного. Но для такого экстраординарного утверждения потребуются экстраординарные доказательства. И предварительно описание, не зависящее от языка и его библиотек.

Ответить или комментировать

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