RSA算法初学
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。[1]
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A=B^e1 mod n;B=A^e2 mod n;
(摘自百度百科)
其中
p (p,q两数互质)
q
n (p*q)
φ(n)(欧拉函数,即(p-1)*(q-1))
e1
e2
q
n (p*q)
φ(n)(欧拉函数,即(p-1)*(q-1))
e1
e2
在知道了n和e1的情况下,我们能不能破解出e2呢?
(1)e1*e2≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3)n=pq。只有将n因数分解,才能算出p和q。
分解出因数p和q就好办了(但是大数分解是非常困难的事情,目前只能破解到768位)
得到pq以后,为了算e2,根据(1)我们可以构造出m * a + n * b = 1 的二元一次方程,进而转化为求它的整数解,求解这个方程,用到“扩展欧几里得”算法,下面有C程序源代码。
//扩展欧几里得算法c语言 #include<stdio.h> void EGCD(int m,int n) { int a,a1,b,b1,c,d,q,r,t; a1=b=1,a=b1=0,c=m,d=n; while(1) { q=c/d,r=c%d; if(r==0) { printf("(%d)*%d+(%d)*%d=%d\n",a,m,b,n,d); return; } c=d,d=r,t=a1,a1=a,a=t-q*a,t=b1,b1=b,b=t-q*b; } } void main(){ printf("给定两个正整数m和n,我们计算它们的最大公因子d和两个整数a和b,使得a*m+b*n=d\n"); int m,n; scanf("%d%d",&m,&n); EGCD(m,n); }