OpenVPN解密(二)
客戶端和服務端在SSL握手的時候交換了3個引數:客戶端隨機數client random、服務端隨機數server random以及客戶端傳送預主金鑰(premaster key)並用服務端公鑰加密的形式傳送。服務端在接收到加密的預主金鑰後,用自身的證書私鑰進行解密,還原出預主金鑰明文。因此,在證書不被洩漏的情況下,只有通訊雙方能夠獲得這三個引數,具有抗中間人的安全性。
雙方獲得3個會話引數後計算主金鑰(Master Key):
master_secret= PRF(pre_master_secret, "master secret",
ClientHello.random +ServerHello.random) [0..47]
PRF為偽隨機數計算方法(P_MD5和P_SHA1分別為MD5和SHA1雜湊演算法):
PRF(secret, label, seed) = P_MD5 (S1, label + seed)⊕P_SHA1(S2, label + seed)
真正祕密通道使用的工作金鑰為key_block,104bit:
key_block=PRF(SecurityParameters.master_secret,"key expansion", SecurityParameters.server_random+SecurityParameters.client_random);
雙方使用兩組密碼,一組用於客戶端加密
client_write_MAC_secret[SecurityParameters.hash_size]
server_write_MAC_secret[SecurityParameters.hash_size]
client_write_key[SecurityParameters.key_material_length]
server_write_key[SecurityParameters.key_material_length]
上述工作金鑰引數通過閱讀openssl原始碼大致可以理解,但是在解密openvpn加密引數的時候要注意很重要的一點,相信很多人都會忽視犯錯:
- SSL是否採用CBC加密模式,那麼在解密openvpn引數的時候,記住最後兩次摘要必須更新加密向量