Это довольно тривиально, чтобы решить с атакой на день рождения. Вот как я это сделал в Python (v2):
def find_collision(ntries):
from hashlib import sha256
str1 = 'Frank is one of the "best" students topicId{%d} '
str2 = 'Frank is one of the "top" students topicId{%d} '
seen = {}
for n in xrange(ntries):
h = sha256(str1 % n).digest()[:4].encode('hex')
seen[h] = n
for n in xrange(ntries):
h = sha256(str2 % n).digest()[:4].encode('hex')
if h in seen:
print str1 % seen[h]
print str2 % n
find_collision(100000)
Если ваша попытка заняла слишком много времени, чтобы найти решение, либо вы либо просто допустили ошибку в своем кодировании, либо использовали неверный тип данных.
* Тип данных словаря 1024 * реализован с использованием таблиц ha sh. Это означает, что вы можете искать элементы словаря в постоянное время. Если бы вы реализовали seen
, используя список вместо dict в приведенном выше коде, тогда поиск в строке 11 занял бы очень много времени.
Edit:
Если два topicId
токена должны быть идентичны, тогда - как указано в комментариях - нет другого выбора, кроме как пролистать где-нибудь в порядке 2 31 значений. Вы в конечном итоге обнаружите столкновение, но это может занять много времени.
Просто оставьте это включенным на ночь, и с небольшой удачей вы получите ответ утром:
def find_collision():
from hashlib import sha256
str1 = 'Frank is one of the "best" students topicId{%x} '
str2 = 'Frank is one of the "top" students topicId{%x} '
seen = {}
n = 0
while True:
if sha256(str1 % n).digest()[:4] == sha256(str2 % n).digest()[:4]:
print str1 % n
print str2 % n
break
n += 1
find_collision()
Если вы спешите, возможно, вам стоит использовать графический процессор для ускорения вычислений ha sh.