1. 程式人生 > >OpenVPN解密(二)

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_MD5P_SHA1分別為MD5SHA1雜湊演算法):

PRF(secret, label, seed) = P_MD5 (S1, label + seed)P_SHA1(S2, label + seed)

真正祕密通道使用的工作金鑰為key_block104bit

key_block=PRF(SecurityParameters.master_secret,"key expansion",  SecurityParameters.server_random+SecurityParameters.client_random);

雙方使用兩組密碼,一組用於客戶端加密

client_write_key、另外一組用於服務端加密server_write_key

          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加密引數的時候要注意很重要的一點,相信很多人都會忽視犯錯:

  1. SSL是否採用CBC加密模式,那麼在解密openvpn引數的時候,記住最後兩次摘要必須更新加密向量