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等庫來作。網上有些直接貼的代碼,學學原理能夠,實際用確定是不行。