[NCTF2019]childRSA WP Crypto

网上有关于本篇的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)))
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值