本文主要介紹RSA的數學原理、以及RSA的代碼演示
引子
密碼學
是指研究信息加密、破解密碼的技術科學。最早可以追溯到追溯到2000年前。而當今的密碼學是以數學為基礎的。
密碼學發展史
在1976年以前,所有的加密方法都是同一種模式:
加密、解密使用同一種算法
。在交互數據的時候,彼此通信的雙方就必須將規則告訴對方,否則沒法解密。那么加密和解密的規則(簡稱密鑰
),它保護就顯得尤其重要。傳遞密鑰就成為了最大的隱患。這種加密方式被成為對稱加密算法
(symmetric encryption algorithm)1976年,兩位美國計算機學家 迪菲(W.Diffie)、赫爾曼( M.Hellman ) 提出了一種嶄新構思,可以在不直接傳遞密鑰的情況下,完成密鑰交換。這被稱為“
迪菲赫爾曼密鑰交換
”算法。開創了密碼學研究的新方向
RSA數學原理
上世紀70年代產生的一種加密算法。其加密方式比較特殊,需要兩個密鑰:公開密鑰簡稱公鑰
(publickey)和私有密鑰簡稱私鑰
(privatekey)。公鑰加密,私鑰解密;私鑰加密,公鑰解密
。這個加密算法被稱為的RSA
離散對數問題
現在想實現這一種 加密容易,但是破解很難
的加密算法,利用數學運算,如mod取模
,有如下方案:
用
質數做模數
,例如17
找一個比17小的數作為n次方的基數,例如
3
找出
基數的n次方 mod 質數 = 固定的數
,求n
3^? mod 17 = 12,此時的`?`是多少呢?(mod -> 求余數,在西方被稱為時鐘算數)
從下方的規律中可以看出,3的1次方~16次方 mod 17 得到的結果都是不同的,且結果分布在 [1,17)上。此時將 3
稱為 17
的原根
所以根據圖中所示,? 可能是13,可能是29等。即從這里可以看出:通過 12 去反推3的?次方是很難的。如果質數加大,反推的難度也會加大。
質數:公約數只有1和自己,其中2是一個特殊質數
歐拉函數φ(讀 fai)
定義
任意給定正整數n,請問在小于等于n的正整數之中,有多少個與n構成互質
關系?計算這個值的方式就叫做歐拉函數
,使用Φ(n)
表示
互質關系
如果兩個正數,除了1
以外,沒有其他公因數
,就稱這兩個數是互質關系(comprime)
歐拉函數特點
1、當
n是質數
時,Φ(n) = n - 1
2、如果n可以分解成兩個互質的整數之積,例如
n = A * B
,則Φ(A * B) = Φ(A) * Φ(B)
所以,根據歐拉函數的以上兩個特點,可以得到如下結論:
- 如果
N
是兩個互質數P1和P2
的乘積
,則Φ(N) = Φ(P1 * P2) = Φ(P1) * Φ(P2) = (P1-1) * (P2-1)
練習
計算
8
的歐拉函數:和8互質的有4個,即Φ(8) = 4(1
,2,3
,4,5
,6,7
,8 - 1-8中有4個數和8互質)計算
7
的歐拉函數:和7互質的有6個,即Φ(7) = 6(1
,2
,3
,4
,5
,6,7 - 1-7中有6個數和7互質)計算
56
的歐拉函數:Φ(56) = Φ(7 * 8) = Φ(7) * Φ(8) = 6 * 4 = 24
歐拉定理
歐拉定理
如果兩個正整數 m 和 n 互質
,那么 m 的Φ(n)次方減去1,可以被n整除。即 (m^Φ(n) - 1) / n ≡ 0
==> m^Φ(n) mod n ≡ 1
費馬小定理(歐拉定理的特殊情況)
如果兩個正整數 m 和 n 互質
,而且 n 為質數
,那么 Φ(n) 結果就是 n-1,即 m^(n-1) mod n = 1
- 例如 m=6,n=5,那么 6^(5-1) mod 5 = 1
公式轉換
前提:m和n互為質數,且n為質數,有公式m^Φ(n) mod n ≡ 1
- 由于
1^k ≡ 1
==>m^k*Φ(n) mod n ≡ 1
推導:將
x = m^Φ(n) mod n
看作一個整體 ==>x^k = m^(Φ(n)*k) mod n
(是一個定理) 成立例如:m=6,n=7,則6^(7-1) mod 7 = 1 ==> 6^(6*2) mod 7 = 1
- 由于
1*m ≡ m
==>m^(k*Φ(n)+1) mod n ≡ m
(成立條件:m 要比 n小
)- 例如:m=6,n=7,則6^(6*3+1) mod 7 = m
模反元素
如果兩個正整數 e 和 x 互質
,那么一定就可以找到整數d
,使得 ed - 1 被x整除
(即 (ed - 1)/x = 1
),那么 d
就是 e 對于 x
的模反元素
-
e * d mod x = 1
- 理解: e * d - 1 = x * k ==> e * d ≡ k*x + 1
-
e * d ≡ k*x + 1 ===> m^(e*d) mod n = m
(條件:d 是相對于 Φ(n) 的模反元素)kx + 1 = kΦ(n)+1 ==> m^(e*d) mod n = m
例如:
- m :4
- n :15
- Φ(n):8
- e:(和Φ(n)互質)3
- d:3d-1=8k ==> d=(8k+1)/3 ==> d=11 19
- 4**(3*11)%5 = 4
- 4**(3*19)%5 = 4
迪菲赫爾曼密鑰交換
如下圖所示,是一個典型的迪菲赫爾曼密鑰交換過程
1、
服務端
先取一個隨機數15
,通過3^15 mod 17 = 6
,將6傳給客戶端(第三方可以竊取這個6)2、
客戶端
通用的取一個隨機數13
,通過3^13 mod 17 = 12
,將12傳給服務器(第三方同樣可以竊取這個12)3、客戶端拿到服務器傳過來的6,通過
6^13 mod 17 = 10
,得到10
4、服務端拿到客戶端傳過來的12,通過
12^15 mod 17 = 10
,得到10所以綜上所述,服務端和客戶端想交換的數字是 10
以下是迪菲赫爾曼密鑰交換
的原理,最終經過兩次計算,客戶端和服務端都會得到一個相同的數字,用于數據的傳輸
客戶端:
3 ^ 15 mod 17 = 6
+6^13 mod 17 = 10
==>3 ^ (15 * 13) mod 17 = 10
服務端:
3 ^ 13 mod 17 = 12
+12^15 mod 17 = 10
==>3 ^ (13 * 15) mod 17 = 10
RSA的誕生
由上面的迪菲赫爾曼密鑰交換原理可知,由以下三個公式
- 1、m^e mod n = C
- 2、C^d mod n = m^(e*d) mod n
- 3、m^(e*d) mod n = m
其中c^d mod n = m
,主要是源于 c^d mod n = m^(e*d)mod n = m
,且d 是 e 相對于 φ(n)的模反元素。需要注意的是:m 和 n 既為互質,也為原根,即m 是n的原根
RSA算法
所以最終RSA算法的加解密公式為:
加密:
m^e mod n = c
解密:
c^d mod n = m
公鑰:n和e
私鑰:n和d
明文:m
密文:c
其中涉及的公鑰、私鑰、密文、明文有如下說明
1、
n
會非常大,長度一般為1024
個二進制位(目前人類已經分解的最大整數,232個十進制位,768個二進制位)-
2、由于需要求出
φ(n)
,所以根據歐拉函數特點,最簡單的求解φ(n)方式:n由兩個質數相乘得到 質數:p1、p2
Φ(n) = (p1 -1) * (p2 - 1)
3、最終由 Φ(n) 得到 e 和 d
所以綜上所述,總共生成6個數字:
p1、p2、n、Φ(n)、e、d
算法演示
m:取值 3 或 12
n:3*5(兩個質數相乘)
- φ(n) = (3-1)*(5-1)= 8
- e:3(e和Φ(n)互質)
- d:3d-1=8k ==> d = 11 / 19(由公式 e * d mod x = 1 求解)
- 加密:`m^e mod n = c` ==> 3^3 mod 8 = 3
- 解密:`c^d mod n = m` ==> 3^11 mod 8 = 3
關于RSA的安全說明
除了公鑰用到了n
和e
,其余的4個數字是不公開的,目前破解RSA得到d的方式如下:
1、要想求出私鑰
d
,由于e*d = φ(n)*k + 1
。要知道e
和φ(n)
2、
e
是知道的,但是要得到 φ(n),必須知道p1 和 p2
。3、由于
n=p1*p2
。只有將n因數分解
才能算出。
RSA算法說明
- RSA效率不高,因為是數學運算,且m不能大于n,大數據不適合用RSA加密,一般用對稱加密(用key)
交換key
時,用RSA加密
大數據傳遞,其中大數據用key(即對稱算法)加密
RSA終端命令
由于Mac系統內置OpenSSL
(開源加密庫),所以在mac的終端可以直接使用OpenSSl玩RSA
,OpenSSL中RSA算法常用命令有3個
命令 | 含義 |
---|---|
genrsa | 生成并輸入一個RSA私鑰 |
rsautl | 使用RSA密鑰進行加密、解密、簽名和驗證等運算 |
rsa | 處理RSA密鑰的格式轉換等問題 |
終端演示
-
1、生成RSA私鑰,密鑰成都為1024bit
- 命令:
openssl genrsa -out private.pem 1024
RSA終端演示-01 - 查看
cat private.pem
文件,其中是base64編碼
RSA終端演示-02
- 命令:
-
2、從私鑰中提取公鑰(即 n和e)
- 命令:
openssl rsa -in private.pem -pubout -out public.pem
RSA終端演示-03 - 查看公鑰:
cat public.pem
RSA終端演示-04
- 命令:
-
3、生成的文件如下
RSA終端演示-05 -
4、將私鑰轉換為明文
- 命令:
openssl rsa -in private.pem -text -out private.txt
RSA終端演示-06
- 命令:
-
5、通過公鑰加密數據,私鑰解密數據
RSA終端演示-07生成明文文件:
vi message.txt
查看文件內容:
cat message.txt
通過公鑰進行加密:
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
-
通過私鑰進行解密:
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
生成的文件如下所示
RSA終端演示-08
-
6、通過私鑰加密數據,公鑰解密數據
通過私鑰進行加密(簽名):
openssl rsautl -sign -in message.txt -inkey private.pem -out enc.txt
通過公鑰進行解密(驗證):
openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec.txt
總結
對稱加密(傳統加密算法):公鑰、私鑰采用同一個
key
-
RSA非對稱加密(現代加密算法):加解密原理來源
迪菲赫爾曼密鑰交換
歐拉函數:如果
N
是兩個互質數P1和P2
的乘積
,則Φ(N) = Φ(P1 * P2) = Φ(P1) * Φ(P2) = (P1-1) * (P2-1)
歐拉定理:如果兩個正整數
m 和 n 互質
,那么 m 的Φ(n)次方減去1,可以被n整除。即(m^Φ(n) - 1) / n ≡ 0
==>m^Φ(n) mod n ≡ 1
費馬小定理:如果兩個正整數
m 和 n 互質
,而且n 為質數
,那么 Φ(n) 結果就是 n-1,即m^(n-1) mod n = 1
-
迪菲赫爾曼密鑰交換原理
m^e mod n = C
C^d mod n = m^(e*d) mod n
m^(e*d) mod n = m
-
RSA算法
RSA原理:拆解兩個(大)質數的乘積很難,所以RSA相對安全
加密:
M ^ e % N = C
解密:
C ^ d % N = M
密文(加密后的):
C
明文(解密后的):
M
公鑰:
N 和 E
私鑰:
N 和 D
-
RSA成立條件(總共有6個數字):
-
N
是由兩個很大的質數(P1、P2)相乘
得到!為了方便求出φ(N)
(其中φ(n) = (p1-1)*(p2-1)
) -
D
是E (一般是65537,0x10001(從終端演示中得出)) 相對于φ(N)
的模反元素
-