在最近的SUCTF第一道逆向题中又一次地遇到了RSA解密的问题,所以这一次对RSA进行了一次比较彻底的学习
首先要掌握欧几里得算法和扩展欧几里得算法,先挂出大佬的博客
https://blog.csdn.net/weixin_42165981/article/details/81185418
这里本人用的python写的脚本
gcd
简单来说就是辗转相除求解最大公因数,代码中用到了地递归算法
他的最主要的原理就是gcd(a,b)=gcd(b,a%b),从而求出最大公因数,证明百度百科里面有这里不再赘余
ef gcd(x,y):
if(x<y):
temp=x
x=y
y=temp //让大的一直在前面,不过好像没什么影响
if(x%y==0): //一直取模到可以整除为止
return y
return gcd(y,x%y)
exgcd
def exgcd(a,b):
if(b==0):
return 1,0 //x=1,y=0
if (a < b): a, b = b, a //让大的在前面
x,y=exgcd(b,a%b) //进行递归
return y,x-(a//b)*y //x1=y2 y1=x1-[a/b]*y2
为了找出x,y满足ax+by = gcd(a, b)的贝祖公式,证明可以看大佬的博客
我们在求解rsa问题的时候求解时d=x%n
然后是rsa问题,逆向一般是遇到一个n一个公钥e然后求解d,再把密文转换成明文
n可以分解为两个质数的乘积,可以通过factordb得到p q
然后求解欧拉函数φ=(p-1)*(q-1)
然后求解d
原理是ed≡1(mod φ),即能够实现(ed-1)% φ ==0
等同于 (kφ+1)%e==0 且 d =(k*φ+1)/e
这里我一共总结了两种代码方法
一. 爆破
def ddd(e,fi):
i=1
while(1):
if (((fi*i)+1)%e)==0:
d=((fi*i)+1)/e
print(i)
return int(d)
i+=1
二.辗转相除
通过exgcd求解出x,然后x%n得出d,代码在上面不再重复
然后就是密文转明文
c=m^d%n
python:
c=pow(m,d,n)
基本的RSA就是这样了,有很多有难度的破解的方法,因为不是密码学出身,所以这里也就先放一下,有必要的话,再去深入学习