Hash

Skein 可以用作 H(k || m) 格式的安全 MAC 嗎?

  • May 20, 2018

Skein 可以用作H ( k || m ) 格式的安全 MAC 嗎?

我知道它可以與 HMAC 一起使用,但它可以作為上述格式的一次性 MAC 並抵抗長度擴展攻擊。這個假設正確嗎?

Skein 的一位作者在他們的論文中提到 Skein 有另一個帶有安全證明的MAC 結構,但我找不到它。有誰知道它是如何工作的?

長度擴展攻擊

之所以H(ķ‖米) $ H(k \mathbin| m) $ 大多數舊雜湊的不安全之處在於它們使用了Merkle-Damgård 結構,該結構受到長度擴展的影響。當長度擴展可用時,可以計算H(ķ‖米‖米′) $ H(k \mathbin| m \mathbin| m^\prime) $ 只知道H(ķ‖米) $ H(k \mathbin| m) $ 但不是ķ $ k $ . 這違反了 MAC 的安全要求。

像所有 SHA-3 決賽選手一樣,Skein 不會受到長度擴展的影響,因此這種攻擊不適用。

狀態碰撞攻擊

還有一種基於狀態衝突的潛在攻擊,其中攻擊者搜尋一對消息,這些消息對所有(或至少許多)密鑰發生衝突。這在計算時不適用於 Skein 的順序模式H(ķ‖米) $ H(k \mathbin| m) $ ,因為它在消息之前使用密鑰,因此攻擊者在消息被散列時不知道內部狀態。

這種攻擊在理論上適用於使用H(ķ‖米) $ H(k\mathbin|m) $ 在 Skein 的樹模式中,因為只有第一個節點將具有密鑰相關狀態,並且可以在不知道密鑰的情況下搜尋其他節點中的狀態衝突。這也適用於H(米‖ķ) $ H(m\mathbin|k) $ 在順序模式下。

但由於 Skein 具有 512 位內部狀態,因此通過蠻力成本查找碰撞2256 $ 2^{256} $ 操作,這是荒謬的不可行。

仍然碰撞通常是推進密碼分析的第一個屬性,因此我對這種攻擊根本不適用的 MAC 更有信心,而不僅僅是不可行。

內置MAC模式

Skein 有一個內置的 MAC 模式,其中密鑰作為單獨的參數傳入。它使用密鑰的方式非常類似於H(ķ‖米) $ H(k\mathbin|m) $ 但它並不是簡單地將它們連接起來。

這種模式比簡單的模式有一些優點H(ķ‖米) $ H(k\mathbin|m) $ :

  1. 它乾淨地分離了密鑰和消息的域
  2. 初始狀態取決於樹中所有節點的鍵,而不僅僅是第一個
  3. 密鑰在任何其他參數之前被使用
  4. 作者為這種模式提供了明確的安全證明。
  5. 您可以在使用密鑰後記憶體狀態,從而提高固定密鑰的性能(但會降低一次性密鑰的性能)。您可以通過將密鑰填充到 512 位(塊大小)來實現類似的效果H(ķ‖米) $ H(k\mathbin|m) $ ,但實現不太可能對此提供支持。

屬性 2 和 3 意味著即使您使用 Skein 的某些附加功能,狀態碰撞攻擊也不適用。

不幸的是,並非每個實現都包含鍵控絞線功能。

結論

H(ķ‖米) $ H(k\mathbin|m) $ 與 MAC 一樣安全。但最好在可用的情況下使用內置的 MAC 模式,尤其是在您使用任何高級 Skein 功能(例如樹)時。

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