Implementation

SSL V3 中如何從主密鑰生成密鑰材料

  • August 9, 2013

密鑰材料的生成由下式給出

key_block =
       MD5(master_secret + SHA('A' + master_secret + ServerHello.random +
           ClientHello.random)) +
       MD5(master_secret + SHA('BB' + master_secret + ServerHello.random +
           ClientHello.random)) +
       MD5(master_secret + SHA('CCC' + master_secret + ServerHello.random +
           ClientHello.random)) + [...];

該文件說,它一直到“產生足夠的輸出”為止。我認為“+”是指附加生成的數據。

我們需要:

  • 客戶端寫mac secret
  • 伺服器寫入mac秘密
  • 客戶端寫密鑰
  • 伺服器寫入密鑰
  • 客戶寫 IV
  • 伺服器寫入 IV

那麼這些是通過從生成的雜湊中獲取適當數量的位來生成的?

我不明白為什麼文件說“已經生成**了足夠的輸出”。**無論如何,我們需要主密鑰的 5 個部分。

您可以使用TLS 1.0作為指導:它是 SSL 3.0 的直接繼承者,所以很多東西都非常相似,並且在某些方面 TLS 1.0 更清晰一些。在第 6.3 節中,您將找到密鑰生成過程,其中包含準確的句子:

要生成密鑰材料,請計算

$$ … $$ 直到產生足夠的輸出。那麼key_block的分區如下:

重要的詞是“分區”。

例如,如果您使用 3DES 作為對稱密碼並為 MAC 使用 SHA-1,則“寫入密鑰”每個長 24 字節,IV 每個長 8 字節,MAC 密鑰每個長 20 字節. 所以,總共有 104 個字節。密鑰生成函式在各種元素上反複呼叫 SHA-1 和 MD5;每輪產生 16 個額外字節(即 MD5 的輸出大小)。您需要 104 個字節,因此,您將需要 7 輪。

在第一輪中,您在“A”(值 65 的單個字節)、主密鑰、伺服器隨機數和客戶端隨機數的串聯上呼叫 SHA-1,按該順序(“+”實際上表示串聯)。此 SHA-1 呼叫產生 20 個字節。然後用 MD5 對主密鑰和 SHA-1 輸出的串聯進行雜湊處理,得到 16 個字節。這些是密鑰塊的前 16 個字節。

對於第二輪,處理是相同的,只是您使用 ‘BB’ 而不是 ‘A’(兩個字節,每個值 66)。這將產生密鑰塊的下一個 16 個字節。

你繼續這樣。最終,您可以進行 26 輪(最多 ‘ZZZ…Z’;SSL 3.0 規範沒有定義如何超越)。這將產生總共 2616 = 416 個字節。但如果只需要前 104 個字節,則無需計算整個 26 輪;只需計算足夠的*輪數即可獲得所需的字節數。

一旦你有了你的密鑰塊(104 字節,3DES 和 SHA-1),你就可以將它拆分成所需的密鑰元素。前 20 個字節用於客戶端寫入 MAC 密鑰,接下來的 20 個字節用於伺服器寫入 MAC 密鑰,接下來的 24 個字節用於客戶端寫入密鑰,依此類推。

引用自:https://crypto.stackexchange.com/questions/1142