2015-03-04 2 views
0

Я пытаюсь найти 2 разных текстовых слова, которые создают очень похожие хэши.Поиск похожих хешей

Я использую метод хэширования «whirlpool», но мне не нужен мой вопрос, на который нужно ответить в случае или в водовороте, если вы можете использовать md5 или что-то еще, что все в порядке.

Сходство я ищу то, что они содержат одинаковое количество букв (не имеет значение, сколько они звенели вверх)

т.е. PLAINTEXT «тест» хэш-1: abbb5 имеет 1 а, 3 b's, one 5 plaintext 'blahblah' hash 2: b5bab должен иметь то же самое, но не имеет значения, в каком порядке.

Я уверен, что могу прочитать, как они созданы, сломать и отменить его, но мне просто интересно, происходит ли то, о чем я говорю.

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

+1

Определите новую хэш-функцию, которая сначала применяет исходный хэш, а затем сортирует символы на выходе.Затем примените стандартные алгоритмы поиска столкновений к этой новой функции, которая имеет меньшее выходное пространство, и, таким образом, столкновения более распространены. Но я не думаю, что сокращение очень велико, поэтому он будет работать только с короткими хэшами, возможно, до 12 байтов или около того. – CodesInChaos

+0

Из примера в вопросе, который я прочитал, должно быть одинаковое число * одинаковых букв и цифр *. Это верно? –

+0

@CodesInChaos Может быть, он может работать для полного хеша, если вы будете использовать меньший алфавит, например, только нули и единицы: P –

ответ

2

Таким образом, вы можете сделать это следующим образом:

  1. создать пустой отсортирован карте \
  2. создать 64 битный счетчик (вам не нужно больше, чем 2^63 входов, по всей вероятности, так как вы были бы мертвы до того, как они будут рассчитаны - если квантовый криптона действительно взлетает)
  3. использовать счетчик в качестве входных данных, возможно, проще всего его закодировать в 8 байтах;
  4. использовать это как вход для вашей хэш-функции;
  5. кодировать вывод хеша в шестнадцатеричном формате (использовать ASCII-байты для скорости);
  6. сортировать шестигранной на номер/в алфавитном порядке (то же самое на самом деле)
  7. проверки, если отсортирован шестигранной результат является ключевым в карте
    • , если она есть, результат показать шестигранный, старый счетчик с карты &, ток счетчик (и остановка)
    • , если это не так, поставить отсортированный результат шестигранного в карте, со счетчиком в качестве значения
  8. увеличить счетчик, Готы 3

Это все люди. Результаты для SHA-1:

011122344667788899999aaaabbbcccddeeeefff for both 320324 and 429678

Я не знаю, почему вы хотите сделать это для гекс, хэши будут настолько велики, что они не будут выглядеть слишком похожи друг на друга. Если ваш алфавит меньше, ваш код будет работать (даже) быстрее. Если вы используете целые байты вывода (то есть 00 - FF вместо 0 - F) вместо шестнадцатеричного, это займет гораздо больше времени - быстрый (не оптимизированный) тест на моей машине показывает, что он не заканчивается через несколько минут, а затем запускается недостаточно памяти.

+0

Если * I * сделать это для байтов, я получаю «Исключение в потоке» main «java.lang.OutOfMemoryError: превышен верхний предел GC». Интересно, если это произойдет * должно произойти ... –

+0

Слабый компьтер-книжка: '# Распределение собственной памяти (malloc) не удалось выделить 312737792 байта для фиксации зарезервированной памяти.' –

Смежные вопросы