Tls
TLS 密鑰塊計算 - 什麼是 PRF?
在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 輸出”