前言:
爲了方便查看博客,特意申請了一個公衆號,附上二維碼,有興趣的朋友可以關注,和我一起討論學習,一起享受技術,一起成長。
前期調試 RSA 算法相關的操作,一直想寫個掃盲文章,記錄一下相關的概念和操作流程。本文大多參考網上的內容,僅以瞭解的思路整理成文,對 RSA 算法有一個初步的認識。
1. 概述
RSA 加密算法是一種非對稱加密算法,RSA 非對稱加密存在大量的取模運算,加密速度慢,在實際應用中結合對稱加密算法一起使用,RSA 對對稱加密的私鑰進行加密。RSA 算法的可靠性由對極大整數做因數分解的難度決定。
2. 算法參數
參數 | 解釋 | 備註 |
---|---|---|
M | 明文 | |
C | 密文 | |
N | 模數,兩個很大的質數的乘積 | |
E | 公鑰指數 | |
D | 私鑰指數 | D 是 E 對於 φ(n) 的模反元素 |
p,q | 兩個比較大的質數 | |
(E,N) | 公鑰 | |
(D,N) | 私鑰 | |
(E,D,N) | 密鑰對 | |
p q dp dq qinv | CRT模式的私鑰 | p、q 爲兩個大素數。RSA1024 算法,二者長度均爲 1024/2 = 512bit = 64byte,dp、dq 兩個參數長度也和P、Q長度相等。n =p * q長度爲 1024 bit(128byte),d 爲私鑰參數;e 爲公鑰指數(一般使用 65537 - 0x010001) |
3. 加密
RSA 加密是對明文的 E 次方後除以 N 後求餘數的過程,有了 E和 N 就可以完成 RSA 加密,E、N 是 RSA 加密的密鑰,即 E 和 N 的組合爲公鑰。
4. 解密
對密文進行 D 次方後除以 N 的餘數就是明文,即 RSA 解密過程。D和 N 就能進行解密,D 和 N 的組合爲私鑰。
5. 歐拉函數與模反元素
5.1 歐拉函數
任意給定正整數 n,計算在小於等於 n 的正整數之中,有多少個與 n 構成互質關係?計算這個值的方法就叫做歐拉函數,以 φ(n) 表示。
若一個數 n 可以分解爲兩個質數 p 和 q 的乘積,則有:
eg:在1~8 中,與 8 構成互質數的有:1、3、5、7,即 φ(8) = 4。
5.2 模反元素
6. 計算過程
6.1 N 值
假設 p =61,q = 53; n = 3233。
兩個比較大質數 p,q 的乘積爲 N。
6.2 φ(n) 值
根據 φ(n) = (p-1) * (q-1) 代入計算n的歐拉函數值。
φ(3233) = (61-1) × (53-1) = 60 × 52 = 3120
6.3 e 值
在 1 < e < φ(n) 之間,隨機選擇一個整數 e,且 e 與 φ(n) 互質,選擇 e = 17。
6.4 e 對於 φ(n) 的模反元素 d
因爲 e 與 φ(n) 互質,根據求模反元素的公式計算 e,對於 e 的模反元素 d 有:
ed ≡ 1 (mod φ(n)) 等價於 (ed - 1) / φ(n) = k(k爲任意正整數)
ed - kφ(n) = 1
代入數據得:
17d - 3120k = 1 對這個不定方程求解(擴展歐幾里得算法)得:
其中一組解爲:(d, k)=(2753, 15)
至此,我們就得到了 RSA 的三個參量,即 n = 3233,e = 17,d = 2753。所以公鑰爲(3233,17);私鑰爲(3233,2753)。而我們所說的 RSA1024,2048 就是指密鑰對的長度(n的長度)。本例,長度就是 3233 = 1100 1010 0001,即爲 12 位。
6.5 加解密過程
(1)明文 m = 65;
(2)公鑰 (n, e) = (3233, 17)
(3)加密 c = (m^e mod n) = ( (65 ^17) mod 3233) = 2790
(4)私鑰 (n, d) = (3233, 2753)
(5)解密 m = (c^d mod n) = ((2790 ^2753) mod 3233) = 65
由上述過程可知,只要私鑰不泄露,密文正常渠道是無法破解的,祕鑰長度越長,破解的難度越大。