1. 程式人生 > >RSA公鑰密碼

RSA公鑰密碼

條件 公式 隨機數生成器 道理 str red 關系 生成 strong

一、RSA簡述

RSA是公鑰密碼的一種代表算法,它可以被用於公鑰密碼和數字簽名。


二、RSA加密

在RSA中,明文、私鑰和密文都是數字。它的加密過程是這樣的:

密文 = 明文 ^ E % N

也即是說,RSA的密文是對明文的數字的進行E次方計算,然後再進行求模得到的。這就是RSA的整個加密過程。

在這個式子中,E和N便是RSA加密的密鑰,即是說,E和N的組合就是公鑰,所以公鑰可以表示為(E,N)。

當然,E和N並非隨便什麽數都是可以的,這兩個數是經過嚴密計算得到的。


三、RSA解密

RSA的解密和加密一樣簡單,解密的過程如下:

明文 = 密文 ^ D % N

即是說,對密文的數字進行D次方計算,然後再進行求模便可得到明文。

同樣道理,可以得到私鑰為(D, N)。在加密解密中,N是同一個數字。

只有知道私鑰的人才能完成解密,亦是說只有知道D和N兩個數才能完成解密運算。N也是公鑰的一部分,所以,最主要的私鑰可以說是D。

D自然也不是普通的數字,D和E在數學上有著相當密切的聯系,所以可以用E加密,然後用D解密。


四、生成密鑰對

E和N是公鑰,D和N是私鑰,因此求E,D,N這三個數就是生成密鑰對。RSA密鑰的生成步驟如下:

  1. 求N
  2. 求L(此數僅在生成密鑰對的進程中使用)
  3. 求E
  4. 求D

1. 求N

首先需要準備兩個很大的質數p和q。

若是p和q太小的話,密碼便會容易破譯,但太大的話又會消耗很長的計算時間。

準備好兩個數後,將這兩個數相乘,其結果就是數N。即數N = p * q


2. 求L

L只用來生成密鑰對,它是p-1和q-1的最小公倍數。所以L = lcm(p - 1, q - 1)。


3. 求E

E是一個比1大,比1小的數,並且E和L的最大公約數必須為1.所以E和L的關系如下:

1 < E < L
gcd(E, L) = 1

要找到滿足gcd(E, L) = 1的數,需要使用偽隨機數生成器。通過偽隨機生成器在1 < E < L的範圍內生成E的候選數,然後再判斷其是否滿足gcd(E, L) = 1。

之所以要加上gcd(E, L) = 1這個條件,是為了保證一定存在解密時需要使用的數D。

現在,公鑰對已經求出來了。


4. 求D

數D是由數E計算得到的。D、E、L之間必須有如下關系:

1 < D < L
E * D % L = 1

只要滿足上述條件,則使用E和N加密的密文,便可通過D和N進行解密。

也就是說,E * D % L = 1保證了對密文進行解密時能得到原來的明文。


五、簡單測試

1. 求N

假設p = 17, q =19。(都質數,測試時數字選小點好計算)

N = p * q = 17 * 19 = 323。


2. 求L

L = lcm(p - 1, q - 1) = lcm(16, 18) = 144。


3. 求E

gcd(E, L) = 1

可以找到這些數:5, 7, 11, 13, 17, 19, 23,25......

這些數只要相對L是質數便可以。


4. 求D

E * D % L = 1

當E = 5, 時,此式子為:
5 * D % 144 = 1

可找出當D = 29時可滿足。

所以,公鑰為:E = 5, N = 323; 私鑰為D = 29, N = 323。


5. 加密

現在用這個密鑰對通過先前的公式來進行加密。

要加密的數必須小於N,所以要小於323(因為需要求%N,對N求模必定小於N,所以如果明文本身大於N,則解密後就無法得到正確的明文)。

明文 ^ E % N = 123 ^ 5 % 323 = 225。


6. 解密

密文 ^ D % N = 225 ^29 % 323 = 123。

RSA公鑰密碼