整理TLS(SSL)協議關鍵步驟(下)

接着上一篇,在通信雙方建立連接時,完成密鑰協商,協商出預備主密鑰,預備主密鑰通過密碼衍生算法算出主密鑰,主密鑰也叫做密碼套件,從密碼套件中再轉換出各個密鑰塊,這些密鑰塊就是各種算法,如對稱加密的密鑰,消息驗證碼的密鑰等。好了,在建立連接階段完成協商密鑰和決定密碼套件後,接下來到了通信數據加密部分,對稱加密和公開密鑰。

 

對稱加密

對稱加密就是使用一個密鑰和一個算法,將明文信息加密成密文,對稱加密算法是可逆的,分爲流密碼和塊密碼兩種,下面大致總結一下這兩種加密方式。

流密碼

一次性密碼本

流密碼的原理就是一次性密碼本,一次性密碼本的加密解密過程使用“異或”運算,使用與明文長度一致的序列進行異或運算,加密出密文,密文使用相同的序列也進行異或運算,解出明文,舉個例子:

00100110 11110110 11110110 11100110

使用的加密密鑰是:

10011110 10100110 11010110 11001110

那麼明文與密鑰進行加密異或運算,得到的密文就是:

10111000 01010000 00100000 00101000

之後密文通過同樣的密鑰進行異或運算,即可解密出明文:

10111000 01010000 00100000 00101000

10011110 10100110 11010110 11001110

00100110 11110110 11110110 11100110

爲了保證安全性,每次加密使用的序列都必須不同。流密碼算法就是以一次性密碼本爲雛形實現的加密算法,也是使用異或運算,內部使用隨機數生成器每次生成不同的密鑰,保證每次加密解密得到的明文密文不同,以此保證安全性,也就是說,密鑰是一次性的。流密碼算法的優點在於速度快,可以並行處理連續的序列。

塊密碼

流密碼是對連續的序列進行處理,塊密碼則是把明文序列分割成一塊一塊數據塊,依次對每個數據塊進行加密解密,最終把所有數據塊合併在一起,得到完整的密文或者明文。數據塊的長度稱爲分組長度,如果在切割數據塊的時候,最後不能等分每一塊數據塊,則要對數據塊進行填充處理,以便讓數據塊分組長度和密鑰長度達到一致。塊密碼算法有不同的迭代方式,你可能會想,爲什麼要迭代?使用相同的密鑰對每一個數據塊進行加密操作不就可以了嗎?迭代是爲了安全性問題,來看看他們的迭代方式。

ECB電碼本

ECB電碼本方式就是單純對每一個數據塊使用相同的密鑰進行加密,最後依次把所有密文數據塊組合在一起,得到完整密文。

如圖所示,ECB電碼本方式每一個數據塊都使用相同的密鑰進行加密解密,每個數據塊之間都是互相獨立沒有聯繫的,因此操作過程也可以並行處理,這是優點,但是ECB電碼本方式有一個致命的缺點,就是安全性問題,由於使用相同的密鑰對多個數據分組進行加,假設明文序列中出現多個字符‘a’,即使它們出現在不同的分組中,被加密出來的密文是一致的,別人很容易從中觀察出有多個相同的密文,得知是使用的ECB電碼本方式加密。

CBC密文分組連接模式

CBC密文分組連接方式解決了EBC電碼本方式的安全問題,讓多個分組數據塊之間建立起某種聯繫,它是怎麼做的?來看下加密過程:

  1. 第一步同樣將明文序列等分成多塊數據塊,最後長度不足的進行填充。
  2. 首先處理第一塊數據塊,使用隨機數生成器生成一個IV向量,將它和第一塊數據塊進行異或運算,得到的序列再和密鑰進行加密運算得到第一塊密文數據塊。
  3. 然後處理第二塊,對第二塊明文數據塊,首先和前一塊密文數據塊(也就是第一塊)進行異或運算,然後再和密鑰進行加密運算,得到第二塊密文數據塊。
  4. 接下來的操作一樣,第n塊明文數據塊首先和第n-1塊密文數據塊進行異或運算,然後再和密鑰進行運算得到第n塊密文。
  5. 最後,將所有的密文數據塊依次整合到一起,得到完整的密文。

從上面的步驟可以看到,CBC密文分組連接模式,在每一塊加密數據塊之間建立了聯繫,第n塊數據塊加密時用到的初始化向量就是第n-1塊的密文數據塊,第一塊數據塊的初始化向量IV每一次都不同。由於每塊分組數據塊之間有聯繫,在對第n塊數據塊進行加密前,必須得到第n-1塊密文數據塊,第n塊數據塊加密未完成,無法對第n+1塊數據塊進行加密操作,所以無法進行並行處理,速度較ECB電碼本方式要慢,不過,加密算法重視的還是安全性問題。

CTR計數器模式

CTR計數器模式較複雜,它對每個數據塊都使用不同的密鑰進行加密,但是每個分組數據塊使用的密鑰之間是有聯繫的。最簡單的例子就是密鑰流之間是遞增的方式。

  1. 首先將明文等分成多個分組數據塊,然後生成所有的密鑰流,假設有n個數據塊,就生成n個密鑰流。
  2. 第一個密鑰流生成完成後,加1得到第二個密鑰流,第二個密鑰流加1得到第三個密鑰流,依次得到所有的密鑰流。
  3. 然後開始對每一塊明文數據塊進行加密處理,加密使用密鑰加密鑰流一起運算,得到的摘要值再和明文進行異或運算得到密文。

 

消息驗證碼MAC

密鑰協商,數據加密完後,到了消息驗證。既然對數據進行了加密,能夠保證信息安全不泄露,爲什麼還要消息驗證呢?消息驗證的作用是確認消息是完整的原始消息,中途沒有被篡改過。拿對稱加密舉例,如果不進行消息驗證,會出現什麼問題?對稱加密通常情況下使用通信雙方共同一個密鑰一個算法完成加密解密,任意一方只要接收到消息後,解密出可讀的,意義明確的明文,就會認爲這是發送方發來的原始信息。但是如果密鑰泄露了,中間方截獲了密文,使用密鑰解密後篡改明文,再進行加密,發送到接收方手中,一樣可以解出可讀的消息,不會出現符號亂碼,所以出現的問題就是,接收方如何確認自己收到的消息就是發送方發來的原始消息呢?

使用消息驗證碼進行消息驗證的步驟大致如下:

  1. 通信雙方事先共享同一個密鑰。
  2. 發送方將原始消息使用密鑰進行MAC運算,得到消息的MAC值,將MAC值和原始消息一起發送給接收方。
  3. 接收方接收到消息後,先將消息部分與自己的密鑰進行MAC運算,得到MAC值,再把MAC值與一同發來的MAC值進行比較,如果一致,表示消息沒有被篡改,是原始消息,因爲MAC值是對原始消息進行的MAC運算,只要消息發生一點變化,計算出來的MAC值都會不同。

 

數字簽名-身份驗證

消息驗證碼完成對消息的確認,確認消息是沒有經過篡改的原始消息,最後,來到身份驗證。沒錯,對消息要驗證,對通信雙方的身份也要進行驗證,你可能會想,爲什麼?不是隻有通信雙方纔有通信使用的密鑰嗎?不對,我們的通信不一定都是兩人雙方通信,可能是一組人一羣人的通信,這樣擁有密鑰的人就有很多了,如果通信時不進行身份驗證,會出現什麼樣的問題?

首先是消息篡改,假設A,B,C三人共同擁有通信的密鑰,A向B發送了一條消息,被C截獲了,由於C也有密鑰,C可以解出明文,然後對其進行修改,再加密發送給B,B只要解出意義明確,可讀的消息,就會認爲是A發來的。第二個問題是不可抵賴性問題,同樣是A,B,C三人,C給B發送了消息,但是C可以抵賴說自己沒發送過,原因是A也有共同的密鑰,A也可以發送消息給B。類似的還有,假設C發送了消息給B,但B無法向其他人證明這是C發送的,原因是A也可以使用相同的密鑰和B進行通信,B無法向其他人證明這條消息的發送方。

出現上述問題的原因都是因爲無法確定發送方身份的問題,所以除了消息驗證外,身份驗證也是必要的,進行身份驗證,可以使用數字簽名。身份驗證要做到不可抵賴,關鍵是要找到一個可以唯一標識通信方身份的東西,就像我們每個人的指紋,身份證號碼等,只能唯一標識我們自己,無法抵賴。

拿公開密鑰RSA舉例,密鑰協商完成後,客戶端擁有服務器端發來的公鑰(通信加密用),自己的客戶端私鑰(解密服務器端發來的消息用),服務器端同理,那麼對於通信雙方來說,自己的私鑰就是可以唯一標識自己身份的東西。對於客戶端來說,私鑰只有它自己擁有,在發送信息時,用自己的私鑰對該信息進行“簽名”,發送到服務器端處,由於服務器端有客戶端公鑰,可以解出簽名信息,服務器端也一樣,使用只有自己擁有私鑰進行“簽名”,無法抵賴。

生成簽名:

首先對消息進行Hash運算得出一個摘要值,然後發送方使用自己的私鑰對摘要值進行簽名,得到的簽名值和消息一起發送給接收方。

接收方接收到信息後,首先對簽名值進行運算得出一個簽名值(其使用摘要值好一點),然後對消息進行Hash運算得到摘要值,然後比較這兩個摘要值是否一致,如一致就能確認發送方的身份。

發佈了101 篇原創文章 · 獲贊 73 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章