目录
真的想稍微深入一点了解下RSA,结果发现自己应了江帝的那句名言“too young too simple”,侯门水很深,瘆得冰凉。这篇博文打算想讲RSA关联的数学基础,再去讲RSA的加解密过程。数学基础的一部分和加解密过程放的是阮大神的链接,大家可以自取查获,在这里也在此声明一下,数学基础的一部分和加解密过程是阮一峰博士的博文,这里也只是有一个连接入口,如果这样也侵权,速告知我在马上删。
然后,数学基础有的你逼逼一阵,都是RSA的数学基础,若没有数学基础压阵,阮大神的RSA加解密的数学证明肯定会看得一知半解,所以在这里先上一些必须要吃下去的菜。
质数和互质关系:
互质关系见阮大神的博客,文章后面有说明。
同余运算:
辗转相除法:
代码实现:
int gcd(int m,int n){
int t;
while(t) {
t=m%n;
m=n;
n=t;
}
return m;
}
正确性证明:略。查见网络。
裴蜀定理 :
内容:给予二个整数a、b,必存在整数x、y使得gcd(a,b) | ax + by
证明略,大家可以参见这里。
扩展欧几里得算法:
扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个很可能是负数),使它们满足和裴蜀定理有关的等式ax + by = gcd(a,b),x,y其中一个就是RSA中的六个重要数字p,q,n,φ(n),e,d中的d。(其中(n,e)组合是公钥,(n,d)组合是私钥,加密公式是m^e ≡ c (mod n) 解密公式是c^d ≡ m (mod n),至于这些字母分别都代表些什么可以参见下文提到的一位大神的杰作)
我们先举一个眼熟能诵的例子:求二元一次不定方程 47x+30y=1的整数解。先根据裴蜀定理检查一下是否有整数解,由gcd(47,30)=1可知该二元一次不定方程有整数解。再按照辗转相除法求最大公约数的方法算得如下:
最后一步还应算至:4=4X1+0
然后把它们改写成“余数等于”的形式:
然后按照维基百科的做法把它们“倒回去”:
得解x=-7,y=11,如果47是RSA中的e的话,则-7就是RSA中的d,有疑惑可以到后面看看链接的大神的博文。
按照维基百科的“倒回去”我们有递归式的代码如下:
int gcdEx(int a, int b, int *x, int *y) {
if(b==0){
*x = 1,*y = 0;
return a;
}else{
int r = gcdEx(b, a%b, x, y); /* r = GCD(a, b) = GCD(b, a%b) */
int t = *x;
*x = *y;
*y = t - a/b * *y;
return r;
}
}
然而接下来分析一种不用“到回去”,也不用递归的而是基于辗转相除法中gcd代码的算法。我们来分析“余数等于”的形式:
故有如下代码:
int gcd(int m,int n, int *x, int *y){
int t,q;
int xx,yy;//记录xk-2和yk-2的值
int tempx,tempy;//为了记录xk-2和yk-2的值,需要的中间辅助变量
int k=0;
while(t) {
t=m%n;
q= m/n;
m=n;
n=t;
if(k>1){
tempx =*x ;
tempy = *y;
*x =(-q)* (*x )+ xx;*y =(-q)*( *y)+ yy;
xx = tempx; yy= tempy;
}else if(k==0){
*x=xx=1; *y=yy=-1;
}else if(k==1){
*x=(-q)*(*x); *y=(-q)*(*y)+1;
}
k++;
}
return m;
}
中国剩余定理:
对此定理的理解和证明需要一些数论的箱底,尤其是一次(n元)同余方程组的一些箱底,才算真正掌握和理解,在此略过,有想看的可以去百度上查获,以后有时间补回来。
阮一峰博士讲RSA
还有一部分的数论知识是网上的一篇好博文,见于对创意共享3.0许可证的无知,这里就不复制了大家自己去看,点击这里,大家可以只关注设计到的知识点,欧拉函数、欧拉定理、模反元素。具体点击这里。
RSA加解密的过程和其中在数学上的正确性推导,还是参见这位大神的博文,附上链接。
你的打赏是我奋笔疾书的动力!
支付宝打赏:
微信打赏: