Subversion Repositories Code-Repo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
219 Kevin 1
import math
2
 
3
def Extended_Euclidian(a, b):
4
	''' Takes values a and b and returns a tuple (r,s,t) in the following format:
5
		r = s * a + t * b where r is the GCD and s and t are the inverses of a and b'''
6
	t_ = 0
7
	t = 1
8
	s_ = 1
9
	s = 0
10
	q = a//b
11
	r = a - q * b
12
	# print("%d\t= %d * %d + %d" % (a, q, b, r))
13
	while r > 0:
14
		temp = t_ - q * t
15
		t_ = t
16
		t = temp
17
		temp = s_ - q * s
18
		s_ = s
19
		s = temp
20
		a = b
21
		b = r
22
		q = a//b
23
		r = a - q * b
24
		# print("%d\t= %d * %d + %d" % (a, q, b, r))
25
	r = b
26
	return (r, s, t)
27
 
28
def Inverse(a, b):
29
	'''Returns the multiplicative inverse of a mod b'''
30
	ret = Extended_Euclidian(a,b)
31
	if (ret[1] < 0):
32
		inv = ret[1] + b
33
	else:
34
		inv = ret[1]
35
	return inv
36
 
37
def Shanks(n,a,b):
38
	''' Implements the Shanks algorithm for solving the Discrete Logarithm Problem'''
39
	m = math.ceil(math.sqrt(n))
40
	d = a**m % n
41
 
42
	# Generate and sort list L1
43
	L1 = dict()
44
	for i in range(m):
45
		L1[i] = d**i % n
46
	print('L1: (unsorted)')
47
	for i in range(m):
48
		print("%d\t:\t%d" % (i, L1[i]))
49
	L1 = sorted(L1.items(), key=lambda x: x[1])
50
 
51
	# Generate and sort list L2
52
	L2 = dict()
53
	for i in range(m):
54
		L2[i] = b * Inverse(a**i, n) % n
55
	print('L2: (unsorted)')
56
	for i in range(m):
57
		print("%d\t:\t%d" % (i, L2[i]))
58
	L2 = sorted(L2.items(), key=lambda x: x[1])
59
 
60
	# Search for a pair with identical second coordinates
61
	for e in L1:
62
		for f in L2:
63
			if e[1] == f[1]:
64
				j = e[0]
65
				k = f[0]
66
				break;
67
 
68
	return m * j + k % n
69
 
70
if __name__ == '__main__':
71
	# a = 2
72
	# b = 767
73
	# n = 526483
74
	# d = Shanks(n, a, b)
75
	# print(d)
76
 
77
	# a = 2
78
	# b = 48
79
	# n = 101
80
	# d = Shanks(n, a, b)
81
	# print(d)
82
 
83
	# a = 2
84
	# b = (48**27)*(27**33)
85
	# n = 101
86
	# d = Shanks(n, a, b)
87
	# print(d)
88
 
89
	a = 2
90
	b = 19
91
	n = 4481
92
	d = Shanks(n, a, b)
93
	print(d)