RSA非對稱加密算法詳解

RSA加密算法是最常用的非對稱加密算法,由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)於1977年一起提出,RSA就是他們三人姓氏開頭字母拼在一起組成的。非對稱加密算法的特點就是加密祕鑰和解密祕鑰不同,祕鑰分爲公鑰和私鑰,用私鑰加密的明文,只能用公鑰解密;用公鑰加密的明文,只能用私鑰解密。

RSA是第一個比較完善的公開密鑰算法,它既能用於加密,也能用於數字簽名。這個算法經受住了多年深入的密碼分析,雖然密碼分析者既不能證明也不能否定RSA的安全性,但這恰恰說明該算法有一定的可信性,目前它已經成爲最流行的公開密鑰算法。RSA的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進制數或更大)的函數。從一個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積(這是公認的數學難題)。

首先複習一下數學上的幾個基本概念,它們在後面的介紹中要用到:
一、 什麼是“素數”?
  素數是這樣的整數,它除了能表示爲它自己和1的乘積以外,不能表示爲任何其它兩個整數的乘積。例如,15=3*5,所以15不是素數;又如,12=6*2=4*3,所以12也不是素數。另一方面,13除了等於13*1以外,不能表示爲其它任何兩個整數的乘積,所以13是一個素數。素數也稱爲“質數”。

二、什麼是“互質數”(或“互素數”)?
  小學數學教材對互質數是這樣定義的:“公約數只有1的兩個數,叫做互質數。”這裏所說的“兩個數”是指自然數。
  判別方法主要有以下幾種(不限於此):
(1)兩個質數一定是互質數。例如,2與7、13與19。
(2)一個質數如果不能整除另一個合數,這兩個數爲互質數。例如,3與10、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,而3、7和17都不是715的約數,這兩個數爲互質數。等等。

三、什麼是模指數運算? 
  指數運算誰都懂,不必說了,先說說模運算。模運算是整數運算,有一個整數m,以n爲模做模運算,即m mod n。怎樣做呢?讓m去被n整除,只取所得的餘數作爲結果,就叫做模運算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。 
  模指數運算就是先做指數運算,取其結果再做模運算。如(5^3) mod 7 = (125 mod 7) = 6。
  接下來正式講解RSA加密算法。

四、RSA算法描述

RSA的公鑰、私鑰的組成,以及加密過程、解密過程的公式可見於下表:

公鑰KU

n:兩素數p和q的乘積(p和q必須保密)(n爲模值

e:與(p-1)*(q-1)互質(e稱爲公鑰指數

私鑰KR

n:兩素數p和q的乘積(p和q必須保密)(n爲模值

d:滿足(d*e) mod ((p-1)*(q-1)) = 1(d稱爲私鑰指數

加密過程 C=M^e mod n  (C爲密文
解密過程 M=C^d mod n  (M爲明文

其中,符號^表示數學上的指數運算;mod表示模運算,即相除取餘數。具體算法步驟如下:
(1)選擇一對不同的、足夠大的素數p,q。
(2)計算n=p*q。
(3)計算f(n)=(p-1)*(q-1),同時對p, q嚴加保密,不讓任何人知道。
(4)找一個與f(n)互質的數e作爲公鑰指數,且1<e<f(n)。
(5)計算私鑰指數d,使得d滿足(d*e) mod f(n) = 1
(6)公鑰KU=(e,n),私鑰KR=(d,n)。
(7)加密時,先將明文變換成0至n-1的一個整數M。若明文較長,可先分割成適當的組,然後再進行交換。設密文爲C,則加密過程爲:C=M^e mod n。
(8)解密過程爲:M=C^d mod n。 

五、實例描述
  本文不對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 mod f(n) = 1,即3×d mod 20 =1。
d怎樣取值呢?可以用試算的辦法來尋找。試算結果見下表:

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

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

        M1 = C1^e mod n = 11^3 mod 33 = 11

        M2 = C2^e mod n = 5^3 mod 33 = 26

        M3 = C3^e mod n = 25^3 mod 33 = 16
  因此,得到相應的密文信息爲:11,26,16。
4)密文解密
  用戶B收到密文,若將其解密,只需要計算M=C^d mod n,即:

        C1 = M1^d mod n = 11^7 mod 33 = 11

        C2 = M2^d mod n = 26^7 mod 33 = 5

        C3 = M3^d mod n = 16^7 mod 33 = 25

用戶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) mod ((p-1)*(q-1)) = 1,我們可以看出,密碼破解的實質問題是:從p*q的數值,去求出(p-1)和(q-1)。換句話說,只要求出p和q的值,我們就能求出d的值而得到私鑰。
   當p和q是一個大素數的時候,從它們的積p*q去分解因子p和q,這是一個公認的數學難題。比如當p*q大到1024位時,迄今爲止還沒有人能夠利用任何計算工具去完成分解因子的任務。因此,RSA從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸爲人們接受,普遍認爲是目前最優秀的公鑰方案之一。
  缺點1:雖然RSA的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難度等價。即RSA的重大缺陷是無法從理論上把握它的保密性能如何。

下表列出了對同一安全級別所對應的密鑰長度。

保密級別

對稱密鑰長度(bit)

RSA密鑰長度(bit)

ECC密鑰長度(bit)

保密年限

80

80

1024

160

2010

112

112

2048

224

2030

128

128

3072

256

2040

192

192

7680

384

2080

256

256

15360

512

2120

    缺點2:從上邊可以看出,同樣安全級別的加密算法,RSA需要更長的密鑰。這就使運算速度較慢,較對稱密碼算法慢幾個數量級。且隨着大數分解技術的發展,這個長度還在增加,不利於數據格式的標準化。

       缺點3:RSA產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。

因此,使用RSA只能加密少量數據,大量的數據加密還要靠對稱密碼算法。實際應用中一般用來加密對稱算法的密鑰,而密文多用對稱加密算法加密傳輸。

七、RSA1024/2048

RSA算法密鑰長度的選擇是安全性和程序性能平衡的結果,密鑰長度越長,安全性越好,加密解密所需時間越長。實際中常使用1024bit祕鑰和2048bit祕鑰,分別稱爲RSA1024和RSA2048。祕鑰包含公鑰和私鑰,即公鑰私鑰長度一樣,都是1024bit或2048bit。RSA幾個特性如下:

1.密鑰長度增長一倍,公鑰操作所需時間增加約4倍,私鑰操作所需時間增加約8倍,公私鑰生成時間約增長16倍。

2. 一次能加密的密文長度與密鑰長度成正比, len_in_byte(raw_data) = len_in_bit(key)/8 -11,如1024bit的密鑰,一次能加密的內容長度爲 1024/8 -11 = 117 byte。所以非對稱加密一般都用於加密對稱加密算法的密鑰,而不是直接加密內容。

3. 加密後密文的長度爲密鑰的長度,如密鑰長度爲1024bit(128Byte),最後生成的密文固定爲 1024bit(128Byte)。

關於RSA密鑰長度、明文長度和密文長度請參考:RSA密鑰長度、明文長度和密文長度

參考文獻:

[1]https://www.cnblogs.com/jiftle/p/7903762.html

[2]https://blog.csdn.net/liwei16611/article/details/83751851

[3]http://blog.sina.com.cn/s/blog_4fcd1ea301012o4q.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章