Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
jvdsn
GitHub Repository: jvdsn/crypto-attacks
Path: blob/master/test/test_mersenne_twister.py
2587 views
1
import os
2
import random
3
import sys
4
from unittest import TestCase
5
6
path = os.path.dirname(os.path.dirname(os.path.realpath(os.path.abspath(__file__))))
7
if sys.path[1] != path:
8
sys.path.insert(1, path)
9
10
from attacks import mersenne_twister
11
from attacks.mersenne_twister import state_recovery
12
13
14
class TestMersenneTwister(TestCase):
15
def test_state_recovery(self):
16
mt = mersenne_twister.mt19937()
17
mt.seed(1812433253, 0)
18
y = [next(mt) for _ in range(mt.n)]
19
mt_ = state_recovery.attack_mt19937(y)
20
self.assertEqual(mt.mt, mt_.mt)
21
self.assertEqual(mt.index, mt_.index)
22
for i in range(mt.n):
23
self.assertEqual(next(mt), next(mt_))
24
25
mt = mersenne_twister.mt19937()
26
mt.seed(1812433253, 1234567)
27
y = [next(mt) for _ in range(mt.n)]
28
mt_ = state_recovery.attack_mt19937(y)
29
self.assertEqual(mt.mt, mt_.mt)
30
self.assertEqual(mt.index, mt_.index)
31
for i in range(mt.n):
32
self.assertEqual(next(mt), next(mt_))
33
34
random.seed(1234567)
35
y = [random.getrandbits(32) for _ in range(624)]
36
mt_ = state_recovery.attack_mt19937(y)
37
for i in range(624):
38
self.assertEqual(random.getrandbits(32), next(mt_))
39
40
mt = mersenne_twister.mt19937_64()
41
mt.seed(6364136223846793005, 0)
42
y = [next(mt) for _ in range(mt.n)]
43
mt_ = state_recovery.attack_mt19937_64(y)
44
self.assertEqual(mt.mt, mt_.mt)
45
self.assertEqual(mt.index, mt_.index)
46
for i in range(mt.n):
47
self.assertEqual(next(mt), next(mt_))
48
49
mt = mersenne_twister.mt19937_64()
50
mt.seed(6364136223846793005, 1234567)
51
y = [next(mt) for _ in range(mt.n)]
52
mt_ = state_recovery.attack_mt19937_64(y)
53
self.assertEqual(mt.mt, mt_.mt)
54
self.assertEqual(mt.index, mt_.index)
55
for i in range(mt.n):
56
self.assertEqual(next(mt), next(mt_))
57
58