cryptopals

https://cryptopals.com/
Log | Files | Refs

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