commit 0ba590df7070dce6796e2d775551b0f0af6b559d
parent 96cc82e1ca073f78f8576dc78e4299f7af835738
Author: mpizzzle <michael.770211@gmail.com>
Date: Sat, 16 Feb 2019 20:06:03 +0000
challenge 24 complete
Diffstat:
1 file changed, 32 insertions(+), 0 deletions(-)
diff --git a/set3/break_mt_cipher.py b/set3/break_mt_cipher.py
@@ -0,0 +1,32 @@
+from mt19937 import MersenneTwister
+from random import Random
+import time
+
+r = Random()
+key = r.randint(0, 0xffff)
+known_msg = "This is a known plaintext"
+prefixed_msg = ''.join([chr(r.randint(0, 0xff)) for i in range(r.randint(0, 1000))]) + known_msg
+
+def encrypt(key, msg):
+ mt = MersenneTwister(key)
+ return ''.join([chr(ord(c) ^ (0xff & mt.extract_number())) for c in msg])
+
+def generate_token(seed):
+ mt = MersenneTwister(seed)
+ return ''.join([chr(0xff & mt.extract_number()) for i in range(8)])
+
+cipher = encrypt(key, prefixed_msg)
+
+for i in range(0x10000):
+ if encrypt(i, cipher)[len(cipher) - len(known_msg):] == known_msg:
+ print i, i == key
+ break
+
+current_time = int(time.time())
+token = generate_token(current_time)
+
+for i in range(100):
+ guessed_token = generate_token(current_time - i)
+ if token == guessed_token:
+ print True
+ break