Для любой хеш-функции, концептуально или иначе, в чем разница между двумя вышеупомянутыми операциями. Я подошел к проблеме следующим образом:
H=hash(someplaintext)
n=0
while 1:
if hash(str(n))==H:
print n
n+=1
Оба свойства могут быть доказаны таким образом, что-то не так? Игнорируйте эффективность, использование памяти или любое подобное свойство. Пожалуйста, ответьте на мой вопрос, строго исходя из правильности
2 ответа
«Односторонний» означает, что для данной функции output вы не можете найти соответствующий input , кроме как если попробуете много потенциальных входов и вам повезет. Коллизия заключается в нахождении двух разных входов, которые дают одинаковый выход, без каких-либо предопределенных ограничений на этот выход.
Хорошая (криптографическая) хеш-функция должна обладать тремя классическими свойствами:
- Устойчивость к прообразам: для x должно быть невозможно найти m такое, что h (m) = x .
- Устойчивость ко вторым прообразам: с учетом m должно быть невозможно найти m ' отличным от m , так что ч (м) = ч (м ') .
- Устойчивость к столкновениям: должно быть невозможно найти m и m ', отличные друг от друга, такие, что h (m) = ч (м ') .
Это можно рассматривать как три проблемы для злоумышленника, отсортированные по убыванию сложности. В качестве прообразов я даю вам результат и предлагаю вам найти подходящие входные данные. Для второго прообраза я даю вам ввод (и неявно соответствующий вывод) и прошу вас найти другой соответствующий ввод. Для коллизий это похоже на второй вызов прообраза, за исключением того, что я не требую, чтобы вы находили конкретный результат; подойдет любой. Или, говоря наоборот: вызов для второго прообраза подобен вызову для столкновения, в котором одно из конфликтующих сообщений не может быть свободно выбрано злоумышленником.
Без использования каких-либо слабых мест в самой хэш-функции общие методы поиска прообразов, вторых прообразов и коллизий для хеш-функции с n -битным выходом стоят примерно 2 n (для прообразов и вторых прообразов) и 2 n / 2 (для коллизий). Таким образом, обнаруживать столкновения намного проще. В качестве прообразов вы просто пробуете вводить данные, пока вам не повезет (это то, что вы называете «грубой силой»); каждая попытка имеет вероятность успеха 2 -n . В случае коллизий это относится к атаке дня рождения: в основном, когда вы накопили около sqrt (2 n ) пар вход / выход, вероятность того, что две из этих пар имеют одинаковый выход, довольно быстро растет.
Что касается дней рождения, это означает, что если вы возьмете 20 человек наугад, высока вероятность, что у двоих из них будет один и тот же день рождения, но вы не можете выбрать, в какой день или каких людей. С другой стороны, если вы хотите найти кого-то с тем же днем рождения, что и вы , вам придется в среднем отбирать 365 человек.
Возможно, я неправильно понимаю ваш вопрос, но вот мое мнение:
Брутфорс столкновения будет всегда работать, независимо от того, устойчив ли он к столкновениям. Односторонняя хеш-функция не означает, что столкновение невозможно найти, это означает, что злоумышленник имеет незначительные шансы найти его, это часто определяется следующим образом:
\epsilon < \frac{1}{p(n)}
Где p(n)
обозначает многочлен в терминах n
(простите за синтаксис латекса)
В вашем случае вы просто обнаружили столкновение, это не доказывает, что хеш-функция не является односторонней, потому что вы перебираете все возможности, что означает, что вы не нарушили условие 1 / p (n).
Похожие вопросы
Новые вопросы
hash
Хеш-функция - это любая четко определенная процедура или математическая функция, которая преобразует большой объем данных в небольшие данные, обычно в одно целое число. По вопросам о хэштегах, используемых для маркировки контента в социальных сетях, используйте хэштег. По вопросам об URL-адресах и привязках HTML используйте идентификатор-фрагмента. По вопросам о типе хэша Ruby используйте ruby-hash.