break_mt_cipher.py (897B)
1 from mt19937 import MersenneTwister 2 from random import Random 3 import time 4 5 r = Random() 6 key = r.randint(0, 0xffff) 7 known_msg = "This is a known plaintext" 8 prefixed_msg = ''.join([chr(r.randint(0, 0xff)) for i in range(r.randint(0, 1000))]) + known_msg 9 10 def encrypt(key, msg): 11 mt = MersenneTwister(key) 12 return ''.join([chr(ord(c) ^ (0xff & mt.extract_number())) for c in msg]) 13 14 def generate_token(seed): 15 mt = MersenneTwister(seed) 16 return ''.join([chr(0xff & mt.extract_number()) for i in range(8)]) 17 18 cipher = encrypt(key, prefixed_msg) 19 20 for i in range(0x10000): 21 if encrypt(i, cipher)[len(cipher) - len(known_msg):] == known_msg: 22 print i, i == key 23 break 24 25 current_time = int(time.time()) 26 token = generate_token(current_time) 27 28 for i in range(100): 29 guessed_token = generate_token(current_time - i) 30 if token == guessed_token: 31 print True 32 break