Mac
任何 MAC 都可以用作 KDF 嗎?
首先,讓我澄清一下密鑰派生函式 (KDF) 的含義。我對採用 $ n $ -位對稱主密鑰和一些任意長度的多樣化數據作為輸入並產生一個 $ n $ - 位對稱密鑰作為可用於後續加密操作的輸出。
在我看來,這樣的 KDF 與 MAC 有很多共同之處:
- 一個鍵和數據作為輸入和一個與輸入鍵長度相同的輸出;
- 對於無權訪問輸入密鑰的攻擊者,輸出應該是不可偽造的;
- 對於不相等的輸入產生相等輸出的機率應該可以忽略不計。
因此我的問題是:使用任何安全的 MAC 算法作為 KDF 是否安全?
不會。MAC 保證不可偽造性,但不保證偽隨機性。的確,我現在能想到的所有 MAC 都是基本的偽隨機函式,但這並不意味著 MAC 定義就暗示了這一點。事實上,它顯然沒有。
因此,從概念上講,您需要一個偽隨機函式。您可以假設 HMAC 是一個偽隨機函式。事實證明,無前綴輸入上的 CBC-MAC 表現得像一個偽隨機函式。但這並不意味著總是如此。
就像 Yehuda Lindell 已經寫的那樣,MAC 並不意味著 PRF,這幾乎就是您想要從 KDF 中得到的。
此外,您的一些假設不正確:
- 一個鍵和數據作為輸入和一個與輸入鍵長度相同的輸出;
MAC 經常不是這種情況。例如,當您使用任何基於 AES-256 的 MAC(如 CMAC、GMAC、Poly1305-AES)時,您最多可能有一個 128 位的身份驗證標籤。並且經常使用更短的標籤,例如將 MAC 截斷為所需的長度。
(KDF 通常允許更大的輸出,因此它們可以用於派生多個密鑰。)
- 對於無權訪問輸入密鑰的攻擊者,輸出應該是不可偽造的;
這是真實的。
- 對於不相等的輸入產生相等輸出的機率應該可以忽略不計。
這再次不是必需的,實際上通常不是這種情況——短 MAC 具有不可忽略的衝突機會。相反,輸出應該是“不相關的”,即看到一些輸出不能幫助偽造其他輸出。
在實踐中,許多 MAC 是(被認為是)PRF。例如 HMAC、CMAC、SipHash 等。大多數基於通用散列 + PRF 的 MAC 也是 PRF。因此,只要 MAC 輸出足夠大,您可能會沒事,但您應該檢查您正在使用的特定 MAC。