Hash

用於短輸入的快速加密雜湊函式

  • October 20, 2020

我正在尋找一種針對短輸​​入速度優化的加密雜湊函式,以實現擴展因子為 2 的偽隨機生成器(例如,輸入 16 個字節並輸出 32 個偽隨機字節)。

以下是我嘗試過的一些自然候選人:

  • SHA256:良好的基線
  • Blake2:專為大輸入的速度而設計,在短輸入時表現不佳
  • AES-CTR:當硬體支持AES-NI時,比 SHA256 更快。輸入用作 AES 的密鑰,以加密具有所需輸出長度的預定義字節數組。但是,為每次呼叫散列函式重新初始化密碼是昂貴的。

我還發現了這個有趣的結構:STHash。它是一個鍵控加密散列函式,針對輸入的速度進行了優化。我不介意使用鍵控散列函式而不是通用散列函式。

是否有任何類似的輸入結構,或者比 AES-CTR 更有效地利用 AES-NI 的方法?

一些非正式的基準

對於每個散列函式,我將一個 16 字節的數組散列成一個 32 字節的數組,並重複 1000 萬次。對於像 AES 和 ChaCha 這樣的流密碼,我在每次迭代時創建一個新密碼,輸入作為公共固定明文和隨機數的密鑰。如果密碼需要 32 位密鑰,我只需用 0 填充輸入。如果散列函式沒有產生足夠的位(例如 SipHash 僅輸出 128 位),我會執行它幾次。

我在 Intel® Core™ i7-1065G7 CPU @ 1.30GHz × 8 上執行 Rust Nightly,實驗在單執行緒上執行。

  • SipHash 1-3:476.9ms
  • 恰恰8:590.4ms
  • SIPHash:670.3ms
  • AES-128:665.3 毫秒
  • SHA256:780.4 毫秒
  • Blake2s:1413.9ms

有關資訊,有關 Haraka 的一些結果(使用不知名的優化實現):

  • Haraka-v2 256-5:55.2ms
  • Haraka-v2 256-6:69.9 毫秒

您可以使用HighwayHash。它是一種基於 SIMD 的快速鍵控散列函式(比SipHash快 5 倍),具有安全聲明,適用於散列短輸入。

在此處輸入圖像描述

您嘗試過 SipHash,尤其是縮減輪次的 SipHash-1-3 嗎?

它專為短輸入而設計,不需要密鑰擴展,在幾乎所有類型的架構上都很快,並且可以輸出 64 位或 128 位。

不過,這個名稱可能會讓人感到困惑:需要一個密鑰,但既然您提到這對您的案例來說不是問題,請試一試。

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