-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathShank.py
135 lines (82 loc) · 1.34 KB
/
Shank.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import gmpy2
from gmpy2 import powmod,mpz,c_mod
from random import randint
p=mpz(13710221545914561761)
q=mpz(11066328760152681859)
N = p*q
# q is 3 mod 4
# p is 1 mod 8
# SHANK ALGORITHM
a=1
e = 0
m = p
t=m-1
def chinese_rem(x1,x2,m1,m2):
a1 = c_mod(x1,m1)+m1
a2 = c_mod(x2,m2)+m2
M = m1*m2
M1 = M/m1
M2 = M/m2
y1= gmpy2.invert(M1,m1)
y2= gmpy2.invert(M2,m2)
return (a1*M1*y1)+(a2*M2*y2)
while(True):
if(t % 2 != 0):
break
e=e+1
t=t/2
q = (m-1)/pow(2,e)
# generate quadratic non-residue of m
while(True):
x = randint(2,m-1)
z = powmod(x,q,m)
if(powmod(z,mpz(pow(2,e-1)),m) != 1):
break
y = z
r = e
x = powmod(a,(q-1)/2,m)
v = a*x % m
w = v*x % m
while(True):
if(w == 1):
break
k=0
while(True):
if(powmod(w,mpz(pow(2,k)),m)==1):
break
k = k + 1
d = powmod(y,mpz(pow(2,r-k-1)),m)
y = powmod(d,2,m)
r = k
v = (d*v) % m
w = (w*y) % m
r1 = v
r2 = p-v
m=p
r3 = powmod(a,(m+1)/4,m)
r4 = N/p-r3
# for p
print r1
print r2
# for q
print r3
print r4
p=p
q=N/p
x1 = r1
x2 = r3
print chinese_rem(x1,x2,p,q)
c1 = chinese_rem(x1,x2,p,q)
x1 = r1
x2 = r4
print chinese_rem(x1,x2,p,q)
c2 = chinese_rem(x1,x2,p,q)
x1 = r2
x2 = r3
print chinese_rem(x1,x2,p,q)
c3 = chinese_rem(x1,x2,p,q)
x1 = r2
x2 = r4
print chinese_rem(x1,x2,p,q)
c4 = chinese_rem(x1,x2,p,q)
print "......................"