cryptopals

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

commit 91cd6a94aa2449837cab04623b06cf216f1d08f4
parent 76ef9a2ed10fb1c13d1e980166cee16e5a2cc7a4
Author: mpizzzle <michael770211@gmail.com>
Date:   Sun, 23 Dec 2018 00:34:54 +0000

initial idea for xor untempering

Diffstat:
Aset3/clone_mt_rng_state.py | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 93 insertions(+), 0 deletions(-)

diff --git a/set3/clone_mt_rng_state.py b/set3/clone_mt_rng_state.py @@ -0,0 +1,93 @@ +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 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 test_temper(yy): + y = _int32(yy) + y = y ^ y >> 11 + #y = y ^ y << 7 & 2636928640 + #y = y ^ y << 15 & 4022730752 + y = y ^ y >> 18 + return _int32(y) + +def untemper_11(yy): + y = _int32(yy) + print format(y, '#034b') + temp1 = y >> (32 - 11) + print format(temp1, '#034b') + temp2 = (y & 0x1fffff) >> (32 - 11 - 11) + print format(temp2, '#034b') + temp3 = temp1 ^ temp2# >> 1 + print format(temp3, '#034b') + temp4 = int(str(format(temp1, '#011b')) + str(format(temp3, '011b')), 2) >> 1 + print format(temp4, '#034b') + temp5 = temp4 ^ y + print format(temp5, '#034b') + return _int32(temp5) + +def untemper_18(yy): + y = _int32(yy) + print format(y, '#034b') + temp1 = y >> (32 - 11) + print format(temp1, '#034b') + temp2 = (y & 0x1fffff) >> (32 - 11 - 11) + print format(temp2, '#034b') + temp3 = temp1 ^ temp2# >> 1 + print format(temp3, '#034b') + temp4 = int(str(format(temp1, '#011b')) + str(format(temp3, '011b')), 2) >> 1 + print format(temp4, '#034b') + temp5 = temp4 ^ y + print format(temp5, '#034b') + return _int32(temp5) + +def test_untemper(yy): + y = _int32(yy) + y = untemper_18(y) + #y = y ^ y << 15 & 4022730752 + #y = y ^ y << 7 & 2636928640 + y = untemper_11(y) + return _int32(y) + +print _int32(48762549) +print _int32(48762549) == test_untemper(test_temper(48762549))