關於密鑰派生函式的問題
我的理解是,KDF 是一個接受主密鑰並生成多個密鑰的函式。只要密鑰是“獨立的”,它就是安全的。如果這是真的,那麼下面的定義會生成一個安全的 KDF,對吧?
假設我們可以訪問一個完全隨機的函式,Math Processing ErrorR:K→K],我們可以定義一個Math Processing ErrorKDF:K→Kn]在輸入[Math Processing Error] $ R: \mathcal{K} \rightarrow \mathcal{K} $ [Math Processing Error] $ KDF : \mathcal{K} \rightarrow \mathcal{K}^n $ [Math Processing Error] $ S \in \mathcal{K} $ 執行以下操作。
$$ K_1 = R(S \oplus 1) $$ $$ K_2 = R(S \oplus 2) $$ [Math Processing Error]$$ \vdots $$ $$ K_n = R(S \oplus n) $$ 輸出 $ (K_1, K_2, …, K_n). $
當然,現在我們不能構造隨機函式,所以我們要做的是替換Math Processing ErrorR]通過一個偽隨機函式,沒有“有效”對手可以將其與隨機函式區分開來。[Math Processing Error] $ R $
問題:
- 這是否意味著更換Math Processing ErrorR]通過,例如[Math Processing Error] $ R $ $ AES(k, \cdot) $ , 在哪裡Math Processing Errork]是固定的也會給一個安全的KDF?做Math Processing Errork]需要謹慎選擇還是有任何價值?將[Math Processing Error] $ k $ [Math Processing Error] $ k $ $ AES(\cdot, m) $ 對於一個固定的Math Processing Errorm]是等價的嗎?[Math Processing Error] $ m $
- 這是否意味著更換Math Processing ErrorR]任何安全散列函式也會提供安全的 KDF?如果是這樣,為什麼一些 KDF 建議使用 HMAC 代替?這是否只是為了獲得更大的“安全餘量”,並且更少依賴於所使用的雜湊函式的安全性?將上面的 XOR 替換為連接(這對於散列函式的情況是可能的,但對於分組密碼的情況是不可能的)會影響安全性嗎?[Math Processing Error] $ R $
- 如果我想實現一個安全的 KDF,並且已經可以訪問 AES、SHA1-512 和 HMAC,我將如何做到它既簡單又安全?
讓我們從一個通用的安全 KDF 構造開始,如下所示。讓 $ F(k,x) \rightarrow {0,1}^n $ 成為一個安全的 PRF。然後選擇Math Processing ErrorL]這樣[Math Processing Error] $ L $ $ L \times n $ 為所有生成的密鑰提供盡可能多的輸出位。讓[Math Processing Error] $ S $ 成為您的原始密鑰/熵。生成以下字元串:
[Math Processing Error] $ KDF(S,N,L) := F(S, C || 0) || F(S, N || 1) || … || F(S, N || L) $
其中 N 是呼叫 KDF 的每個應用程序的唯一值。如果您正在生成[Math Processing Error] $ n $ 位鍵,您只需分配每個鍵[Math Processing Error] $ K_i := F(S, N || i) $ .
這與您的構造相似,但明顯不同。在您的施工中,[Math Processing Error] $ R $ 在所有呼叫中都是固定的,而上面的 PRF 為每個熵輸入選擇不同的隨機函式。實際上,您實際上是在嘗試通過使用來模擬 PRF 的行為[Math Processing Error] $ R $ 和[Math Processing Error] $ S $ 所有輸入的前綴。不過不知道有沒有[Math Processing Error] $ R(S || X) $ 安全 $ PRF(S,X) $ ,我不會假設沒有一些證據。無論如何,我認為我們甚至沒有任何現代算法候選者[Math Processing Error] $ R $ 除了採取 $ PRF(k,x) $ 並固定Math Processing Errork]是一些恆定的。[Math Processing Error] $ k $
建構的優勢之一 $ KDF $ 上面是它對錯誤輸入的抵抗力更強,即即使輸入不正確,它也會提供唯一的鍵。如果不小心將相同的熵提供給多個程序(可能是由於熵失敗),您仍然可以保證在每個程序中生成唯一的密鑰,因為Math Processing ErrorN]價值。在將固定值與計數器組合時,連接比 XOR 更安全。這是因為使用異或,增加固定值並再次呼叫可能會在與計數器異或之後創建相同的值。例如,固定值 0x71Math Processing Error⊕]計數器值 1 產生 70,固定值 0x72 也是如此Math Processing Error⊕]計數器值 2。在這種情況下,您會生成重複的鍵。[Math Processing Error] $ N $ [Math Processing Error] $ \oplus $ [Math Processing Error] $ \oplus $
1) $ AES(k,\cdot) $ 可用作輸出 128 位的 PRF。(這是使用 AES 加密的計數器模式背後的前提。)在這裡,您將使用Math Processing ErrorS]作為你的鑰匙。[Math Processing Error] $ S $
**2)**從概念上講,散列函式有點像隨機函式,但重要的是要理解它們不是。在密碼學理論中,散列與真正的偽隨機函式 (PRF) 沒有相同的約束。例如,理論上安全的散列函式完全有可能洩露有關明文的資訊。在實踐中,我懷疑我們是否想要一個雜湊函式,但是雜湊函式不應被視為隨機函式。相比之下,HMAC 實際上是一個 PRF,並且它是使用散列方便地建構的。但是 HMAC 的構造優於與明文連接的密鑰的普通散列,因為後者俱有非常具體的漏洞,這是由於散列與隨機函式沒有相同的標準這一事實。
**3)**您可以使用 HMAC 創建 KDF:您看過PKDF2嗎?給定 HMAC,實現相當簡單。甚至是更簡單的HKDF,但我會推薦 PBKDF2。我在開始時概述的使用 AES 作為 PRF 的構造也可以工作。