前言
好久没写博客了,并不是我懒惰了,而是我一直把日常记录保存在本地,但是发现别人也看不到,好没有成就感啊,还是写博客吧,起码有一两个人看,嘿嘿~~~
好了进入正题
因为之前做了一些关于密码的CTF题,发现好多题跟RSA有关,而我之前就了解过RSA,可是总是没几天就把原理忘了,所以决定写一篇博客,好好整理整理。
RSA原理
RSA涉及五个参数:n,e,d,q,p
q,p为随机生成的两个大质数
n为qp,φ(n)为n的欧拉函数。即φ(n)=(q-1)(p-1)
e也是随机生成的,但是e必须满足 1<e<φ(n),并且必须跟φ(n)互质(两个整数之间只有1这个公约数,即两数互质)
d是怎么生成的呢? ed mod φ(n)=1,当我们求出e跟φ(n)时,就可以求出d,即ed/φ(n)=x…1–> (φ(n)*x+1)/e=d(可以通过扩展欧几里得算法求解,后面有代码)
公钥(n,e) 秘钥(n,d)
RSA加解密
假设A表示明文,B表示密文
那么
A=B^d mod n
B=A^e mod n
假设 我们得到公钥跟密文 即 我们得到 n,e,B ,要想求出A,我们需要得到d,我们知道 (φ(n)*x+1)/e=d,所以我们要求出 φ(n),就是对n进行因式分解,如果n很小的话,我们很容易进行因式分解求出qp,所以要想使该算法更安全,就要使qp足够大,他俩在相乘,想一想以现在的技术,至少需要好几十年。
RSA求d
第一种 遍历
没有代码的博客是不完整的。
def Olavlue(q,p):
return (q-1)*(p-1)
def PrivateKey(fn,e):
k=1
while True:
if((fn*k+1)%e==0):
(d,m)=divmod(fn*k+1,e)
return d,m
k+=1
if __name__=="__main__":
p=473398607161
q=4511491
e=17
d,m=PrivateKey(Olavlue(q,p),e)
print(d,m)
扩展欧几里得算法
基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。
证明:设 a>b。
1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
2,ab!=0 时
设 ax1+by1=gcd(a,b);
bx2+(a mod b)y2=gcd(b,a mod b);
根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);
则:ax1+by1=bx2+(a mod b)y2;
即:ax1+by1=bx2+(a-(a//b)*b)y2=ay2+bx2-(a//b)*by2;
根据恒等定理得:x1=y2; y1=x2-(a//b)*y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
我们看一个公式
ax+by=gcd(a,b)
再看我们上面说过的求d的公式,化简一下(y表示商)
e*d-φ(n)y=1,如果我们把d变为x 是不是有一点相同呢
ex+(-φ(n))*y=1
gcd(a,b)表示a和b的最大公约数,因为e跟φ(n)互质,所以他们的最大公约数为1,符合扩展欧几里得公式。
第二种 使用扩展欧几里得算法
int exgcd(int a,int b,int &x,int &y)
2 {
3 if(b==0)
4 {
5 x=1;
6 y=0;
7 return a;
8 }
9 int r=exgcd(b,a%b,x,y);
10 int t=x;
11 x=y;
12 y=t-a/b*y;
13 return r;
14 }
终于写完了 ,为了搞明白这个扩展欧几里得 我参考好几篇博文,终于搞明白了,但是却懒的自己敲代码了,以上代码是借鉴别人的。ok
4024

被折叠的 条评论
为什么被折叠?



