RSA公鑰密碼
一、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密鑰的生成步驟如下:
- 求N
- 求L(此數僅在生成密鑰對的進程中使用)
- 求E
- 求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公鑰密碼