寫下此博客記錄心得體會,如有不足之處請指正
先是手稿筆記 :
正文:
在Https協議中,Client端和Server端需要三個參數才能生成SessionKey來加密信息。
三個參數分別是
Client Random(客戶端隨機數) 假設是C
Server Random(服務端隨機數) 假設是S
PreMaster Random(待加密隨機數) 假設是P
前兩個都是通過明文的方式傳輸,即C從客戶端以明文的方式發送給服務端,S從服務端以明文的發送發送給客戶端
而P則是最重要,也是最關鍵的信息了,默認通過RSA算法對其加密,再傳輸到服務端,服務端再用私鑰對密文進行解密,得到P。
如果被而已的第三方截取了P加密后的密文,是否有P信息泄露的危險呢?
我們知道RSA算法的公鑰是對外公開的。假設公鑰對(e,n),密鑰對(d,n)那么從客戶端發送到服務端關於P的密文 M = P^e mod n
假設密文M被攻擊者攔截,如果要求得明文,必須求得
(log(P)M) mod n = e 的底數P,然而解P是十分復雜的過程,所以攻擊者一般無法獲得P的值。或者說要獲得私鑰的話,
ed = k f(n)[f = 歐拉函數] + 1, 而f(n) = f(p*q) = f(p)*f(q) = (p-1)*(q-1),而對n進行大素數分解的計算過程是十分難的。也不能通過M^d mod n 來獲得P
RAS是相對來說比較安全的算法,但是用算力大的機器暴力破解,也是可以成功的。一般銀行的重要密碼需要30秒左右更換一次。
第二種算法是DH算法,假設DH算法的數對為(p,q)
客戶端選取【1 ~ q - 1】中的一個隨機數RC,通過計算得出一個參數 PC
PC = (p ^ RC) mod q
服務端同樣選取【1 ~ q - 1】中的一個隨機數RS,通過計算得出一個參數 PS
PS = (p ^ RS) mod q
客戶將自己的PC參數交給服務端
服務端將自己的PS參數交給客戶端
服務端計算 PC ^ RS mod q = A
客戶端計算 PS ^ RC mod q = B
實際上A = B,下面來證明一下,
首先 要用到一個定理
((W ^ X) mod Y) ^ Z mod Y = W ^ (X * Z) mod Y
為什么呢,設 U = (W ^ X) mod Y , 那么 U + k*Y = W^X (k為正整數)
即 : U = W^X - k*Y
(W^X - k*Y)^Z 的中間的項和最后一項都含有Y 而只有第一項W^(X*Y)
不含有Y 所以
((W ^ X) mod Y) ^ Z mod Y = W^(X*Z) mod Y
A = PC ^ RS mod q =
((p ^ RC) mod q) ^ RS mod q = p ^ (RC * RS) mod q
B = PS ^ RC mod q =
((p ^ RS) mod q) ^ RC mod q = p ^ (RC * RS) mod q
((p ^ RS) mod q) ^ RC mod q = p ^ (RC * RS) mod q
證明完畢,客戶端和服務端交換參數后計算得到的最終數字A 和 B是相等的,聰明的你應該猜到了, A = B 就是服務端和客戶端需要達成一致的PreMaster隨機數!
可見只要我們知道了 RC * RS 就可以知道PreMaster!
其實兩者交換的參數實際上是帶有他們各自生成的隨機數的信息的,因為,傳輸的參數公式為 ,參數P = (p ^ 各自隨機數) mod q
當 p 和 q是已知的時候,攔截了P的話,要算出各自隨機數,則要算出 (log( p)P) mod q = 各自隨機數,
對數運算復雜,我沒有實際想辦法計算過大數的對數運算,先暫不做解析。
另外就是(p,q)對的選取,
p^x mod q = L (x = 1, 2 , 3, 4 ......)
當L從1開始向上逐一遞增,L的取值不能周期性變化,
假設L以6為周期變化
那么p^1 mod q = p^7 mod q = p^13 mod q = ...
假如我們是攻擊者
假設我們知道了
PC = (p ^ RC) mod q 中 PC的值
PS = (p ^ RS) mod q 中PS的值
因為p^x mod q = L是呈周期性變化的,通過觀察,我們就能輕易找到一個數 O
讓 PS = (p ^ O) mod q
假設周期是6,那么 O 和原來服務端隨機數RS的差值就是6*k(k為整數)
那么我們只要計算
ANS = PC ^ O mod q = p ^ (RC * O) mod q =
p ^ (RC * (RS + 6*k)) mod q = p ^ (RC * RS + 6 *k *RC )) mod q
因為p^x mod q = L是以6為周期變化的,又因為6 *k *RC是6的整數倍,所以p ^ (RC * RS + 6 *k *RC )) mod q = p ^ (RC * RS) mod q = PreMaster
我們盜取PreMaster成功!無需知道 RS 和 RC 的各自具體值, 直接知道他們的乘積就好了
所以(p,q)對的分布要滿足p^x mod q = L,x取【1~ q -1】的時候,L的取值是無序不重復的,這樣才能保證一定的安全性