def crack_seed(rando, vals=10000): t0 = int(time.time()) for i in range(0, vals): mt.seed_mt(t0 + i) if rando == mt.extract_number(): return t0 + i mt.seed_mt(t0 - i - 1) if rando == mt.extract_number(): return t0 - i - 1 return None
def make_mt19937_rand_list(idx, rng_s, rng_e): if rng_s > rng_e: rng_s, rng_e = rng_e, rng_s rand_list = {} for i in range(rng_s, rng_e): mt19937.seed_mt(i) for j in range(idx): mt19937.extract_number() rand_num = mt19937.extract_number() rand_list[rand_num] = i return rand_list
def crack_rando_encr(ptext, ctext, isbytes=False): #finds the 16bit seed for the mt19937 encryption #where ptext was encrypted with rando_encr l0 = len(ptext) l1 = len(ctext) ind1 = int(l1 / 4) * 4 - 4 ind0 = ind1 - l1 if isbytes: bptext = ptext else: bptext = ptext.encode() b0 = int.from_bytes( (bptext[ind0], bptext[ind0 + 1], bptext[ind0 + 2], bptext[ind0 + 3]), 'big') c0 = int.from_bytes( (ctext[ind1], ctext[ind1 + 1], ctext[ind1 + 2], ctext[ind1 + 3]), 'big') r0 = b0 ^ c0 #this is only gonna work for sure if ptext is long enough, like at least 7 or 8 chrs for i in range(0, 2**16): prn = 0 mt.seed_mt(i) for j in range(0, int(ind1 / 4) + 1): prn = mt.extract_number() if prn == r0: return i return None
def test_random_numbers_big(self): for i in range(624*self.rounds): if i % 624 == 0: self.mt = mt19937.twist(self.mt) np_r = struct.unpack("<L", self.rn.bytes(4))[0] mt_r = mt19937.extract_number(self.mt, i % 624) self.assertEqual(np_r, mt_r, "[ERROR]: seed={}, twist={}, i={}".format(self.seed, i // 624, i))
def check_pswd_tkn(seed, ctext, tkn): l1 = len(tkn) if (l1 % 4) != 0: return False l0 = len(ctext) if (l0 % 4) == 0: rlen = int(l0 / 4) else: rlen = int(l0 / 4) + 1 mt.seed_mt(seed) for i in range(0, rlen): mt.extract_number() for i in range(0, int(l1 / 4)): if int.from_bytes(tkn[i * 4:i * 4 + 4], 'big') != mt.extract_number(): return False return True
def gen_pswd_rst_tkn(seed, ctext, n=10): #generates an n*4 byte password reset token l0 = len(ctext) if ( l0 % 4 ) == 0: #makes rlen = ceil(l0/4) but i didn't feel like using the math ceil function rlen = int(l0 / 4) else: rlen = int(l0 / 4) + 1 mt.seed_mt(seed) for i in range(0, rlen): mt.extract_number() tkn = [] for i in range(0, n): bts = (mt.extract_number()).to_bytes(4, 'big') tkn += [bts[0], bts[1], bts[2], bts[3]] return bytes(tkn)
def test_unextract(self): testData = [42, 4190403025, 1303704821] + [random.getrandbits(32) for _ in range(10)] for seed in testData: for i in range(624): mt = mt19937.init(seed) rn = mt19937.extract_number(mt, i) tm = mt19937.unextract_number(rn, i) self.assertEqual(mt[i], tm)
def test_unextract(self): testData = [42, 4190403025, 1303704821 ] + [random.getrandbits(32) for _ in range(10)] for seed in testData: for i in range(624): mt = mt19937.init(seed) rn = mt19937.extract_number(mt, i) tm = mt19937.unextract_number(rn, i) self.assertEqual(mt[i], tm)
def test_random_numbers_big(self): for i in range(624 * self.rounds): if i % 624 == 0: self.mt = mt19937.twist(self.mt) np_r = struct.unpack("<L", self.rn.bytes(4))[0] mt_r = mt19937.extract_number(self.mt, i % 624) self.assertEqual( np_r, mt_r, "[ERROR]: seed={}, twist={}, i={}".format( self.seed, i // 624, i))
def waiting_seed_rng(lbd=40, ubd=1000, wait=True): wint = random.randint(lbd, ubd) if wait == True: #actually wait time.sleep(wint) mt.seed_mt(int(time.time())) wint = random.randint(lbd, ubd) time.sleep(wint) else: #simulate waiting mt.seed_mt(int(time.time() + wint)) return mt.extract_number()
def check(self, pg, mt, rounds): ret = True for i in range(624*rounds): if i % 624 == 0: mt = mt19937.twist(mt) pg_r = pg.getNumber() mt_r = mt19937.extract_number(mt, i % 624) if pg_r != mt_r: print("[ERROR] round {} wrong prediction: pg_r= {}, mt_r= {}".format(i, pg_r, mt_r)) ret = False return ret
def main(): #for i in range(10): clone_mt19937_rng(mt19937.extract_number) for i in range(n * 3 + 213): orig = mt19937.extract_number() clone = extract_number() #print "orig:", orig #print "clone:", clone if orig != clone: print "clone failed" return print "clone succeed"
def check(self, pg, mt, rounds): ret = True for i in range(624 * rounds): if i % 624 == 0: mt = mt19937.twist(mt) pg_r = pg.getNumber() mt_r = mt19937.extract_number(mt, i % 624) if pg_r != mt_r: print("[ERROR] round {} wrong prediction: pg_r= {}, mt_r= {}". format(i, pg_r, mt_r)) ret = False return ret
def foo(): t = my_rand.my_rand(10, 1) #t = my_rand.my_rand(1000, 10) time.sleep(t) seed = int(time.time()) #print "seed:", seed mt19937.seed_mt(seed) t = my_rand.my_rand(10, 1) #t = my_rand.my_rand(1000, 10) time.sleep(t) return mt19937.extract_number(), seed
import ctr_mode import my_rand import mt19937 aes_key = my_rand.my_rand_str(16) ctr_iv = mt19937.extract_number() def encode_str(plain): percent = '%%%x' % ord('%') semicolon = '%%%x' % ord(';') equality = '%%%x' % ord('=') space = '%%%x' % ord(' ') plain = plain.replace('%', percent) plain = plain.replace(';', semicolon) plain = plain.replace('=', equality) plain = plain.replace(' ', space) cipher = plain return cipher def encode(user_data): pre_str = "comment1=cooking%20MCs;userdata=" app_str = ";comment2=%20like%20a%20pound%20of%20bacon" plain = pre_str + encode_str(user_data) + app_str #print len(plain) #print plain return ctr_mode.ctr_encrypt(aes_key, ctr_iv, plain)
def check_seed_consistency(seed): mt.seed_mt(seed) return mt.extract_number()
def test_random_numbers_small(self): np_r = struct.unpack("<L", self.rn.bytes(4))[0] mt_r = mt19937.extract_number(self.mt, 0) self.assertEqual(np_r, mt_r, "[ERROR]: seed=42 twist=1 i=0")