前面文章咱們講了AES算法,AES算法是一種是對稱加密算法,本文咱們來介紹一個十分經常使用的非對稱加密算法RSA。算法
非對稱加密算法也叫公鑰密碼算法,經過生成的公私鑰來對明文密文進行加密解密。 RSA的名字是由它的三個開發者Ron Rivest, Adi Shamir和 Leonard Adleman的首字母而來的。 安全
RSA公司在1983年爲RSA算法申請了專利。加密
RSA的加密能夠用下面的公式來表示:spa
經過公式咱們能夠知道RSA的密文是經過明文的E次方再對N進行mod運算獲得的。這個加密過程只用到了階乘和取模運算,能夠算是很是簡單明瞭了。3d
簡潔的纔是最好的,這可能也是RSA算法這麼通用的緣由吧。blog
若是知道了E和N,那麼就能夠獲得密文,因此咱們把E和N的組合稱爲公鑰,能夠這樣表示 公鑰{E,N}。 教程
如何選擇E和N是一個複雜的數學過程,咱們會在後面講到。開發
先看一下RSA解密的公式:get
經過公式能夠看到,明文是經過密文的D次方,再和N取模獲得的。這裏的N和加密的N是同一個數字。博客
D和N的組合表示爲私鑰{D,N}。
知道了RSA的加密和解密原理以後,接下來咱們就要探討一下加密和解密過程當中的N,E,D是怎麼生成的。
生成過程以下:
生成N的公式以下:
p和q是兩個很大的質數,過小的話容易被破譯,太大的話會影響計算速度。一般p和q的大小爲1024比特。這兩個數是經過僞隨機數生成器生成的。僞隨機數生成器不能直接生成質數,它是經過不斷的重試獲得的。
L是一箇中間數,它和p,q同樣,不會出如今RSA的加密和解密過程。
L的計算公式以下:
L是p-1和q-1的最小公倍數
E就是用來加密的公鑰了,E是一個比1大,比L小的數。而且E和L必須互質。只有E和L互質才能計算出D值。
這裏E也是經過僞隨機數生成器來生成的。
找到了E和N,咱們的公鑰就生成了。
計算D的公式以下:
若是想破解RSA, 對於密碼破解者來講,他知道了公鑰{E,N}, 知道了密文,根據公式:
有沒有可能直接經過已知的三個變量,求出未知變量明文呢?
這個求解實際上是一個離散對數的問題。目前尚未發現求離散對數的高效的方法。能夠說是很是困難的。
那麼有沒有可能通夠暴力破解來得出密鑰中的D呢?
目前RSA算法中p和q的長度通常爲1024比特以上,生成的N的長度爲2048比特以上,E和D的長度和N差很少,若是要暴力破解2048比特的D是很是困難的。
由公式:
可知,若是破解者知道了L的值,那麼就能夠輕易的求出D。而L是經過p和q計算出來的,因此p和q必定要保密,不然跟密碼泄露是同樣的。
由於 N= p * q , 而p和q都是質數, N又是已知的,那麼咱們可不能夠經過質因數分解來獲得 p和q呢?
目前來講,尚未有效的對大整數進行質因素分解的高效算法,因此目前來講RSA算法仍是很安全的,可是一旦有這樣的算法出現,那麼RSA將會很容易被攻破。
因此官方推薦:1024比特的RSA算法不該該被用於新的用途。2048比特的RSA算法能夠用到2030年,4096比特的算法能夠用到2031年。
更多教程請參考 flydean的博客