题目如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import gmpy2
from gmpy2 import *
from Crypto.Util.number import *
flag = '***************'
p = getPrime(512)
q = getPrime(512)
m1 = bytes_to_long(bytes(flag.encode()))
n = p*q
e1 = getPrime(32)
e2 = getPrime(32)
print()
flag1 = pow(m1,e1,n)
flag2 = pow(m1,e2,n)
print('flag1= '+str(flag1))
print('flag2= '+str(flag2))
print('e1= ' +str(e1))
print('e2= '+str(e2))
print('n= '+str(n))
flag1=100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
flag2=86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
e1=3247473589
e2=3698409173
n=103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

​ 从题目中可以发现有两个不同的密文和指数e,而明文m1和模数n相同,这是典型的共模攻击。博主首先尝试分解n,发现不行,那就使用共模攻击的脚本来解即可。

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
import gmpy2
from gmpy2 import *
from Crypto.Util.number import *
# flag = '***************'
# p = getPrime(512)
# q = getPrime(512)
# m1 = bytes_to_long(bytes(flag.encode()))
# n = p*q
# e1 = getPrime(32)
# e2 = getPrime(32)
# print()
# flag1 = pow(m1,e1,n)
# flag2 = pow(m1,e2,n)
# print('flag1= '+str(flag1))
# print('flag2= '+str(flag2))
# print('e1= ' +str(e1))
# print('e2= '+str(e2))
# print('n= '+str(n))
flag1=100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
flag2=86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
e1= 3247473589
e2= 3698409173
n=103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

def rsa_gong_N(e1,e2,c1,c2,n):
e1,e2,c1,c2,n = int(e1), int(e2), int(c1), int(c2),int(n)
s = gcdext(e1,e2)
t = s[1]
z = s[2]
if t < 0:
t = -t
c1 = inverse(c1,n)
elif z < 0:
z = -z
c2 = inverse(c2,n)
m = (pow(c1,t,n)*pow(c2,z,n)) % n
return m

result = rsa_gong_N(e1,e2,flag1,flag2,n)
print(long_to_bytes(result).decode())

数学证明如下: