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
Exemplo n.º 2
0
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
Exemplo n.º 4
0
 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)
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
 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)
Exemplo n.º 9
0
 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()
Exemplo n.º 11
0
 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
Exemplo n.º 12
0
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"
Exemplo n.º 13
0
 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
Exemplo n.º 14
0
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
Exemplo n.º 15
0
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()
Exemplo n.º 17
0
 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")
Exemplo n.º 18
0
 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")