目錄
- https通信抓包
- 消息驗證
- RAS算法
- RAS數字簽名驗證
1. https通信抓包
使用如下命令,我們可以抓去https的通信數據包:
curl --key ssl/private_keys/privatekey.pem --cacert ssl/certs/ca.pem --cert
ssl/certs/publickkey.pem -v https://www.example.com
通過上圖,我們可以看到https的通信過程:
圖中包含了客戶端的證書驗證。
2. 消息驗證
下面內容參考此網絡
step1: “客戶”向服務端發送一個通信請求
“客戶”->“服務器”:你好
step2: “服務器”向客戶發送自己的數字證書。證書中有一個公鑰用來加密信息,私鑰由“服務器”持有
“服務器”->“客戶”:你好,我是服務器,這里是我的數字證書
step3: “客戶”收到“服務器”的證書后,它會去驗證這個數字證書到底是不是“服務器”的,數字證書有沒有什么問題,數字證書如果檢查沒有問題,就說明數字證書中的公鑰確實是“服務器”的。
檢查數字證書后,“客戶”會發送一個隨機的字符串給“服務器”用私鑰去加密,服務器把加密的結果返回給“客戶”,“客戶”用公鑰解密這個返回結果,如果解密結果與之前生成的隨機字符串一致,那說明對方確實是私鑰的持有者,或者說對方確實是“服務器”。
“客戶”->“服務器”:向我證明你就是服務器,這是一個隨機字符串 //前面的例子中為了方便解釋,用的是“你好”等內容,實際情況下一般是隨機生成的一個字符串。
“服務器”->“客戶”:{一個隨機字符串}[私鑰|RSA]
step4: 驗證“服務器”的身份后,“客戶”生成一個對稱加密算法和密鑰,用于后面的通信的加密和解密。這個對稱加密算法和密鑰,“客戶”會用公鑰加密后發送給“服務器”,別人截獲了也沒用,因為只有“服務器”手中有可以解密的私鑰。這樣,后面“服務器”和“客戶”就都可以用對稱加密算法來加密和解密通信內容了。
“服務器”->“客戶”:{OK,已經收到你發來的對稱加密算法和密鑰!有什么可以幫到你的?}[密鑰|對稱加密算法]
“客戶”->“服務器”:{我的帳號是aaa,密碼是123,把我的余額的信息發給我看看}[密鑰|對稱加密算法]
“服務器”->“客戶”:{你好,你的余額是100元}[密鑰|對稱加密算法]
…… //繼續其它的通信
3. RAS算法
參考RSA算法
step1: 選擇兩個質數 p 和 q
step2: 計算modulus
n = p x q
step3:
Φ = (p-1)(q-1)
step4: 選擇一個質數作為公鑰系數 e, 1 < e < Φ
gcd(e, Φ) = 1, //即 e, Φ互質
step5: 從下面公式可計算出私鑰系數 d, 1 < d < Φ
d x e = 1 (mod Φ)
if d > Φ:
d = d mod Φ
if d < 0:
d = d + Φ
step6: 加密數據如 P
C = Pe (mod n)
step7: 解密數據
P = Cd (mod n)
其中公鑰保存系數(n, e), 私鑰保存系數(n, d, p, q)
Example:
step1: 選擇兩個質數
p = 7
q = 11
step2: 計算乘積
n = p x q = 7 x 11 = 77
n = 77
step3:
Φ = (p-1)(q-1) = (7-1)(11-1) = 60
Φ = 60
step4: 公鑰系數 e = 13
step5: 私鑰系數 d = 37
d x e = 1 (mod Φ)
d x 13 = 1 (mod 60)
可計算的出d值為 37
step6: 假設加密數據 P=5
C = Pe (mod n)
C = 513 (mod 77) = 26
step7: 解密數據
P = Cd (mod n)
P = 2637 (mod 77) = 5
4. RAS數字簽名驗證
參考RSA算法
step1: 服務端數字簽名,假設 m為將發送消息的MD5值
s = md (mod n)
step2: 客戶端驗證
m' = se (mod n)
if m' = m, then return 'True',
if m' ≠ m, then return 'False'