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

Может ли хэш SHA-1 быть полностью нулевым?

Есть ли какой-либо вход, который SHA-1 будет вычислять в шестнадцатеричном значении с четырьмя нулями, то есть "0000000000000000000000000000000000000000000000"?

4b9b3361

Ответ 1

Я так не думаю.

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

Расширенный анализ:

Предварительная обработка гарантирует, что на входе всегда будет хотя бы один бит 1.

Цикл над w[i] оставит исходный поток отдельно, поэтому на входе будет хотя бы один бит (слова от 0 до 15). Даже с умным дизайном битовых шаблонов, по крайней мере, некоторые из значений от 0 до 15 должны быть отличными от нуля, поскольку цикл не влияет на них.

Примечание: leftrotate является круговой, поэтому никакие 1 бит не будут потеряны.

В главном цикле легко видеть, что коэффициент k никогда не равен нулю, поэтому temp не может быть равным нулю по той причине, что все операнды с правой стороны равны нулю (k).

Это оставляет нам вопрос, можно ли создать бит-шаблон, для которого (a leftrotate 5) + f + e + k + w[i] возвращает 0, переполнив сумму. Для этого нам нужно найти значения для w[i] такие, что w[i] = 0 - ((a leftrotate 5) + f + e + k)

Это возможно для первых 16 значений w[i], поскольку у вас есть полный контроль над ними. Но слова с 16 по 79 снова создаются с помощью xor первых 16 значений.

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

В принципе, алгоритм был выбран таким образом, что вы можете создавать отдельные 0 слов, выбирая шаблоны ввода, но этим эффектам противопоставляется xor входных паттернов для создания 64 других входов.

Просто пример: Чтобы сделать temp 0, мы имеем

a = h0 = 0x67452301
f = (b and c) or ((not b) and d)
  = (h1 and h2) or ((not h1) and h3)
  = (0xEFCDAB89 & 0x98BADCFE) | (~0x98BADCFE & 0x10325476)
  = 0x98badcfe
e = 0xC3D2E1F0
k = 0x5A827999

который дает нам w[0] = 0x9fb498b3 и т.д. Это значение затем используется в словах 16, 19, 22, 24-25, 27-28, 30-79.

Слово 1 аналогичным образом используется в словах 1, 17, 20, 23, 25-26, 28-29, 31-79.

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

Ответ 2

Да, это просто невероятно маловероятно. То есть один в 2 ^ 160 или 0,000000000000000000000000000000000000000000000000006842277657836021%.

Ответ 3

Кроме того, поскольку SHA1 криптографически силен, он также был бы нецелесообразным с вычислительной точки зрения (по крайней мере, с текущей компьютерной технологией - все ставки отключены для возникающих технологий, таких как квантовые вычисления), чтобы выяснить, какие данные приведут к хэшу с нулевым нулем, пока это не произойдет на практике. Если вы действительно должны использовать хэш "0" в качестве часового, обязательно включите соответствующее утверждение (чтобы вы не просто вводили хэш-данные в ваш "нулевой" хэш-дозор), который выживает в процессе производства. Это состояние сбоя, на которое ваш код будет постоянно нуждаться в проверке. ПРЕДУПРЕЖДЕНИЕ: ваш код будет постоянно разбит, если это произойдет.

В зависимости от вашей ситуации (если ваша логика может справиться с обработкой пустой строки в качестве специального случая, чтобы запретить ее ввод), вы можете использовать SHA1 hash ('da39a3ee5e6b4b0d3255bfef95601890afd80709') пустой строки. Также возможно использование хэша для любой строки, не входящей в ваш входной домен, такой как sha1 ('a'), если ваш ввод имеет числовое значение только в качестве инварианта. Если вход предварительно обработан, чтобы добавить любое обычное украшение, тогда будет работать хэш чего-то без украшения (например: sha1 ('abc'), если ваши входы, такие как "foo", украшены кавычками, например, "foo",).

Ответ 4

Сообщение от Aaron неверно. Он зацикливается на внутренних компонентах вычисления SHA1, игнорируя то, что происходит в конце круглой функции.

В частности, см. псевдокод из Википедии. В конце раунда выполняется следующее вычисление:

h0 = h0 + a
h1 = h1 + b 
h2 = h2 + c
h3 = h3 + d
h4 = h4 + e

Таким образом, всякий вывод 0 может произойти, если h0 == -a, h1 == -b, h2 == -c, h3 == -d и h4 == -e переходят в этот последний раздел, где вычисления - это mod 2 ^ 32.

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

Ответ 5

Без знания внутренних элементов SHA-1 я не вижу, почему какое-либо конкретное значение должно быть невозможно (если явно не указано в описании алгоритма). Значение all-zero не более или менее вероятно, чем любое другое конкретное значение.

Ответ 6

В отличие от всех текущих ответов здесь никто этого не знает. Там существует большая разница между оценкой вероятности и доказательством.

Но вы можете смело предположить, что этого не произойдет. На самом деле вы можете с уверенностью предположить, что почти любое значение не будет результатом (если оно не было получено с помощью некоторых процедур, подобных SHA-1). Вы можете предположить это до тех пор, пока SHA-1 будет безопасным (это на самом деле уже не является, по крайней мере теоретически).

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

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

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

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

Ответ 7

В отличие от всех ответов здесь ответ просто Нет.

Хэш-значение всегда содержит биты, установленные на 1.