题目
附件
给出了invert(q,p),d,c,只需求出n即可解,求n只能根据invert(q,p)以及d,先求出p或q即可。
分析:
根据d可以得到:
phi=(p-1)*(q-1)
即
观察k,d,发现是同比特位且相近,那k可以爆破:
for i in range(1,100000):
if (e*d-1)%i==0:
print(i)
这里根据爆破的结果确定k=62676,这样phi就可以求出来了。
设
因为
两边同时对p取余(这里这样做是为后面定理引用做铺垫)
所以就有
如果设
那就说明y是p的倍数,即被p整除,那p就是y其中一个因子。
引入定理:
存在任意的r满足
所以
对于任意的r,k1,k2,如果k2是k1的因子时,即k2整除k1,有
所以
这里p是y的因子,也是上面为何要构造(x*phi)mod p的原因
所以就有
把括号里的看作一个整体就有
这里的k与上面爆破的k毫无关系
当r=2,3,4,5,......时,可得到多个k*p,然后对其取gcd即可求出p,然后在模p的条件下求x的逆元即可得到q,那么n就知道了,m即可解出来。
关键代码如下:
#爆破k
'''print(e*d-1)
for i in range(1,100000):
if (e*d-1)%i==0:
print(i)'''
k0 = 62676
phi = (e*d-1)//k0
y = 1 + x*phi-x
#随便取两个r求其gcd
p1 = pow(5,phi,y) - 1
p2 = pow(7,phi,y) - 1
p = gp.gcd(p1,p2)
#print(p)
q = gp.invert(x,p)
#print(q)
n = p*q
m = pow(c,d,n)
print(long_to_bytes(m))
结果
成功拿到flag!!!