Hmac

基於海綿的雜湊的塊大小的正確選擇是什麼?

  • September 10, 2016

在我們的庫中討論 Keccak 的未來時,我們開始討論如何正確地為 Keccak 分配“塊大小”(或更一般地說,任何基於海綿的雜湊,如果可能的話),特別是與 HMAC 一起使用(主要是出於 API 兼容性原因)。

從 Merkle-Damgard 雜湊是選擇的雜湊函式(例如 MD5、SHA-1、SHA-2)和 HMAC 安全證明依賴於將密鑰填充到至少一個完整的塊大小,因此不能從 HMAC 介面消除塊大小要求。

那麼將塊大小分配給 Keccak(或基於海綿的雜湊)的加密標準/推薦做法是什麼?

“塊大小”對 Merkle-Damgård 函式很重要,因為 HMAC 安全證明依賴於該塊大小。對於其他函式,尤其是海綿函式,HMAC 的塊大小主要是一個約定問題。

事實上,HMAC 對函式使用了兩個嵌套呼叫,因為或多或少需要這樣的構造來確保 MD 函式的安全性。這被廣泛認為是 Merkle-Damgård 構造中的一個缺陷。海綿函式應該沒有這個缺陷,所以一個簡單的 $ H(K || M) $ 應該是一個安全的 MAC(假設連接的正確定義以避免歧義)。

那麼為什麼不正式需要HMAC來用海綿函式製作 MAC,它仍然可以使用,並且任何“塊大小”都可以工作,對安全性沒有問題。唯一的限制是塊大小必須大於散列函式輸出大小,因為 HMAC 規定當密鑰長於塊大小時,使用密鑰的散列值代替;如果塊大小小於雜湊輸出,這將不起作用。

對於 Keccak,送出包在第 5.1.1 節中聲明:

使用散列函式的幾個標准假定它具有輸入塊長度和固定輸出長度。海綿函式支持任意長度的輸入並返回任意長度的輸出。在這些情況下使用海綿函式時,必須選擇輸入塊長度和輸出長度。我們區分兩種情況。

  • 對於摘要長度固定的四個 SHA-3 候選,假設輸入塊長度為比特率r,輸出長度為候選 n ∈ {224, 256, 384, 512} 的摘要長度。
  • 對於具有可變長度輸出的實例,必須明確選擇輸出長度n以適應特定標準。由於通常假設輸入塊長度大於或等於輸出長度,因此可以將輸入塊長度取為比特率mr的整數倍,以滿足該約束。

然後,在第 5.1.3 節中:

HMAC

$$ 1, 25 $$完全根據散列函式指定,因此可以使用 Keccak 候選者之一來應用它。它由輸入塊長度和輸出長度參數化,我們建議在上面的 5.1.1 節中選擇。 除了長度擴展攻擊之外,HMAC 的安全性主要來自其內部雜湊的安全性。內部散列是通過在消息前面加上密鑰來獲得的,這提供了一個安全的 MAC。外部散列在內部 MAC 前面加上密鑰(但填充不同),因此再次提供安全 MAC。當然,也可以使用給出的通用 MAC 結構

$$ 6 $$,只需要一次海綿函式的應用。從安全聲明中$$ 12 $$, 使用 HMAC 建構的 PRF 將抵抗需要比原像攻擊少得多的 2 c /2查詢和顯著更少的計算量的區分攻擊。

因此,在 Keccak 的情況下(因此,大概也是 SHA-3),HMAC 的“塊長度”是 $ 1600 - 2x $ , 在哪裡 $ x $ 是雜湊輸出長度,以位為單位(“比特率”和“容量”使得它們的總和為 $ 1600 $ ,容量是雜湊輸出長度的兩倍)。

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