一、题目:(来源于攻防世界)
附件:
代码:
import libnum
from Crypto.Util import number
from functools import reduce
from secret import flag
n = 5
size = 64
while True:
ps = [number.getPrime(size) for _ in range(n)]
if len(set(ps)) == n:
break
e = 65537
n = reduce(lambda x, y: x*y, ps)
m = libnum.s2n(flag)
c = pow(m, e, n)
print('n = %d' % n)
print('c = %d' % c)
给了n,c
n = 175797137276517400024170861198192089021253920489351812147043687817076482376379806063372376015921
c = 144009221781172353636339988896910912047726260759108847257566019412382083853598735817869933202168
二、分析与解答过程
与baigeiRSA不同之处,在于这n是由5个质数的乘积构成的
(1) 首先,先要看懂代码,不懂的地方可以问chatgpt
n = 5
size = 64
while True:
ps = [number.getPrime(size) for _ in range(n)]
if len(set(ps)) == n:
break
这段代码就是要生成一个由5个质数构成的序列ps
n=reduce(lambda x, y: x*y, ps)
而这段代码就是将ps序列中的元素相乘赋给n,具体解释如下:
(2) 看懂代码后,由于题目中的数学公式给得太少,无法进行有效的数学运算,还是用yufa进行因式分解
获取这5个质数后,就可以编写代码获取flag值
import libnum
P19 = 9401433281508038261
P20 = 11855687732085186571
P21 = 13716847112310466417
P22 = 11215197893925590897
P23 = 10252499084912054759
phi=(P19-1)*(P20-1)*(P21-1)*(P22-1)*(P23-1)
e = 65537
d=libnum.invmod(e, phi)
n = 175797137276517400024170861198192089021253920489351812147043687817076482376379806063372376015921
c = 144009221781172353636339988896910912047726260759108847257566019412382083853598735817869933202168
m=pow(c,d,n)
m=libnum.n2s(m)
print(m)