题目
题目给出了n,e,c,试着用RsaCtfTool去跑,但是没跑出来了,发现是p,q生成方式不是常规
因为 q 是 p^((1<<1024)-1)的下一个素数 ,由异或性质得:
如果 a>b,,且 a 为 0b1111111111(二进制全为 1),那么 a^b=a-b
所以 p^((1<<1024)-1) ,即((1<<1024)-1)^p=(1<<1024-1)-p
设 p^((1<<1024)-1)的下一个素数与 p^((1<<1024)-1)相差 x
则 q=(1<<1024-1)-p+x
得到 p+q=1<<1024-1+x
p+q 近似等于 1<<1024(这里的 x 和 1 太小,可忽略不计)
根据完全平方和公式可知:
所以可以推出p的近似值:
然后爆破可取得 n%p==0
解题脚本:
from Crypto.Util.number import *
import gmpy2
n=
c =
p=(2**1024+gmpy2.iroot((2**1024)**2-4*n,2)[0])//2
p=int(p)
while n%p!=0:
p=gmpy2.next_prime(p)
q=n//p
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))
结果:
成功拿到flag!!!