Я так не думаю.
Нет простого способа показать, почему это невозможно. Если бы это было так, то это было бы основой алгоритма поиска столкновений.
Более длительный анализ:
Предварительная обработка гарантирует, что на входе всегда есть хотя бы один 1
бит.
Цикл по w[i]
оставит исходный поток в покое, поэтому на входе есть хотя бы один 1 бит (слова от 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 других входных значения.