Отказ от ответственности: это раздел из универсального задания
Мне дали следующий ключ AES-128-CBC и сказали, что до 3 битов в ключе были изменены / повреждены.
d9124e6bbc124029572d42937573bab4
Предоставляется хэш оригинального ключа SHA-1;
439090331bd3fad8dc398a417264efe28dba1b60
и мне нужно найти оригинальный ключ, попробовав все комбинации до 3-х битных переворотов.
Предположительно, это возможно в 349633 догадках, однако я не знаю, гдеэто число пришло;Я бы предположил, что это будет ближе к 128 * 127 * 126, что будет более 2M комбинаций, вот где моя первая проблема.
Во-вторых, я создал скрипт на python ниже, содержащий тройной вложенный цикл (я знаю, далеко нелучший код ...) для перебора всех возможностей 2M, однако, после завершения через час, он не нашел совпадений, которые я действительно не понимаю.
Надеясь, что кто-то может, по крайней мере, направить меня в нужном направлении, ура
#!/usr/bin/python2
import sys
import commands
global binary
def inverseBit(index):
global binary
if binary[index] == "0":
return "1"
return "0"
if __name__ == '__main__':
if len(sys.argv) != 3:
print "Usage: bitflip.py <hex> <sha-1>"
sys.exit()
global binary
binary = ""
sha = str(sys.argv[2])
binary = str(bin(int(sys.argv[1], 16)))
binary = binary[2:]
print binary
b2 = binary
tries = 0
file = open("shas", "w")
for x in range(-2, 128):
for y in range(-1,128):
for z in range(0,128):
if x >= 0:
b2 = b2[:x] + inverseBit(x) + b2[x+1:]
if y >= 0:
b2 = b2[:y] + inverseBit(y) + b2[y+1:]
b2 = b2[:z] + inverseBit(z) + b2[z+1:]
#print b2
hexOut = hex(int(b2,2))
command = "echo -n \"" + hexOut + "\" | openssl sha1"
cmdOut = str(commands.getstatusoutput(command))
cmdOut = cmdOut[cmdOut.index('=')+2:]
cmdOut = cmdOut[:cmdOut.index('\'')]
file.write(str(hexOut) + " | " + str(cmdOut) + "\n")
if len(cmdOut) != 40:
print cmdOut
if cmdOut == sha:
print "Found bit reversals in " + str(tries) + " tries. Corrected key:"
print hexOut
sys.exit()
b2 = binary
tries = tries + 1
if tries % 10000 == 0:
print tries
РЕДАКТИРОВАТЬ:
Изменение цикла на
for x in range(-2, 128):
for y in range(x+1,128):
for z in range(y+1,128):
резко сокращаетколичество догадок пока (думаю?) еще охватывает все пространство.Все еще получаю дубликаты и все же не везет найти совпадение ..