Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gteissier
GitHub Repository: gteissier/erl-matter
Path: blob/master/complete-cookie.sage
271 views
1
#!/usr/bin/env sage
2
3
'''
4
Adapted from initial work performed by guillaume kaim.
5
6
Example usage:
7
8
echo "ELDUPJHMPTCVINSPFDTA" | ./revert-prng.sage
9
'''
10
11
import string
12
import sys
13
from scipy.stats import describe, tstd, cumfreq
14
15
N = 2**36
16
17
F = IntegerModRing(N)
18
19
A = F(17059465)
20
B = F(1)
21
22
a = [A]
23
b = [B]
24
for i in xrange(1, 20):
25
a.append(a[-1]*A)
26
b.append(b[-1]*A + B)
27
28
a_1 = []
29
b_1 = []
30
for i in range(20):
31
a_1.append(a[i]^(-1))
32
b_1.append(-b[i]*a_1[-1])
33
34
35
intervals = [(0, 2643056797), (2643056798, 5286113595), (5286113596, 7929170392), (7929170393, 10572227190), (10572227191, 13215283987), (13215283988, 15858340785), (15858340786, 18501397582), (18501397583, 21144454380), (21144454381, 23787511177), (23787511178, 26430567975), (26430567976, 29073624772), (29073624773, 31716681570), (31716681571, 34359738367), (34359738368, 37002795165), (37002795166, 39645851963), (39645851964, 42288908760), (42288908761, 44931965558), (44931965559, 47575022355), (47575022356, 50218079153), (50218079154, 52861135950), (52861135951, 55504192748), (55504192749, 58147249545), (58147249546, 60790306343), (60790306344, 63433363140), (63433363141, 66076419938), (66076419939, 68719476735)]
36
37
cookie = sys.argv[1]
38
39
40
nums = []
41
for c in cookie[::-1]:
42
assert(c in string.ascii_uppercase)
43
nums.append(ord(c) - ord('A'))
44
45
L = len(nums)
46
M = matrix(F, L-1, L)
47
for i in range(L-1):
48
M[i,0] = a_1[0]
49
for j in range(1, i+1):
50
M[i,j] = 0
51
M[i,i+1] = -a_1[i+1]
52
for j in range(i+2, L):
53
M[i,j] = 0
54
55
v = a_1[0]*intervals[nums[0]][0]+b_1[0]
56
57
n = matrix(F, L-1, 1)
58
for i in range(L-1):
59
n[i,0] = a_1[i+1]*F(intervals[nums[i+1]][0])+b_1[i+1] - v
60
61
x = M.solve_right(n)
62
63
64
def derive_cookie(seed):
65
cookie = ''.join([c for c in random_cookie(20, seed)])
66
return cookie[::-1]
67
68
def random_cookie(n, seed):
69
x = seed
70
for i in range(n):
71
x = next_random(x)
72
yield chr((x*(26) / 0x1000000000) + ord('A'))
73
74
def next_random(x):
75
ret = (x*17059465+1) & 0xfffffffff
76
return ret
77
78
seed = a_1[0]*(x[0][0]+F(intervals[nums[0]][0]))+b_1[0]
79
seed = int(seed)
80
81
if derive_cookie(seed)[-L:] == cookie:
82
print('cookie has been revealed: %s' % derive_cookie(seed))
83
else:
84
print('failed to reveal cookie')
85
86