RSA可以说是很出名的算法了,这一套非对称加密的算法在网络上的应用非常多,多到你可能每分钟都用到了它.
上次看到一个使用RSA简易算法在范围内随机的文章,所以就仔细研究了一下RSA的基础知识.
发明这算法的大神们,显然都是数学上的行家,所以,我们先得补补数学知识.
第一个,就是欧拉函数,FML!我表示很难看懂,所以我只能告诉你一个结论.
我们用φ(N)表示在小于或等于N的正整数中,与N互质的数的个数.
同时,还有特殊情况,如果P和Q是不相同的两个质数,N=P*Q,那么φ(N)=(P-1)(Q-1).
另外,如果N是质数,那么φ(N)=N-1.
第二个,就是欧拉定理:如果两个正整数a与N互质,那么a的φ(N)次方除以N的余数为1.
第三个,模反元素.如果两个正整数a与N互质,那么一定有一个整数b,使得(a*b-1)%N=0,b就是a的模反元素.模反元素显然可能不止一个.
根据欧拉定理,a的φ(N)-1次方,必然就是a的模反元素.
介绍完以上知识,就可以先做一个简单的RSA算法示例.
对于P,Q两个质数,我假设P=5,Q=11.
那么N=P*Q=55,φ(N)=(P-1)(Q-1)=40.
接下来,在[1,φ(N)]的闭区间上,选一个与φ(N)互质的数e.
我假设e为7,假设e的模反元素为d,根据上面讲的定理,必然有e*d%φ(N)=1 ==> 7*d%40=1
因为是mod的关系,所以可以看做7d+40k=1.
这里根据,碾转相除法,我算出了第一个匹配的值,(d, k) = (-17, 3),为了方便计算,d最好是个正数,所以选择另一组数(23, -4).
到此为止,所有需要的数据都已经计算完毕:
N = 55 P = 5 Q = 11 e = 7 d = 23, 公钥 (N, e) = (55, 7) ,密钥 (N, d) = (55, 23).
注意,RSA加密的数据需要小于N,当数据过大的时候,一般采用分段加密的办法.
现在来使用刚才算出的公钥加密数字8. 8的7次方对55模运算为2. 2就是8加密后的数据.
当2传递给解密者之后. 解密过程 2的23次方对55模运算为8.就是发送前未加密的数据.
这里只是一个简单的模拟,所选用的N值55,二进制110111,才6位,现今对于安全度要求比较高的环境,都是1024位或者2048位的加密.
从理论上来说,要破解RSA,就是将N值因数分解,所以RSA的安全性是建立在现阶段对超大数的因数分解的困难上.