Радужная атака через поиск питона не удалась.
У меня есть некоторые проблемы с заданием. Суть в том, что я должен сделать радужную атаку на "автомобильную шутку". С таблицей генератора, RainbowAttack.py
Сценарий следующий:
- Ключ вещает на машину (в данном случае на противника)
- Машина / Ева отвечает на вызов
u
, - Затем ключ отвечает хешем, состоящим из
MD5(s||u)
, - Ева теперь использует Радужный стол, чтобы взломать
s
,
Мы используем MD5 для хэширования нашего ответа и наших ключей. Затем мы используем нашу функцию сокращения для хэша и принимаем первые 28 битf_i(x) = (f(x)+i) mod 2^28.
Мой хэш и функция сокращения
def f(s, i=0):
"""Lowest 28 bits of (MD5(s||u) % i)"""
digest = '0x' + md5.new(str(s) + str(u)).hexdigest()
result = hex((int(digest, 16) + i) % 2**BIT_SIZE)[:BIT_SIZE/4+2]
return result
В любом случае, когда мы запускаем наш скрипт, мы получаем ответ, вычисляем всех преемников и сравниваем их с конечными точками в радужной таблице. Если совпадение найдено, мы получаем начальную точку столкновения и теперь проверяем, находится ли ключ в цепочке. от начальной точки до конечной точки, если один из ключей здесь совпадает с ответом, который мы получили от fop, мы знаем, что предыдущий ключ является секретом открытия дверцы машины.
В настоящий момент мы можем найти ключ только в том случае, если он находится в начальной или конечной позиции радуги, а не в цепочке. Вот код для циклов, которые проверяют сукцессоры и проверяют, находятся ли какие-либо из наших преемников в радужной таблице, и, если они есть, мы проверяем, есть ли наш ответ от автомобильного фопа, если у нас есть наш ключ.
Это может быть проблемой, которая возникает, когда мы вычисляем наших преемников, так как функция сокращения будет отличаться от той, которая используется на ключе (я буду увеличивать, делая функцию сокращения немного отличающейся для всех ключей в цепочке)
def find_key(table, r):
"""Search for matching respons in Rainbow-table"""
succ = [r]
print r
for i in xrange(1, CHAIN_LEN):
succ.append(f(succ[i-1],i))
for key, value in table.iteritems():
if value in succ:
print "\tCollition: %s -> %s" % (key, value)
ss = key
for i in xrange(0, CHAIN_LEN):
rs = f(ss, i)
if rs==r:
return ss
ss = rs
return -1
радужный стол и файлы можно найти здесь (github)
(derp.py (радужная атака) и table1.csv(изменить имя на table.csv))