Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
jvdsn
GitHub Repository: jvdsn/crypto-attacks
Path: blob/master/attacks/mersenne_twister/__init__.py
2589 views
1
class MersenneTwister:
2
def __init__(self, w, n, m, r, a, b, c, s, t, u, d, l):
3
self.w = w
4
self.n = n
5
self.m = m
6
self.a = a
7
self.b = b
8
self.c = c
9
self.s = s
10
self.t = t
11
self.u = u
12
self.d = d
13
self.l = l
14
self.mt = [0] * n
15
self.index = n + 1
16
self.lower_mask = (1 << r) - 1
17
self.upper_mask = (~self.lower_mask) % (2 ** self.w)
18
19
def seed(self, f, seed):
20
self.index = self.n
21
self.mt[0] = seed
22
for i in range(1, self.n):
23
self.mt[i] = (f * (self.mt[i - 1] ^ (self.mt[i - 1] >> (self.w - 2))) + i) % (2 ** self.w)
24
25
def _twist(self):
26
for i in range(self.n):
27
x = (self.mt[i] & self.upper_mask) + (self.mt[(i + 1) % self.n] & self.lower_mask)
28
xA = x >> 1
29
if x % 2 != 0:
30
xA ^= self.a
31
self.mt[i] = self.mt[(i + self.m) % self.n] ^ xA
32
self.index = 0
33
34
def __next__(self):
35
if self.index >= self.n:
36
if self.index > self.n:
37
raise ValueError("Generator was never seeded")
38
self._twist()
39
40
y = self.mt[self.index]
41
y ^= (y >> self.u) & self.d
42
y ^= (y << self.s) & self.b
43
y ^= (y << self.t) & self.c
44
y ^= y >> self.l
45
self.index += 1
46
return y % (2 ** self.w)
47
48
49
def mt19937():
50
"""
51
Constructs a new unseeded MT19937 instance.
52
:return: the new MT19937 instance
53
"""
54
w = 32
55
n = 624
56
m = 397
57
r = 31
58
a = 0x9908B0DF
59
b = 0x9D2C5680
60
c = 0xEFC60000
61
s = 7
62
t = 15
63
u = 11
64
d = 0xFFFFFFFF
65
l = 18
66
return MersenneTwister(w, n, m, r, a, b, c, s, t, u, d, l)
67
68
69
def mt19937_64():
70
"""
71
Constructs a new unseeded MT19937-64 instance.
72
:return: the new MT19937-64 instance
73
"""
74
w = 64
75
n = 312
76
m = 156
77
r = 31
78
a = 0xB5026F5AA96619E9
79
b = 0x71D67FFFEDA60000
80
c = 0xFFF7EEE000000000
81
s = 17
82
t = 37
83
u = 29
84
d = 0x5555555555555555
85
l = 43
86
return MersenneTwister(w, n, m, r, a, b, c, s, t, u, d, l)
87
88