网上有关于本篇的writeup不多,虽然n可以直接使用yafu进行分解,但是我认为出题师傅的初衷应该是要考费马小定理,因此对照另一篇WP写一下自己的理解。第一次写WP,哪里写的不对的,欢迎批评指正
关于费马小定理
费马小定理描述的是对与p互素的任意值a,有a^(p-1) = 1 mod p ,根据这个公式,可以得出,存在一个值k,有k*p = a^(p-1) -1,即a^(p-1)-1=kp。
题目中的p生成原理
而题目中的p与普通质数生成不一样,是由质数的乘积+1得到的。因此有p-1= p1 * p2 * p3 * p4 * p5… 进一步的,有
pow(a,p-1,n)=a^(p-1) mod n = a^(p1* p2 * p3 * p4 * p5…)mod n =((( (a ^ p1) ^ p2 ) ^ p3 mod n) …)mod n
根据
费马小定理pow(a,p-1,n)= (kp + 1) mod n 而 gcd(p , n )!=1
所以,从第一个质数开始,每个质数都以a为底,以n为模数,这样的结果相乘,如果得出的结果与n不互质,说明p没有出现,当且仅当算出的值与n互质时,可以得出p。
于是取a为2,脚本如下:
脚本
#python2
import gmpy2
from Crypto.Util.number import sieve_base as primes
import libnum
n= xxxxxxxxxxxxx
c = xxxxxxxxxxx
t = pow(2,2048)
k =2
for i in range(10000):
k = gmpy2.powmod(k,primes[i],n)
if gmpy2.gcd(k-1,n) != 1:
break
p = gmpy2.gcd(k-1,n)
q = n // p
phin = (p-1)*(q-1)
e = 0x10001
d = gmpy2.invert(e,phin)
print libnum.n2s(int(gmpy2.powmod(c,d,n)))