PRF(pseudorandom function,偽隨機函式)是一個使用秘密金鑰回傳 PRF(K, M) 的函式,其輸出看起來是隨機的。由於金鑰是秘密的,輸出值對攻擊者而言不可預測。

與 MAC 不同,PRF 不是設計來單獨使用的,而是作為某個密碼演算法或協定的一部分。

PRF 的用途#

  • 建構區塊密碼:在 Feistel 建構中使用 PRF。
  • 金鑰衍生方案:用 PRF 從主金鑰或密碼產生密碼學金鑰。
  • 識別方案:用 PRF 從隨機挑戰產生回應。(伺服器送出隨機挑戰訊息 M,客戶端回傳 PRF(K, M) 以證明它知道 K。)
  • 4G 電話標準:用 PRF 鑑別 SIM 卡與其服務供應商;類似的 PRF 也用來產生通話期間所用的加密金鑰與 MAC 金鑰。
  • TLS 協定:用 PRF 從主秘密與工作階段專屬的隨機值產生金鑰材料。

連 Python 語言內建、用來比較物件的非密碼學 hash() 函式裡都有一個 PRF。

PRF 的安全性#

一個偽隨機函式要安全,它的輸出就不該有任何能與真隨機值區分開來的樣式

不知道金鑰 K 的攻擊者,不該能把 PRF(K, M) 的輸出與隨機值區分開來。換個角度看:攻擊者不該有任何辦法知道自己面對的是一個 PRF 演算法,還是一個隨機函式。

這個安全概念的學術名稱是與隨機函式的不可區分性(indistinguishability from a random function)。

想深入了解 PRF 的理論基礎,可參考 Goldreich 的《Foundations of Cryptography》第一冊 3.6 節。

為什麼 PRF 比 MAC 更強#

PRF 與 MAC 都是帶金鑰的雜湊,但 PRF 在本質上比 MAC 更強,主要是因為 MAC 的安全要求較弱:

安全條件
MAC標籤無法被偽造(輸出無法被猜中)
PRF輸出與隨機字串不可區分(更強的要求)

若一個 PRF 的輸出無法與隨機字串區分,就意味著它們的值無法被猜中。

換句話說:任何安全的 PRF 也是一個安全的 MAC。

反過來不成立#

一個安全的 MAC 不必然是安全的 PRF。舉例來說,從一個安全的 PRF1 出發建構 PRF2

PRF2(K, M) = PRF1(K, M) ‖ 0
  • 因為 PRF2 的輸出被定義為 PRF1 的輸出後面接一個 0 位元,它看起來就不像真隨機字串——你可以靠最後那個 0 位元把它的輸出區分出來。因此 PRF2 不是安全的 PRF。
  • 然而,由於 PRF1 是安全的,PRF2 仍然構成一個安全的 MAC。為什麼?因為若你能為某個 M 偽造標籤 T = PRF2(K, M),你也就能為 PRF1 偽造標籤——而那是不可能的,因為 PRF1 是安全的 MAC。

因此 PRF2 是一個「安全的 MAC 但不安全的 PRF」的帶金鑰雜湊。

但別擔心:你不會在真實應用中看到這種 MAC 建構。

事實上,許多被部署或標準化的 MAC 同時也是安全的 PRF,並且經常被當成兩者之一使用。例如 TLS 就把 HMAC-SHA-256 同時當作 MAC 與 PRF 使用。