Tls

TLS 密鑰塊計算 - 什麼是 PRF?

  • July 16, 2019

在TLS 1.2的 RFC 的第 6.3 節中,寫到 key_block 來自以下公式:

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

執行任意數量的“key_block”公式,直到存在足夠的密鑰材料來填充以下六個會話密鑰的密鑰:

 client_write_MAC_key[SecurityParameters.mac_key_length]
 server_write_MAC_key[SecurityParameters.mac_key_length]
 client_write_key[SecurityParameters.enc_key_length]
 server_write_key[SecurityParameters.enc_key_length]
 client_write_IV[SecurityParameters.fixed_iv_length]
 server_write_IV[SecurityParameters.fixed_iv_length]

除非我遺漏了什麼,因為輸入 Key_block 計算的值是相同的並且不會改變,所以每次計算的結果都是完全相同的字元串。鑑於此,當我們可以重複填充六個會話密鑰所需的相同字元串時,為什麼 RFC 會指示重新計算 PRF?

寫完之後,我意識到我正在使用 PRF 來有效地表示“以下值的雜湊”。如果我誤解了 PRF,那麼可能更合適的問題是:

通過關鍵塊計算的每次迭代是否會根據 PRF 的性質產生不同的結果?

如果是這樣,協商的另一端如何獲得相同的會話密鑰?

是的,您誤解了 PRF。

它不僅僅是一個雜湊函式(當你到達函式的末尾時,從頭開始)。

相反,它是一個生成相當長(實際上是無限)輸出的函式;我們使用第一個 $ N $ 該輸出的位以填充各種鍵值。

參見 RFC5246 的第 5 節;我們有:

TLS 的 PRF 是通過將 P_hash 應用於秘密來創建的:

 PRF(secret, label, seed) = P_<hash>(secret, label + seed)

在哪裡

P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
                        HMAC_hash(secret, A(2) + seed) +
                        HMAC_hash(secret, A(3) + seed) + ...

A() 定義為:

 A(0) = seed
 A(i) = HMAC_hash(secret, A(i-1))

如您所見,直到您在內部 A 函式中遇到循環(這在一段時間內不太可能發生),PRF 輸出不會重複自身。

而且,要回答您的問題“雙方是否計算相同的值”,答案是“此過程會產生一個長輸出,但具有確定性;雙方確實會生成相同的 PRF 輸出”

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