-
Notifications
You must be signed in to change notification settings - Fork 3
/
assignment6.py
72 lines (50 loc) · 2.01 KB
/
assignment6.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
"""RSA attacks on incorrectly chosen N
"""
import gmpy2
gmpy2.get_context().precision = 1100
def gotcha(N, p, q):
g = gmpy2.is_prime(int(p)) and gmpy2.is_prime(int(q)) \
and N == gmpy2.mul(p, q)
if g:
print "Solution: ", long(p > q and q or p)
return g
def q1():
N = 179769313486231590772930519078902473361797697894230657273430081157732675805505620686985379449212982959585501387537164015710139858647833778606925583497541085196591615128057575940752635007475935288710823649949940771895617054361149474865046711015101563940680527540071584560878577663743040086340742855278549092581
rt = gmpy2.sqrt(N)
A = gmpy2.ceil(rt)
A2 = pow(A, 2)
assert A2 > N
x = gmpy2.sqrt(gmpy2.sub(A2, N))
p = gmpy2.sub(A, x)
q = gmpy2.add(A, x)
gotcha(N, p, q)
def q2():
N = 648455842808071669662824265346772278726343720706976263060439070378797308618081116462714015276061417569195587321840254520655424906719892428844841839353281972988531310511738648965962582821502504990264452100885281673303711142296421027840289307657458645233683357077834689715838646088239640236866252211790085787877
rt = gmpy2.sqrt(N)
A = gmpy2.ceil(rt)
q = 0
p = 0
while not gotcha(N, p, q):
A2 = pow(A, 2)
assert A2 > N
x = gmpy2.sqrt(gmpy2.sub(A2, N))
p = gmpy2.sub(A, x)
q = gmpy2.add(A, x)
assert N == gmpy2.mul(p, q)
A += 1
def q3():
N = 720062263747350425279564435525583738338084451473999841826653057981916355690188337790423408664187663938485175264994017897083524079135686877441155132015188279331812309091996246361896836573643119174094961348524639707885238799396839230364676670221627018353299443241192173812729276147530748597302192751375739387929
rt = gmpy2.sqrt(gmpy2.mul(N, 6))
A = gmpy2.ceil(rt)
A2 = pow(A, 2)
assert A2 > N
x = gmpy2.sqrt(gmpy2.sub(A2, N))
x = gmpy2.mul(x, 3/2)
p = gmpy2.sub(A, x)
q = gmpy2.add(A, x)
gotcha(N, p, q)
if __name__ == '__main__':
#q1()
#q2()
q3()
#q4()