由於非對稱加密的速度比較慢,所以它一般用於金鑰交換,雙方通過公鑰演算法協商出乙份金鑰,然後通過對稱加密來通訊,當然,為了保證資料的完整性,在加密前要先經過hmac的處理。
ssl預設只進行server端的認證,客戶端的認證是可選的。以下是其流程圖(摘自tls協議)。
client server
clienthello -------->
serverhello
certificate*
serverkeyexchange*
certificaterequest*
<-------- serverhellodone
certificate*
clientkeyexchange
certificateverify*
[changecipherspec]
finished -------->
[changecipherspec]
<-------- finished
ta簡單的說便是:ssl客戶端(也是tcp的客戶端)在tcp鏈結建立之後,發出乙個clienthello來發起握手,這個訊息裡面包含了自己可實現的演算法列表和其它一些需要的訊息,ssl的伺服器端會回應乙個serverhello,這裡面確定了這次通訊所需要的演算法,然後發過去自己的證書(裡面包含了身份和自己的公鑰)。client在收到這個訊息後會生成乙個秘密訊息,用ssl伺服器的公鑰加密後傳過去,ssl伺服器端用自己的私鑰解密後,會話金鑰協商成功,雙方可以用同乙份會話金鑰來通訊了。
五 金鑰協商的形象化比喻
如果上面的說明不夠清晰,這裡我們用個形象的比喻,我們假設a與b通訊,a是ssl客戶端,b是ssl伺服器端,加密後的訊息放在方括號裡,以突出明文訊息的區別。雙方的處理動作的說明用圓括號()括起。
a:我想和你安全的通話,我這裡的對稱加密演算法有des,rc5,金鑰交換演算法有rsa和dh,摘要演算法有md5和sha。
b:我們用des-rsa-sha這對組合好了。
這是我的證書,裡面有我的名字和公鑰,你拿去驗證一下我的身份(把證書發給a)。
目前沒有別的可說的了。
a:(檢視證書上b的名字是否無誤,並通過手頭早已有的ca的證書驗證了b的證書的真實性,如果其中一項有誤,發出警告並斷開連線,這一步保證了b的公鑰的真實性)
(產生乙份秘密訊息,這份秘密訊息處理後將用作加密金鑰,加密初始化向量和hmac的金鑰。將這份秘密訊息-協議中稱為 per_master_secret-用b的公鑰加密,封裝成稱作clientkeyexchange的訊息。由於用了b的公鑰,保證了第三方無法竊聽)
我生成了乙份秘密訊息,並用你的公鑰加密了,給你(把clientkeyexchange發給b)
注意,下面我就要用加密的辦法給你發訊息了!
(將秘密訊息進行處理,生成加密金鑰,加密初始化向量和hmac的金鑰)
[我說完了]
b:(用自己的私鑰將clientkeyexchange中的秘密訊息解密出來,然後將秘密訊息進行處理,生成加密金鑰,加密初始化向量和hmac的金鑰,這時雙方已經安全的協商出一套加密辦法了)
注意,我也要開始用加密的辦法給你發訊息了!
[我說完了]
a: [我的秘密是...]
b: [其它人不會聽到的...]
六 加密的計算
上一步講了金鑰的協商,但是還沒有闡明是如何利用加密金鑰,加密初始化向量和hmac的金鑰來加密訊息的。
其實其過程不過如此:
1 借助hmac的金鑰,對明文的訊息做安全的摘要處理,然後和明文放到一起。
2 借助加密金鑰,加密初始化向量加密上面的訊息。
金鑰協商的原理
群組金鑰協商 group key agreement 這種方法是基於分布式的思想,它的特點是 1 群組的多個成員一起參與金鑰生成2 群組中的金鑰是由每個成員提供的引數以及金鑰生成演算法共同決定的3 群組中任何成員均不能事先確定金鑰。有幾種流行的的群組金鑰協商及分配方法,包括ckd centraliz...
Diffie Hellman金鑰協商演算法
diffie hellman金鑰協商演算法主要解決秘鑰配送問題,本身並非用來加密用的 該演算法其背後有對應數學理論做支撐,簡單來講就是構造乙個複雜的計算難題,使得對該問題的求解在現實的時間內無法快速有效的求解 computationally infeasible 理解diffie hellman金鑰...
Diffie Hellman金鑰協商演算法原理及實現
實現補充 1 通訊雙方通過協商,共同建立會話金鑰,任何乙個參與者均對結果產生影響,不需要任何第三方參與 2 會話金鑰由每個協議參與者分別產生的引數通過計算得到 1 初始化 a選取乙個生成元g和乙個大素數p,傳送給b 2 a隨機選取0 xx mod p後,將x傳給b 3 b隨機選取0 yy mod p...