题目:
import uuid
import libnum
import gmpy2
flag = "flag{" + str(uuid.uuid4()) + "}"
print(flag)
e = 65537
m = libnum.s2n(flag.encode())
p1 = libnum.generate_prime(128)
q1 = libnum.generate_prime(128)
p2 = libnum.generate_prime(128)
q2 = libnum.generate_prime(128)
print("p1=", p1)
print("q1=", q1)
print("p2=", p2)
print("q2=", q2)
n1 = p1 * q1
n2 = p2 * q2
print("n1=", n1)
print("n2=", n2)
c1 = pow(m, e, n1)
c2 = pow(m, e, n2)
print("c1=", c1)
print("c2=", c2)
p1= 181374114466877670648532396603508572553
q1= 247588361882524320257263048684537007431
p2= 250300358872644907496990639170926211271
q2= 311991043797033811345420439880439753801
n1= 44906119888747698345512179582951804775114233952572843592134108434385163641343
n2= 78091470227448637872015323212263779481065170253775069214887468177576951291071
c1= 9866716045905392889073148813979506773491374338489530684028153975324697416911
c2= 55892489777087355045136246189511934204493824253870936685827466467250609643059
题目虽然给出p1、q1、p2、q2,但是因为 m大于n1 和 n2,所以不能正常求出m,因为给了两组数据,可以用上中国剩余定理,求出明文,有两种解法。
解题脚本:
#解法一
import libnum
e = 65537
p1= 181374114466877670648532396603508572553
q1= 247588361882524320257263048684537007431
p2= 250300358872644907496990639170926211271
q2= 311991043797033811345420439880439753801
n1= 44906119888747698345512179582951804775114233952572843592134108434385163641343
n2= 78091470227448637872015323212263779481065170253775069214887468177576951291071
c1= 9866716045905392889073148813979506773491374338489530684028153975324697416911
c2= 55892489777087355045136246189511934204493824253870936685827466467250609643059
phi_n1=(q1-1)*(p1-1)
phi_n2=(q2-1)*(p2-1)
#求逆元d
d1=libnum.invmod(e,phi_n1)
d2=libnum.invmod(e,phi_n2)
m1=pow(c1,d1,n1)
m2=pow(c2,d2,n2)
#定义变量m,调用solve_crt函数计算结果并赋值给m
m=libnum.solve_crt([m1,m2],[n1,n2])
#数字转字节,转字符串
print(libnum.n2s(int(m)).decode())
#解法二
import libnum
c=libnum.solve_crt([c1,c2],[n1,n2])
phi=(p1-1)*(q1-1)*(p2-1)*(q2-1)
d=libnum.invmod(e,phi)
m=pow(c,d,n1*n2)
print(libnum.n2s(m))
1.png
得到flag{0f72c09f-4e96-47dd-b2c4-0b8cbdbb5e15}