This is an old revision of the document!
In this exercise you will implement the Birthday attack on SHA-1. The goal is to obtain a collision in the first four bytes of the hash.
You can start from this code:
import hashlib
import random
N_MESSAGES = 2**16 # 2^16 random messages
N_COLL_BYTES = 4
def generate_messages():
msgs = []
for i in xrange(N_MESSAGES):
msgs.append("Ana are %d mere si %d pere" % (i, random.randint(0, 100000)))
return msgs
def find_collision(msgs):
hashes = dict() # will keep first N_COLL_BYTES bytes of each hash
# TODO - find collision and return it as a tuple (msg1, msg2)
return None # return None if no collision is found
def main():
while True:
# Generate N_MESSAGES (2^16) different random messages
msgs = generate_messages()
# Find a hash collision
collision = find_collision(msgs) # collision = (msg1, msg2)
if collision:
# print collision (the two messages and their hash) in a readable format
print collision[0] # msg1
print hashlib.sha1(collision[0]).hexdigest() # msg1 hash
print collision[1] # msg2
print hashlib.sha1(collision[1]).hexdigest() # msg2 hash
break
if __name__ == '__main__':
main()
Can you also find a collision in the first 5 bytes of the hash?
hashlib.sha1(msg).hexdigest()