非對稱加密算法-RSA算法

  加密算法分爲對稱加密算法和非對稱加密算法,其中非對稱加密算法做爲計算機通訊安全的基石,在保證數據安全方面起着重要的做用。而相對於對稱加密算法的易理解性,非對稱加密算法存在必定的難度。下面經過對RSA算法的剖析,讓咱們更好的理解非對稱加密算法的原理。算法

1、對稱加密算法和非對稱加密算法

一、對稱加密算法

  對稱加密算法:加密和解密都使用一樣規則(密鑰)的算法。安全

  (1)、A選擇某一種規則對信息進行加密;函數

  (2)、B使用同一規則(逆規則)對信息進行解密;性能

二、非對稱加密算法

  非對稱加密算法:加密和解密可使用不一樣的規則,只要這兩種規則之間存在某種對應關係便可。加密

  (1)、B根據算法生成兩把密鑰(公鑰和私鑰),其中私鑰是保密的,公鑰是公開的,供要與B通訊的其它人使用;es5

  (2)、A從B處獲取公鑰,並用它來加密;spa

  (3)、B獲得A加密後的信息,用私鑰進行解密,完成通訊;blog

2、RSA算法的數學基礎

一、互質關係

  互質又稱爲互素,若是兩個或兩個以上的整數的最大公約數是 1,則稱它們爲互質。好比7和10,他們最大的公約數是1,因此他們互質。8和10最大的公約數是2,因此他們不是互質。並非只有兩個質數才能造成互質。
  根據互質關係,能夠得出如下結論(後面歐拉函數會用到):資源

  • 兩個不一樣的質數必定互質。例如,2與七、13與19。
  • 一個質數,另外一個不爲它的倍數,這兩個數互質。例如,3與十、5與 26。
  • 1和任何一個天然數都互質。如1和9908。
  • 2的冪和任何一個奇數都互質。如32和7五、256與315。
  • 相鄰兩個天然數互質。如15與16。
  • 相鄰兩個奇數互質。如49與51。

二、歐拉函數

  歐拉函數指的是對正整數n,求小於或等於n的正整數中與n互質的數的數目,記做φ(n)。好比1至10中,與10造成互質關係的有1,3,7,9,因此φ(10)=4。
  歐拉函數通用公式爲(除n=1外,φ(1)=1):
\[ φ(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})......(1-\frac{1}{p_r}) \\ n={p_1}^{k_1}*{p_2}^{k_2}......{p_r}^{k_r},其中p_一、p_2......p_r爲質數 \]
  好比φ(20)=8計算過程以下:
\[ φ(20)=φ(2^2\times5)=20(1-\frac{1}{2})(1-\frac{1}{5})=8 \]
  歐拉函數證實以下:文檔

  • 當n=1時,φ(1) = 1

   由於1與任何數都構成互質關係,則 φ(1) = 1 。

  • 當n是質數,φ(n) =n-1

   由於質數與小於它的每個數,都構成互質關係,則φ(n) =n-1。如φ(5)=5-1=4。

  • 當n是質數的某個次方,公式以下,其中p爲質數,k爲大於1的整數
    \[ φ(p^k) =p^k(1-\frac{1}{p}) \]
    由於質數的某個次方與除與質數的倍數外都造成互質關係,而質數的倍數1 * p、2 * p、3 * p、……、p^(k-1) * p,即有p^(k-1)個,則
    \[ φ(p^k) =p^k-p^{k-1}=p^k(1-\frac{1}{p}),如φ(5^3)=5^3(1-\frac{1}{5})=100。 \]

  • 當n能夠分解成兩個互質的整數之積,
    \[ φ({p_1}\times{p_2})= φ(p_1)φ(p_2) \]
    該定理用到中國剩餘定理便可證實,具體過程可參考其它文檔。如φ(15)=φ(3 * 5)=φ(3) φ(5) =2 * 4 =8。
    根據以上推論,由於任意一個大於1的正整數,均可以寫成一系列質數的積,能夠推導出當n爲大於1的整數時:
    \[ n={p_1}^{k_1}{p_2}^{k_2}...{p_r}^{k_r} \]

    \[ φ(n)=φ({p_1}^{k_1}{p_2}^{k_2}...{p_r}^{k_r}) \]

    \[ φ(n)=φ({p_1}^{k_1})φ({p_2}^{k_2})...φ({p_r}^{k_r}) \]

    \[ φ(n)={p_1}^{k_1}(1-\frac{1}{p_1}){p_2}^{k_2}(1-\frac{1}{p_2})...{p_r}^{k_r}(1-\frac{1}{p_r}) \]

    \[ φ(n)={p_1}^{k_1}{p_2}^{k_2}...{p_r}^{k_r}(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_r}) \]

    \[ φ(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_r}) \]

    以上即爲歐拉函數的通用計算公式。

三、歐拉定理

  歐拉定理也稱費馬-歐拉定理,指的是:若是兩個正整數a和n互質,則n的歐拉函數 φ(n) 可讓下面的等式成立。
\[ a^{φ(n)}=1(mod\ n) \]
  即a的φ(n)次方被n除的餘數爲1,或者說a的φ(n)次方減1,能被n整除。如7和5互質
\[ 7^{φ(5)}-1=7^4-1=2401-1=2400,能夠被5整除 \]

四、模反元素

  若是兩個正整數a和n互質,那麼必定能夠找到整數b,使得 ab-1 被n整除,或者說ab被n除的餘數是1。這時,b就叫作a的模反元素。證實以下:
\[ a^{φ(n)}=a\times a^{φ(n-1)} = 1(mod\ n),其中a^{φ(n-1)}就是a的模反元素 \]

3、RSA算法過程

一、生成密鑰對(公鑰和私鑰)

  • 隨機找兩個質數a和b(a和b越大越安全),並計算他們的乘積n

    好比 a = 5 ,b = 11。計算他們的乘積 n = 5 * 11 = 55 ,轉化爲二進爲 110111,該加密算法即爲 6 位。本例子中是爲了計算方便,因此取的數比較小,實際算法是 1024 位 或 2048 位,位數越長,算法越難被破解。

  • 計算n的歐拉函數m = φ(n)

    根據公式m = φ(55) = φ(5)φ(11) = (5-1)(11-1) = 40

  • 隨機選擇一個整數e,條件是1<e<m,且e與m互質

    咱們隨機選擇e=17

  • 計算e對於φ(n)(即m)的模反元素d

    即找一個整數 d,使得 (e * d ) % m = 1。 等價於 e * d - 1 = y * m ( y 爲整數) 找到 d ,實質就是對下面二元一次方程求解。 e * x - m * y = 1 。其中 e = 17,m = 40,17x - 40y = 1 這個方程能夠用"擴展歐幾里得算法"求解。具體求解過程略,算出一組整數解(x,y )= (33,14),即 d=33。 到此密鑰對生成完畢。不一樣的e生成不一樣的d,所以能夠生成多個密鑰對。

  本例中公鑰爲(n,e) = (55 , 17),私鑰爲(n,d) = (55 ,33) ,僅(n,e) =(55 , 17)是公開的,其他數字均不公開。能夠想像若是隻有 n 和 e,如何推導出 d,目前只能靠暴力破解,位數越長,暴力破解的時間越長。

二、加密生成密文

  對明文z採用公鑰(n,e)進行加密,其中明文必須轉換爲數字,且必須比n小。加密的公式以下:
\[ z^e=c(mod\ n) \]
  其中z爲明文,n和e爲公鑰,c爲加密後的密文,因此c能夠轉換爲:
\[ c=z^e \% n \]
  假如明文爲15,公鑰(n,e) = (55 , 17),則加密後的密文c爲:
\[ c=15^{17}\%55=5 \]

三、解密生成明文

  對密文c採用公鑰(n,d)進行解密,解密的公示以下:
\[ c^d=z(mod\ n) \]
  其中c爲密文,n和d爲私鑰,z爲解密後的明文,因此z能夠轉換爲:
\[ z=c^d\%n \]
  根據上述條件,密文c爲5,私鑰(n,d) = (55 ,33) ,則解密後的明文z爲:
\[ z=5^{33}\%55=15 \]

4、RSA算法有效性證實

一、有效性問題

  根據上述RSA算法示例,要驗證RSA算法的有效性,即驗證根據加密公式:
\[ z^e=c(mod\ n) \]
  能夠推導出,解密公式是有效的:
\[ c^d=z(mod\ n) \]

二、證實過程

  根據加密規則,能夠推導出:
\[ c= z^e - kn \]
  將上述式子代入解密公式,即求證如下式子成立:
\[ (z^e-kn)^d = z(mod\ n) \]

\[ z^{ed} = z(mod\ n) \]

  • 當z與n互質時

    根據歐拉定理
    \[ z^{φ(n)} = 1(mod\ n) \]
    則能夠推出
    \[ z\times {(z^{φ(n)})}^p=z(mod\ n) \]

    \[ z^{1+pφ(n)}=z(mod\ n) \]

    因爲
    \[ ed = 1(mod\ φ(n)) \]

    \[ ed = 1+pφ(n) \]

    因此能夠推導出
    \[ z^{ed} = z(mod\ n) \]

  • 當z與n不爲互質時

    由於n=a*b,其中a和b都爲質數。由於z和n不爲互質,則z和n一定有一個公約數,因爲n爲兩個質數a和b的乘積,則z必定爲a或b的倍數,記做ka或者kb。

    假定z=ka(a=kb同理)。因爲b爲質數,若是k爲b的倍數,即k=hb,則z=hab,其中h爲正整數,則推導出z大於n,可是根據條件被加密的明文必須小於n,因此能夠推導出k不是b的倍數,因爲b爲質數,因此能夠推斷出k和b互質,同理,推導出ka與b互質,即z與b互質。

    根據歐拉定理,可知下列式子成立:
    \[ z^{φ(b)}≡1(mod\ b) \]
    可推導出:
    \[ z^{φ(b)}=(ka)^{φ(b)}=(ka)^{b-1}≡1(mod\ b) \]
    對於一個數求餘結果爲1,那麼它的n次方,求餘也爲1。根據這個定理,可推導出:
    \[ {[(ka)^{b-1}]}^{h(a-1)}≡1(mod\ b) \]

    \[ {[(ka)^{b-1}]}^{h(a-1)}\times ka≡ka(mod\ b) \]

    \[ {(ka)}^{ed}≡ka(mod\ b) \]

    \[ {(ka)}^{ed}=ka+ob \]

    因爲兩名等式成立,且a與b互質,能夠推導出o必定爲a的倍數,即0=ja,可推導出:
    \[ {(ka)}^{ed}=ka+ob=ka+jab \]
    由於z=ka,n=ab,因此能夠退出:
    \[ z^{ed}≡z(mon\ n) \]

5、RSA算法的安全性

  RSA算法的安全性,是基於目前的條件下,在空間和時間上,沒法對它進行有效破解。

  根據上述推導,RSA算法用到a、b、n、m、e、d六個數字。其中公鑰(n,e)是公開的,其他的4個數字是保密的。其中密鑰d是算法的核心。

  • e*d ≡ 1 (mod m)。其中e是公開的,那就須要知道m,才能算出d。
  • 根據公式φ(n)=(a-1)(b-1)=m,要計算出m,必須知道a和b。
  • n=ab。只有將n因數分解,才能算出a和b。

  目前對於大數的因數分解,除了暴力破解,沒有更好的途徑。以現有的計算資源和能力,目前能被破解的最長RSA密鑰就是768位,因此只要保證RSA密鑰是1024位及以上,便可保證算法的安全性。

6、總結

一、RSA算法流程

二、RSA算法安全性

  目前對於大數的因數分解,除了暴力破解,沒有更好的途徑。以現有的計算資源和能力,目前能被破解的最長RSA密鑰就是768位,因此只要保證RSA密鑰是1024位及以上,便可保證算法的安全性。

三、RSA算法應用

  在RSA算法中,公鑰(n,e) 只能加密小於n的整數。對於大於n的整數,能夠採用兩種方法。一是把長信息分割成若干段短消息,每段分別加密;另外一種是先選擇一種對稱性加密算法加密信息,再用RSA公鑰加密對稱性加密算法的密鑰。

  另外,因爲RSA算法性能問題,一般加解密都比較慢,因此一般和對稱性加密算法一塊兒配合使用。

相關文章
相關標籤/搜索