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))
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!