Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
goelp14
GitHub Repository: goelp14/easyctf-iv-problems
Path: blob/master/souper_strong_primes/solve.py
650 views
1
#!/usr/bin/env python2
2
3
# warning: this script takes like 10 minutes to run
4
# be prepared for it to take a while
5
# also: sudo apt-get install libgmp-dev libmpc-dev
6
# pip install gmpy2
7
8
# thanks py2
9
from __future__ import print_function
10
11
import binascii
12
import datetime
13
import gmpy2
14
15
with open('new_n.txt') as f:
16
n = int(f.read())
17
with open('new_e.txt') as f:
18
e = int(f.read())
19
with open('new_c.txt') as f:
20
c = int(f.read())
21
22
# calculate p, q
23
p = gmpy2.isqrt(n)
24
q = p + 2
25
26
# calculate d
27
totn = (p-1) * (q-1)
28
d = gmpy2.invert(e, totn)
29
30
# calculate dp, dq, qinv
31
dp = d % (p-1)
32
dq = d % (q-1)
33
qinv = gmpy2.invert(p, q)
34
35
# decryption! takes a long time
36
print(1, datetime.datetime.now())
37
m1 = gmpy2.powmod(c, dp, p)
38
print(2, datetime.datetime.now())
39
m2 = gmpy2.powmod(c, dq, q)
40
print(3, datetime.datetime.now())
41
h = (qinv * (m1 - m2)) % p
42
print(4, datetime.datetime.now())
43
m = m2 + h * q
44
45
# decode it (why in binary who knows)
46
x = str(m)
47
x = '0' * (-len(x) % 8) + x
48
x = hex(int(x, 2)).lstrip('0x').rstrip('L')
49
x = '0' * (-len(x) % 2) + x
50
print(binascii.unhexlify(x))
51
52