Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pwang00
GitHub Repository: pwang00/Cryptographic-Attacks
Path: blob/master/Public Key/RSA/common_modulus.py
336 views
1
import binascii
2
from fractions import gcd
3
4
def egcd(a, b):
5
if a == 0:
6
return (b, 0, 1)
7
else:
8
g, y, x = egcd(b % a, a)
9
return (g, x - (b // a) * y, y)
10
11
def modinv(a, m):
12
g, x, y = egcd(a, m)
13
if g != 1:
14
raise ValueError('Modular inverse does not exist.')
15
else:
16
return x % m
17
18
def common_modulus(c1, c2, e1, e2, N):
19
if gcd(e1, e2) != 1:
20
raise ValueError("e1 and e2 must be coprime")
21
s1 = modinv(e1,e2)
22
s2 = (gcd(e1,e2) - e1 * s1) / e2
23
temp = modinv(c2, N)
24
m1 = pow(c1,s1,N)
25
m2 = pow(temp,-s2,N)
26
return (m1 * m2) % N
27
#print((s1 * e1 + s2 * e2)%n)
28
29
def test():
30
m = int("hello".encode("hex"),16)
31
n = 8574590275353150468066547476183381115398889704640798625862515118366969210809173375959624391568226984506878991189446348229752268497137248682204584792705299
32
e1 = 7
33
e2 = 11
34
m_recovered = common_modulus(pow(m,e1,n),pow(m,e2,n),e1,e2,n)
35
assert m_recovered == m
36
print("Success!")
37
return 0
38
39
test()
40
41