學習RSA公開密鑰算法


圖爲 RSA公開密鑰算法的發明人,從左到右Ron Rivest, Adi Shamir, Leonard Adleman. 照片攝於1978年html

(和訊財經原創)算法

   RSA加密算法是最經常使用的非對稱加密算法,CFCA在證書服務中離不了它。可是有很多新來的同事對它不太瞭解,剛好看到一本書中做者用實例對它進行了簡化而生動的描述,使得高深的數學理論可以被容易地理解。咱們通過整理和改寫特別推薦給你們閱讀,但願可以對時間緊張可是又想了解它的同事有所幫助。
   RSA是第一個比較完善的公開密鑰算法,它既能用於加密,也能用於數字簽名。RSA以它的三個發明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,這個算法經受住了多年深刻的密碼分析,雖然密碼分析者既不能證實也不可否定RSA的安全性,但這偏偏說明該算法有必定的可信性,目前它已經成爲最流行的公開密鑰算法。
  RSA的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進制數或更大)的函數。從一個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積(這是公認的數學難題)。
  RSA的公鑰、私鑰的組成,以及加密、解密的公式可見於下表:


  可能各位同事很久沒有接觸數學了,看了這些公式難免一頭霧水。別急,在沒有正式講解RSA加密算法之前,讓咱們先複習一下數學上的幾個基本概念,它們在後面的介紹中要用到:

1、 什麼是「素數」?
  素數是這樣的整數,它除了能表示爲它本身和1的乘積之外,不能表示爲任何其它兩個整數的乘積。例如,15=3*5,因此15不是素數;又如,12=6*2=4*3,因此12也不是素數。另外一方面,13除了等於13*1之外,不能表示爲其它任何兩個整數的乘積,因此13是一個素數。素數也稱爲「質數」。

2、什麼是「互質數」(或「互素數」)?
  小學數學教材對互質數是這樣定義的:「公約數只有1的兩個數,叫作互質數。」這裏所說的「兩個數」是指天然數。
  判別方法主要有如下幾種(不限於此):
(1)兩個質數必定是互質數。例如,2與七、13與19。
(2)一個質數若是不能整除另外一個合數,這兩個數爲互質數。例如,3與十、5與 26。
(3)1不是質數也不是合數,它和任何一個天然數在一塊兒都是互質數。如1和9908。
(4)相鄰的兩個天然數是互質數。如 15與 16。
(5)相鄰的兩個奇數是互質數。如 49與 51。
(6)大數是質數的兩個數是互質數。如97與88。
(7)小數是質數,大數不是小數的倍數的兩個數是互質數。如 7和 16。
(8)兩個數都是合數(二數差又較大),小數全部的質因數,都不是大數的約數,這兩個數是互質數。如357與715,357=3×7×17,而三、7和17都不是715的約數,這兩個數爲互質數。等等。

3、什麼是模指數運算?
  指數運算誰都懂,沒必要說了,先說說模運算。模運算是整數運算,有一個整數m,以n爲模作模運算,即m mod n。怎樣作呢?讓m去被n整除,只取所得的餘數做爲結果,就叫作模運算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。
  模指數運算就是先作指數運算,取其結果再作模運算。如
  好,如今開始正式講解RSA加密算法。
算法描述:
(1)選擇一對不一樣的、足夠大的素數p,q。
(2)計算n=pq。
(3)計算f(n)=(p-1)(q-1),同時對p, q嚴加保密,不讓任何人知道。
(4)找一個與f(n)互質的數e,且1<e<f(n)。
(5)計算d,使得de≡1 mod f(n)。這個公式也能夠表達爲d ≡e-1 mod f(n)
這裏要解釋一下,≡是數論中表示同餘的符號。公式中,≡符號的左邊必須和符號右邊同餘,也就是兩邊模運算結果相同。顯而易見,無論f(n)取什麼值,符號右邊1 mod f(n)的結果都等於1;符號的左邊d與e的乘積作模運算後的結果也必須等於1。這就須要計算出d的值,讓這個同餘等式可以成立。
(6)公鑰KU=(e,n),私鑰KR=(d,n)。
(7)加密時,先將明文變換成0至n-1的一個整數M。若明文較長,可先分割成適當的組,而後再進行交換。設密文爲C,則加密過程爲:
(8)解密過程爲:

實例描述:
  在這篇科普小文章裏,不可能對RSA算法的正確性做嚴格的數學證實,但咱們能夠經過一個簡單的例子來理解RSA的工做原理。爲了便於計算。在如下實例中只選取小數值的素數p,q,以及e,假設用戶A須要將明文「key」經過RSA加密後傳遞給用戶B,過程以下:
(1)設計公私密鑰(e,n)和(d,n)。
令p=3,q=11,得出n=p×q=3×11=33;f(n)=(p-1)(q-1)=2×10=20;取e=3,(3與20互質)則e×d≡1 mod f(n),即3×d≡1 mod 20。
d怎樣取值呢?能夠用試算的辦法來尋找。試算結果見下表:

  經過試算咱們找到,當d=7時,e×d≡1 mod f(n)同餘等式成立。所以,可令d=7。從而咱們能夠設計出一對公私密鑰,加密密鑰(公鑰)爲:KU =(e,n)=(3,33),解密密鑰(私鑰)爲:KR =(d,n)=(7,33)。
(2)英文數字化。
  將明文信息數字化,並將每塊兩個數字分組。假定明文英文字母編碼表爲按字母順序排列數值,即:

  則獲得分組後的key的明文信息爲:11,05,25。
(3)明文加密
  用戶加密密鑰(3,33) 將數字化明文分組信息加密成密文。由C≡Me(mod n)得:

  所以,獲得相應的密文信息爲:11,31,16。
4)密文解密。
  用戶B收到密文,若將其解密,只須要計算,即:

  用戶B獲得明文信息爲:11,05,25。根據上面的編碼表將其轉換爲英文,咱們又獲得了恢復後的原文「key」。
   你看,它的原理就能夠這麼簡單地解釋!
   固然,實際運用要比這複雜得多,因爲RSA算法的公鑰私鑰的長度(模長度)要到1024位甚至2048位才能保證安全,所以,p、q、e的選取、公鑰私鑰的生成,加密解密模指數運算都有必定的計算程序,須要仰仗計算機高速完成。

最後簡單談談RSA的安全性

   首先,咱們來探討爲何RSA密碼難於破解?
   在RSA密碼應用中,公鑰KU是被公開的,即e和n的數值能夠被第三方竊聽者獲得。破解RSA密碼的問題就是從已知的e和n的數值(n等於pq),想法求出d的數值,這樣就能夠獲得私鑰來破解密文。從上文中的公式:d ≡e-1 (mod((p-1)(q-1)))或de≡1 (mod((p-1)(q-1))) 咱們能夠看出。密碼破解的實質問題是:從Pq的數值,去求出(p-1)和(q-1)。換句話說,只要求出p和q的值,咱們就能求出d的值而獲得私鑰。
   當p和q是一個大素數的時候,從它們的積pq去分解因子p和q,這是一個公認的數學難題。好比當pq大到1024位時,迄今爲止尚未人可以利用任何計算工具去完成分解因子的任務。所以,RSA從提出到如今已近二十年,經歷了各類攻擊的考驗,逐漸爲人們接受,廣泛認爲是目前最優秀的公鑰方案之一。
  然而,雖然RSA的安全性依賴於大數的因子分解,但並無從理論上證實破譯RSA的難度與大數分解難度等價。即RSA的重大缺陷是沒法從理論上把握它的保密性能如何。
  此外,RSA的缺點還有:A)產生密鑰很麻煩,受到素數產生技術的限制,於是難以作到一次一密。B)分組長度太大,爲保證安全性,n 至少也要 600 bits 以上,使運算代價很高,尤爲是速度較慢,較對稱密碼算法慢幾個數量級;且隨着大數分解技術的發展,這個長度還在增長,不利於數據格式的標準化。所以,使用RSA只能加密少許數據,大量的數據加密還要靠對稱密碼算法。安全

(和訊財經原創)函數

相關文章
相關標籤/搜索