Hash

為什麼 SHA-3 是 Sponge 函式?

  • March 31, 2018

海綿函式應該能夠生成任意長度的輸出。然而,SHA3(Bouncycastle)限制我選擇 224、256、384 和 512 之間的輸出長度。顯然,這些不是任意長度。那麼 SHA3 是如何成為海綿函式的呢?

是否有使用充氣城堡實現生成“任意長度”的特定方法?

這是我的程式碼:

    SHA3.DigestSHA3 digestSHA3 = new SHA3.DigestSHA3(320);
    byte[] digest = digestSHA3.digest(bip39Seed);

我錯過了什麼?

我未受過教育的猜測是 Keccak 的標準化版本與送出給 NIST 的原始版本不同。如果是這種情況,我怎樣才能獲得允許我指定任意長度的版本?

… SHA3 (Bouncycastle) 限制了我…

Bouncycastle 提供 NIST 批准、固定和標準化的 keccak 海綿功能輸出長度。

看,在談論 SHA-3 時,您是在談論那些 NIST 標準。這是建立在建議和接受的 keccak 海綿功能的基礎上的。

NIST 將 SHA-3 標準化為這些長度(類似於 Bouncycastle 覆蓋的庫)以完美匹配 SHA-2 輸出標準,因此 SHA-3 可以用作 SHA-2 的直接替代品(讓我們只是說)有一天“下降”。

然而……僅僅因為 NIST 創建/修復了這些標準輸出長度,並不意味著底層的海綿函式不能用於創建其他輸出長度。

最後,您唯一缺少的是許多程式庫(包括 Bouncycastle)專注於提供符合標準的功能,而不是自定義功能。

……有沒有一種特定的方法可以使用充氣城堡實現來生成“任意長度”……

嗯,是的,如果您查看 BC 輕量級 API,您會發現使用 SHAKE128 和 SHAKE256 的選項——正是這樣做的。(提示:SHAKEDigest

如果您認為 SHAKE128/256 功能不符合您的需求(它們實際上應該),那就是程式的用武之地。如果您想要一些特別的東西(閱讀:非標準),您必須抓住核心海綿功能和創建自己認為需要的相應功能。像 Bouncycastle 這樣的庫在這裡幾乎沒有多大用處。

但這並不是說網路上沒有項目和原始碼片段已經提供了您正在尋找的東西。只需使用您最喜歡的搜尋引擎為您認為適合併滿足您需求的任何程式語言找到它們。

… Keccak 的標準化版本與送出給 NIST 的原始版本不同…

是的,關於 SHA-3 和 Keccak 的不同,您也是正確的。它們都是海綿函式……但 SHA-3 是基於 Keccak 建構的,並由 NIST 引入了一個小調整。SHA-3 和 Keccak 的海綿功能中的這種微小差異使它們在相同的輸出長度下產生不同的輸出。

實際上,兩者都被認為是加密安全的。因此,當想要任意長度的輸出時,您必須決定要使用什麼海綿函式。看看 Gimli,我想指出還有其他適用於加密目的的海綿函式。根據您的具體需求或期望,您有多種選擇。

SHA-3 是 Keccak 系列的子集,它為所有有效的參數組合定義了不同的雜湊函式 $ d $ (輸出大小), $ r $ (率),和 $ c $ (容量)。

SHA-3 僅定義了這六個不同的雜湊函式和子系列:

  • SHA3​​-224 套 $ d = 224 $ , $ r = 1152 $ , 和 $ c = 448 $ .
  • SHA3​​-256 套 $ d = 256 $ , $ r = 1088 $ , 和 $ c = 512 $ .
  • SHA3​​-384 套 $ d = 384 $ , $ r = 832 $ , 和 $ c = 768 $ .
  • SHA3​​-512套 $ d = 512 $ , $ r = 576 $ , 和 $ c = 1024 $ .
  • SHAKE128套 $ r = 1344 $ 和 $ c = 256 $ ; $ d $ 保持可變。
  • SHAKE256套 $ r = 1088 $ 和 $ c = 512 $ ; $ d $ 保持可變。

我對 Bouncycastle 不熟悉,但根據他們的發行說明,SHAKE128 和 SHAKE256 是在 2.7.3 版本中使用 SHA3 實現的。您可以(並且應該)將它們用於任意長度的輸出。

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