總結公開密鑰RSA算法

對稱加密從名字上很容易理解,就是加密和解密使用相同的密鑰和算法,加密解密過程是可逆的。與之對應還有一種非對稱加密算法,即加密和解密使用不同的密鑰,非對稱密鑰我比較喜歡叫公開密鑰算法,因爲公開密鑰中使用的密鑰是一對的,分爲公鑰和私鑰兩部分,其中公鑰是可以公開的,私鑰則不公開,通常由密鑰對的生成方持有。總結下對稱加密和公開密鑰(非對稱加密)的不同點:

  1. 密鑰:對稱加密中的密鑰是一串數字,加密和解密都使用相同的密鑰。公開密鑰中使用密鑰對,分爲公鑰和私鑰,私鑰需要保密,公鑰則可以被公開。
  2. 性能:對稱加密速度較公開密鑰快很多,對稱加密中的流密碼方式支持並行處理,塊密碼中的CTR計數器模式,由於特殊的迭代方式,也可以做到並行處理。公開密鑰算法由於密鑰長度較大,通常爲2048比特(對稱加密AES算法通常不超過256比特),所以計算量大,導致整體運算慢,當然密鑰長度越長,安全性也就越好。
  3. 功能:對稱加密算法通常就只用來做信息的加密和解密,而公開密鑰除了加密解密外,還可以用在數字簽名和密鑰協商方面。

 

使用場景

實際上,公開密鑰由於速度太慢,很少用在加密解密中,尤其是HTTP應用中通常包含的內容很多,且是明文形式傳輸,所以使用公開密鑰算法的性能就十分差。不過使用到公開密鑰進行加密解密的情況還是有的,例如下面的場景。

單向加密

假設一個用戶取款的場景,在用戶登錄自己賬戶時,輸入了賬號和密碼,之後要將這些數據發送到服務器進行驗證,由於密碼是較爲重要且隱私的數據,通常發送前,在客戶端會先對隱私數據進行加密後再發送,所以上面的場景使用公開密鑰的方式,過程就有:

  1. 客戶端先和服務器端建立連接,成功後,由服務器端生成密鑰對,然後將公鑰部分發送給客戶端,自己保留私鑰部分。
  2. 客戶端接收到公鑰後,利用該公鑰將密碼等隱私數據進行加密,然後發送給服務器驗證。
  3. 服務器接收到請求,使用對應的私鑰進行解密。

從上述過程可以看到,由於只有服務器端纔有對應的私鑰,所以即使公鑰部分被公開,也沒什麼問題,因爲公開密鑰方式加密和解密過程並不是可逆的,即使密文和公鑰都泄露了,也只有服務器端持有私鑰能進行解密。

雙向加密

還是上面那個取款場景,當用戶登錄成功後,進行餘額查詢操作,向服務器端發送查詢請求,服務器端返回用戶的賬戶餘額。餘額這項數據也是比較隱私的,所以可以在服務器端對餘額數據進行加密後,再返回給客戶端。可是服務器端只有私鑰,即使使用私鑰進行信息加密,發送到客戶端也沒辦法使用公鑰進行解密,這種情況就要用到雙向加密,具體過程如下:

  1. 回到最初的起點,客戶端首先生成一對密鑰對,然後和服務器建立連接,成功後將自己生成的密鑰對中公鑰部分發送給服務器端,私鑰部分自己保留。
  2. 服務端接收到客戶端發來的公鑰後,自己保留,然後自己生成另一對密鑰對,並將其中的公鑰部分返回給客戶端,私鑰部分自己保留。
  3. 客戶端使用服務器端密鑰對的公鑰部分對密碼數據進行加密,發送給服務器端。服務器端接收到密文後,使用對應的私鑰進行解密。
  4. 服務器端將賬戶餘額數據,使用客戶端發來的公鑰進行加密,密文再返回給客戶端。客戶端接收到查詢餘額返回信息後,利用對應的私鑰進行解密,得到賬戶餘額信息。

上述就是雙向加密的過程。

 

RSA算法

歐拉函數&定理

理解RSA加密的過程,首先要知道其中用到的數學概念,對RSA算法起到關鍵作用的是歐拉函數,用最簡單的方式表達,即:

“用φ(n)表示,n爲正整數,計算在小於等於n的正整數中所有與n構成互質關係的數的個數。”

例如在小於等於12的正整數裏,質數有1、3、5、7、11,那麼φ(n)=5。結合歐拉函數,有以下的定理:

  1. 如果一個數n是兩個互質整數的乘積,如p*q=n,則有φ(pq)= φ(n)。
  2. 對於一個質數n,有φ(n)=n-1。即小於質數n的所有正整數與n都爲互質數。
  3. 結合上面兩個式子,可得φ(n)=(p-1)(q-1)。

由歐拉函數應用得到歐拉定理:兩個正整數p和q爲互質數,則有:pφ(q)≡1(modq),即p的 φ(q)次方除q的餘數等於1,“≡”是數論中的“同餘”運算符。

  1. 根據第三點定理,還可以進行下面的推導:

pφ(q)=p*pφ(q)-1≡1(modq)

令x=pφ(q)-1,則px≡1(modq)

計算密鑰

瞭解裏面用到的數學概念後,來看看利用公開密鑰RSA算法生成密鑰對,都用到了那些參數:

在RSA算法的生成密鑰的過程需要用到的參數有兩個很大的質數p和q, n是p和q的乘積,e是大於1小於φ(q)(即(p-1)(q-1))範圍內的一個隨機整數,e和n組合在一起成爲公鑰,n的值爲密鑰對的長度。私鑰d通過e、q和p計算得到。接下來看看計算密鑰的過程。

  1. 首先隨機選擇兩個很大質數p和q(重點注意是很大的質數),計算出p和q的乘積爲n。
  2. 根據前面歐拉定理求出φ(n)=(p-1)(q-1)。
  3. 接下來在1到φ(n)範圍內選擇一個隨機整數e,根據上面歐拉定理第4點,有ed≡1(modφ(n)),代入數據解出d即爲私鑰。

如何保證安全性?

前面說到,e和n組合在一起成爲公鑰,公鑰是可以公開的,那麼根據上面的加密過程看,可以對n進行因式分解,解出p和q,然後求出(p-1)(q-1)得到φ(n),最後根據式子ed≡1(modφ(n))不就可以解出私鑰了?其實,RSA保證安全性是因爲大整數的因式分解十分困難,根據網上的資料查得,目前已被分解的最大十進制整數爲232個十進制爲,最大的二進制數爲768個二進制位。在RSA加密算法中,我們通常使用1024位二進制位,可以說基本安全,當然也可以使用2048位二進制位達到更高的安全性。所以說,n是由兩個大質數相乘得到,對其做因式分解是很困難的。

 

加密解密過程

首先用genrsa子命令生成密鑰對文件,密鑰長度爲2048比特,然後使用從密鑰對中分離出公鑰,-pubout參數輸出爲公鑰文件。可以使用命令,-pubin參數查看公鑰文件信息。可以看到,Public-Key顯示密鑰長度爲2048bit,Modulus的值顯示公開密鑰係數,就是n。Exponent的值表示的是e,接下來顯示的就是公鑰的值。

      生成密鑰對和分離出公鑰後,在END PUBLIC KEY下一行就可以使用rsautl子命令對數據進行加密和解密了,加密命令中,-pubin參數指打開公鑰文件,即-inkey參數輸入公鑰文件,利用公鑰進行加密。

發佈了101 篇原創文章 · 獲贊 73 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章