Path: blob/master/attacks/mersenne_twister/__init__.py
2589 views
class MersenneTwister:1def __init__(self, w, n, m, r, a, b, c, s, t, u, d, l):2self.w = w3self.n = n4self.m = m5self.a = a6self.b = b7self.c = c8self.s = s9self.t = t10self.u = u11self.d = d12self.l = l13self.mt = [0] * n14self.index = n + 115self.lower_mask = (1 << r) - 116self.upper_mask = (~self.lower_mask) % (2 ** self.w)1718def seed(self, f, seed):19self.index = self.n20self.mt[0] = seed21for i in range(1, self.n):22self.mt[i] = (f * (self.mt[i - 1] ^ (self.mt[i - 1] >> (self.w - 2))) + i) % (2 ** self.w)2324def _twist(self):25for i in range(self.n):26x = (self.mt[i] & self.upper_mask) + (self.mt[(i + 1) % self.n] & self.lower_mask)27xA = x >> 128if x % 2 != 0:29xA ^= self.a30self.mt[i] = self.mt[(i + self.m) % self.n] ^ xA31self.index = 03233def __next__(self):34if self.index >= self.n:35if self.index > self.n:36raise ValueError("Generator was never seeded")37self._twist()3839y = self.mt[self.index]40y ^= (y >> self.u) & self.d41y ^= (y << self.s) & self.b42y ^= (y << self.t) & self.c43y ^= y >> self.l44self.index += 145return y % (2 ** self.w)464748def mt19937():49"""50Constructs a new unseeded MT19937 instance.51:return: the new MT19937 instance52"""53w = 3254n = 62455m = 39756r = 3157a = 0x9908B0DF58b = 0x9D2C568059c = 0xEFC6000060s = 761t = 1562u = 1163d = 0xFFFFFFFF64l = 1865return MersenneTwister(w, n, m, r, a, b, c, s, t, u, d, l)666768def mt19937_64():69"""70Constructs a new unseeded MT19937-64 instance.71:return: the new MT19937-64 instance72"""73w = 6474n = 31275m = 15676r = 3177a = 0xB5026F5AA96619E978b = 0x71D67FFFEDA6000079c = 0xFFF7EEE00000000080s = 1781t = 3782u = 2983d = 0x555555555555555584l = 4385return MersenneTwister(w, n, m, r, a, b, c, s, t, u, d, l)868788