目录
普通题目
RSA共模攻击
RSA低加密指数攻击
RSA维纳攻击
easyrsa6
easyrsa7
enc与pem文件
普通题目
rsa最简单的题目,是给出pq等数据,要求求解d或是明文,使用脚本就可以轻松解密。
import libnum
import gmpy2
p=libnum.generate_prime(1024)#生成随机数
q=libnum.generate_prime(1024)
n=p*q
e=65537
phi_n=(p-1)*(q-1)
d=gmpy2.invert(e,phi_n)
c=pow(c,m,n)
print("p=",p)
print("q=",q)
print("n=",n)
print("d=",d)
print("e=",e)
import libnum n= e= d= c=4 m=pow(c,d,n) print(libnum.n2s(m))
以上分别为解密与解密脚本。
RSA共模攻击
rsa共模攻击通俗来说,就是同一明文,同一个n,e不相同,进行加密。
简单解密脚本如下:
import libnum import gmpy2 n= e1= e2= c1= c2= s1,s2,s3=gmpy2.gcdext(e1,e2)#拓展欧几里得算法 print(s1,s2,s3) m=(pow(c1,s2,n)*pow(c2,s3,n)%n) print(libnum.n2s(int(m)))
其数学原理如下:
RSA低加密指数攻击
该类型攻击一般指数e为3,ctf题目里有非常明显的特征,
解密脚本如下:
import libnum
def key(c, e, n):
k = 0
while True:
m1 = c + n*k
result, flag = gmpy2.iroot(m1, e)
if True == flag:
return result
k += 1
n=
e=
c=
m=key(c,e,n)
print(m)
print(libnum.n2s(int(m)).decode())
在理解脚本时,有一些小白对mod捉摸不清,这里先介绍一下mod,我们可以把它比喻成钟表的运算,在日常面对钟表时,我们通常会说18点为6点,是因为大脑自动进行了mod运算,18mod12=6,而在早上6点是就称作6点,是因为6比12小,6mod12依然为6,可以在此基础上理解脚本。
RSA维纳攻击
维纳攻击是一种e过小或者e过大而进行的攻击方式(自我理解)
其原理因涉及到数论,因此针对一些小白这里直接提供最简便的代码(其实是自己也没理解透彻),有兴趣的可以去康康大佬的博客,
from Crypto.Util.number import * from gmpy2 import * from RSAwienerHacker import * e = n= c= d=hack_RSA(e,n) flag=long_to_bytes(pow(c,d,n)) print(flag)
在这个脚本里有以下几点需要注意。
首先是引用的RSAwienerHacker库不是python里的,它取自于github,如:文件地址
其次是Crypto库的使用,该库不可以在windows系统里使用(我的不行),需要在kali虚拟机里,使用python进行解密。这个使用pip的教程网上都是,可以自行查找也可以留言。
easyrsa6
这个主要是针对于一个题型,此次红明谷举办的赛事里也有这种类型的题目。
import gmpy2,libnum
from Crypto.Util.number import getPrime
from secret import flag
e = 0x10001
p = getPrime(1024)
q = gmpy2.next_prime(p)
n = p * q
print("n =",n)
m = libnum.s2n(flag)
c = pow(m,e,n)
print("c =", c)
这是easyrsa6的题目,该类型题目运行脚本会报错,因为它找不到flag模块,这里的第三行代码,就是说题目要读取内容,相当于flag=flag{***},如果要解题的话还是要自行解决脚本。
解题代码如下:
import gmpy2 import libnum p= q= e= n= c= phi_n=(p-1)*(q-1) d=gmpy2.invert(e,phi_n) m=pow(c,d,n) print(libnum.n2s(int(m)))
easyrsa7
这是ctfshow中的rsa题目,其余的均采用了16进制可以理解,唯一疑惑的地方就是p>>128<<128
这其实是代表着p低位数据的损失,低位数据跟高位数据就相当于,你的银行卡存款的第一位+1和最后一位+1,感觉是完全不一样的,前者是高位,后者是低位。对于这种情况,应使用sagemath恢复数据,
在恢复了p之后,解密也就和之前的解法一样了。
(题目里给出的16进制数,换与不换均不影响结果。)
enc与pem文件
有些题目下载附件之后即给出了enc文件与pem文件,这些均需要在linux里打开,对于这些题目,
我们的思路为
1.先破解公钥,找到其中的e和n
2 将n分解开来,找到两个质因数p和q
3.在python中编写rsa的简单脚本,找出明文。
1.首先在kali里输入openssl rsa -pubin -text -modulus -in warmup -in ****.pem,即可得到e和n
2在网站上输入factordb.com,即可对n进行质因数分解,记得提前把n从十六进制转换为十进制。
3编写脚本解密



