Python下关于RSA解密模块的使用

最近筹备一场CTF比赛发现了一道关于RSA解密的题如下:

 

#小明得到了一个 RSA 加密信息,你能帮他解开吗?

n = 41069065654959614597750207738698085798765257876378561837894254544512565197793

c = 27990707239527629138352696377606718299992092729307910015562504696905353450041

e = 11

这道题主要考察了参赛选手对RSA加密原理的理解

RSA解密的公式是m=c^d mod n

如果要解密,现在依靠题目提供的信息还缺少一个d

得到参数D的方法:

按正常的方法要使用e与φ(n)互质的特性计算d

先计算φ(n)=(q-1)*(p-1)= t
#41069065654959614597750207738698085798358793355227373058859423166149935907348
 
因为e与φ(n)互质,根据求模反元素的公式计算e,对于e的模反元素d有:
ed≡1(modφ(n))
#14934205692712587126454620995890213017585015765537226566857972060418158511763
 
在这里直接使用CTF比赛机器提供的python模块gmpy2下的invert方法
gmpy2.invert(e,t)
#14934205692712587126454620995890213017585015765537226566857972060418158511763
直接传入e和φ(n)直接可以算出d的值
 
现在我们已经得到了d的值,直接套进公式c^d mod n得出m = 29517411348814866499427616583800503208093502027866036802414445379669260002593
现在也可以使用python的pow函数代替这个公式
m = pow(c,d,n)
#29517411348814866499427616583800503208093502027866036802414445379669260002593
这串数字并不是我们要的结果,转换成16进制再decode直接可以得出明文FLAG
print hex(pow(c,d,n))[2:].decode('hex')
ABCEF!th1s_was_very_hot_outside!
posted @ 2018-12-21 08:58  gainianyun  阅读(1478)  评论(0编辑  收藏  举报