cryptopals

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 96cc82e1ca073f78f8576dc78e4299f7af835738
parent ad1d321637d963112799df8d7add5b70c222371d
Author: mpizzzle <michael.770211@gmail.com>
Date:   Sat, 16 Feb 2019 18:03:31 +0000

refactoring duplicate classes

Diffstat:
Mset3/clone_mt_rng_state.py | 48++++--------------------------------------------
Mset3/crack_mt_seed.py | 46++++------------------------------------------
Mset3/mt19937.py | 11+++++------
3 files changed, 13 insertions(+), 92 deletions(-)

diff --git a/set3/clone_mt_rng_state.py b/set3/clone_mt_rng_state.py @@ -1,49 +1,9 @@ +from mt19937 import MersenneTwister + def _int32(x): # Get the 32 least significant bits. return int(0xffffffff & x) -class MT19937: - def __init__(self, seed): - # Initialize the index to 0 - self.index = 624 - self.mt = [0] * 624 - self.mt[0] = seed # Initialize the initial state to the seed - for i in range(1, 624): - self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i) - - def set_state(self, cloned_state): - self.mt = cloned_state - - def extract_number(self): - if self.index >= 624: - self.twist() - - y = self.mt[self.index] - - # Right shift by 11 bits - y = y ^ y >> 11 - # Shift y left by 7 and take the bitwise and of 2636928640 - y = y ^ y << 7 & 2636928640 - # Shift y left by 15 and take the bitwise and of y and 4022730752 - y = y ^ y << 15 & 4022730752 - # Right shift by 18 bits - y = y ^ y >> 18 - - self.index = self.index + 1 - - return _int32(y) - - def twist(self): - for i in range(624): - # Get the most significant bit and add it to the less significant - # bits of the next number - y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff)) - self.mt[i] = self.mt[(i + 397) % 624] ^ y >> 1 - - if y % 2 != 0: - self.mt[i] = self.mt[i] ^ 0x9908b0df - self.index = 0 - def untemper_11(yy): y = yy ^ ((yy & 0xffe00000) >> 11) y = yy ^ ((y & 0xfffffc00) >> 11) @@ -79,14 +39,14 @@ def untemper(yy): return _int32(y) unknown_seed = 12668778 -mt = MT19937(unknown_seed) +mt = MersenneTwister(unknown_seed) cloned_mt_state = [0] * 624 for i in range(624): cloned_mt_state[i] = untemper(mt.extract_number()) -cloned_mt = MT19937(0) +cloned_mt = MersenneTwister(0) cloned_mt.set_state(cloned_mt_state) print mt.extract_number() diff --git a/set3/crack_mt_seed.py b/set3/crack_mt_seed.py @@ -1,58 +1,20 @@ import time import random - -class mersenne_twister: - #Initialize the generator from a seed - def __init__(self, seed): - self.MT = [0] * 624 - self.MT[0] = seed - self.index = 624 - for i in range(1, 624): #loop over each element - self.MT[i] = int(0xFFFFFFFF & (1812433253 * (self.MT[i - 1] ^ (self.MT[i - 1] >> (30))) + i)) - - #Extract a tempered value based on MT[index] - #calling twist() every n numbers - def extract_number(self): - if self.index >= 624: - if self.index > 624: - raise Exception("Generator was never seeded") - #Alternatively, seed with constant value; 5489 is used in reference C code[49] - self.twist() - - y = self.MT[self.index] - y = y ^ ((y >> 11) & 0xFFFFFFFF) - y = y ^ ((y << 7) & 0x9D2C5680) - y = y ^ ((y << 15) & 0xEFC60000) - y = y ^ (y >> 18) - - self.index += 1 - return int(0xFFFFFFFF & y) - - #Generate the next n values from the series x_i - def twist(self): - for i in range(624): - x = int(0xFFFFFFFF & ((self.MT[i] & 0x80000000) + (self.MT[(i + 1) % 624] & 0x7fffffff))) - xA = x >> 1 - - if (x % 2) != 0: #lowest bit of x is 1 - xA = xA ^ 0x9908B0DF - - self.MT[i] = self.MT[(i + 397) % 624] ^ xA - self.index = 0 +from mt19937 import MersenneTwister secret_seed = int(time.time()) time.sleep(random.randint(40, 1000)) -secret_seed_output = mersenne_twister(secret_seed).extract_number() +secret_seed_output = MersenneTwister(secret_seed).extract_number() print secret_seed_output current_time = int(time.time()) cracked_seed = 0 for i in range(1001): - if mersenne_twister(current_time - i).extract_number() == secret_seed_output: + if MersenneTwister(current_time - i).extract_number() == secret_seed_output: cracked_seed = current_time - i break -print mersenne_twister(cracked_seed).extract_number() +print MersenneTwister(cracked_seed).extract_number() print cracked_seed print secret_seed == cracked_seed diff --git a/set3/mt19937.py b/set3/mt19937.py @@ -1,8 +1,8 @@ def _int32(x): # Get the 32 least significant bits. - return int(0xFFFFFFFF & x) + return int(0xffffffff & x) -class MT19937: +class MersenneTwister: def __init__(self, seed): # Initialize the index to 0 @@ -13,6 +13,9 @@ class MT19937: self.mt[i] = _int32( 1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i) + def set_state(self, cloned_state): + self.mt = cloned_state + def extract_number(self): if self.index >= 624: self.twist() @@ -43,7 +46,3 @@ class MT19937: if y % 2 != 0: self.mt[i] = self.mt[i] ^ 0x9908b0df self.index = 0 - #test - -mt = MT19937(0) -print mt.extract_number()