RSA算法是数学应用于实际的一项伟大发明,起数学过程相对而言仍是比较专业的,有兴趣能够看看。html
RSA算法的证实过程,详见:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.htmlgit
首先默认有个欧拉定理及相关的推论成立,这个要看证实过程不简单github
而后看一下其加密解密的公式,能够试着推导一下:算法
能够看出非对称的加密解密过程,在数学上是成立的。数据库
那么回头看它的安全性:就是要确保d不被攻破,d安全的前提是n不被成功分解。安全
1.能不能遍历全部的素数,来猜想p,q?网络
a)素数有无穷多个,google一下欧几里得的反证妙法;google
b)如今再想发现新的素数很困难,数字很大,目前发现的最大质数 十进制表示有17 425 170位,够写一本书;加密
c)如今发现的素数有多少个呢?这是最关键的。参见:http://www.zhihu.com/question/22356265spa
64bit的数字 十进制大概是2*10^19,其中质数的个数约为4*10^17次方,差很少有2%的数是质数,想要遍历的话,只能呵呵了。
2.每次生成秘钥对时,都要先有两个大质数,怎么得到两个大质数呢?
a)把全部发现的质数存在本地,每次随机选两个?看看数据量就知道存储不够
b)作一个公共数据库,存储全部发现的质数,每次调库?估一眼储存,仍是不够的
c)公共服务随机产生,须要的话去调用接口?不安全,这个数理论上不能在网络中传输,若是公司内网,能够考虑
d)本地随机产生?靠谱,生成复杂度高不?
3.总之要随机生成,参见:http://bindog.github.io/blog/2014/07/19/how-to-generate-big-primes/
a)素数断定方法,复杂度还好,能几乎实时
b)随机寻找的复杂度,由前面64bit的数看,有2%的数是质数,这是能够接受的,平均搜100个能获得两个,1024bit的几率有多大,不清楚
c)真随机性,上面文章中提到的,有意思的斯诺登披露的消息
4.有了两个大素数后,就是软件计算的事,长位数的大数计算,能够用croypt等库来作。网上有些直接贴的代码,学学原理能够,实际用确定是不行。