# 提取伪随机数 defextract_number(self): ifself.mti == 0: self.twist() y = self.mt[self.mti] y = y ^ y >> 11 y = y ^ y << 7 & 2636928640 y = y ^ y << 15 & 4022730752 y = y ^ y >> 18 self.mti = (self.mti + 1) % 624 return _int32(y)
# right shift inverse definverse_right(res, shift, bits=32): tmp = res for i inrange(bits // shift): tmp = res ^ tmp >> shift return tmp # right shift with mask inverse definverse_right_mask(res, shift, mask, bits=32): tmp = res for i inrange(bits // shift): tmp = res ^ tmp >> shift & mask return tmp # left shift inverse definverse_left(res, shift, bits=32): tmp = res for i inrange(bits // shift): tmp = res ^ tmp << shift return tmp # left shift with mask inverse definverse_left_mask(res, shift, mask, bits=32): tmp = res for i inrange(bits // shift): tmp = res ^ tmp << shift & mask return tmp defextract_number(y): y = y ^ y >> 11 y = y ^ y << 7 & 2636928640 y = y ^ y << 15 & 4022730752 y = y ^ y >> 18 return y&0xffffffff defrecover(y): y = inverse_right(y,18) y = inverse_left_mask(y,15,4022730752) y = inverse_left_mask(y,7,2636928640) y = inverse_right(y,11) return y&0xffffffff print(recover(0xf1c680f8)) ''' for i in s: print(recover(i)) y = extract_number(o) print('y=',y,'o=',o) print(recover(y) == o) '''