更多內容請訪問 www.uusystem.com
RSA算法是一種"公鑰加密算法"。早期的加密模式,就是加密和解密都是用同一種規則(密鑰)。這種加密模式,就要求加密規則須要在雙方進行傳遞,信息是很不安全的。在這種加密模式下的算法,也叫"對稱加密算法"。而咱們今天要講的RSA算法,是一種"非對稱加密算法",加密和解密使用不一樣的規則,只要這兩種規則之間存在某種對應關係便可,這樣就避免了直接傳遞密鑰。
這種「非對稱加密算法」的模式,信息交互方式以下:
![天天一個算法——RSA加密算法](http://static.javashuo.com/static/loading.gif)
在這種加密模式下,只要私鑰不公開,通訊就是安全的。
我本身今天看了挺久的加密原理,裏面設計到一點數學,具體爲何就要這樣作,我也不懂更深層次的緣由,這裏就講點比較淺的東西。
即便是淺,咱們也要先了解一點比較基本的數學定理:
-
質數(素數)
在大於1的天然數中,除了1和它自己之外再也不有其餘因數的數稱爲質數,也叫素數。
-
互質關係
若是兩個數除了1之外,沒有其餘公因子,咱們就稱這兩個數存在互質關係。好比,15和32沒有公因子,因此它們之間有互質關係(不是質數也能夠構成互質關係)。
-
歐拉函數
在數論中,對於正整數N,小於或等於N ([1,N]),且與N互質的正整數(包括1)的個數,記做φ(n)。
任意兩個數p、q,若是p、q存在互質關係,咱們有φ(p*q) = (p-1)*(q-1)。這裏就不證實了,舉個例子就好。互質關係二、5,則φ(10)=1*4。結論,在1到10中,和10互質的正整數有4個(1,3,7,9)。
-
模反元素
若是兩個互質數p,q,那麼必定能夠找到整數x,使得 qx-1被p整除,或者說qx被p除的餘數是1。這時,x就叫作q的模反元素。(上面公式,能夠變換求xq + yp = 1,求x,這裏y爲負數)
例子:互質數三、5,這裏求5的模反元素,即5x + 3y = 1。能夠口算一下,這裏x=2,y=-3(或者x=5,y=-8)。能夠看出模反元素不惟一,但一旦x肯定,y也是肯定的。
上面提到的幾個概念,你們反覆推敲一下,RSA算法的密鑰就是從這幾個公式中推斷出來。瞭解了上面的幾個公式,下面咱們來說解RSA算法,獲取到加密的公鑰和私鑰。
1.隨機選擇兩個不相等的質數p和q。
這裏咱們選擇p = 3 , q = 11。(實際應用中,這兩個質數越大,就越難破解。)
2.計算p和q的乘積n。
n = p * q = 3 * 11 = 33
3.計算n的歐拉函數φ(n)。
φ(n) = (p - 1) * (q - 1) = 2 * 10 = 20
4.隨機選擇一個整數e,條件是1< e < φ(n),且e與φ(n) 互質。
咱們選擇與20互質的數,e=7(隨機選擇)。
5.計算e對於φ(n)的模反元素d。
這裏要求7對於20的模反元素,能夠有多個,咱們計算出一個便可。
公式7*d + 20*m = 1,求d。
這裏咱們選擇d=3,m=-1。(m這裏沒用)
6.將n和e封裝成公鑰,n和d封裝成私鑰。
這個例子中n=33,e=7,d=3,因此公鑰就是 (33,7),私鑰就是(33, 3)。
有了公鑰和私鑰,咱們就能夠進行安全通訊,公鑰進行加密,私鑰解密。可是RSA的算法可靠嗎?下面咱們來討論一下。
回顧一下上面密鑰的生成步驟,總共出現了六個數字:
![天天一個算法——RSA加密算法](http://static.javashuo.com/static/loading.gif)
在這六個數字中,公鑰(33,7)用到了兩個(n和e),其餘四個數都是不公開的。其中最關鍵的數是d,由於n和d組成了私鑰(33,3),假如d泄漏,就等於知道了n、d、e,密鑰就泄露了。
那麼,有沒有可能在知道n和e的狀況下,推導出d?
![天天一個算法——RSA加密算法](http://static.javashuo.com/static/loading.gif)
結論:假如n能夠被因數分解,那麼d就能夠算出,也就意味着私鑰被破解。
對大整數進行因式分解,是一件很困難的事情,目前只有用暴力破解,就是一個一個去試。目前已知,被破解最長RSA密鑰是768個二進制位。就是說,長度超過768位的密鑰,尚未被人破解(至少沒公開宣佈)。所以能夠認爲,1024位的RSA密鑰基本安全,2048位的密鑰極其安全。
舉個例子,咱們能夠對33進行分解成11和3,但下面這個數你沒辦法分解:
![天天一個算法——RSA加密算法](http://static.javashuo.com/static/loading.gif)
它等於下面兩個質數的乘積:
![天天一個算法——RSA加密算法](http://static.javashuo.com/static/loading.gif)
上面獲取到了公鑰和私鑰,還沒用他們加過密。這裏來舉例一下就好:
![天天一個算法——RSA加密算法](http://static.javashuo.com/static/loading.gif)