Hash

SHA3 -255,少一點

  • September 29, 2019

我需要 SHA3-255 或 511。如果我只是截斷標準 SHA3-256 或 512 會怎樣?除了雜湊衝突的機率加倍之外,還有什麼我應該注意的嗎?如果有用的話,我也可以截斷一個字節而不是一個位。

我需要的是能夠在相同的 32 字節或 64 字節中儲存與雜湊不同的東西,因此我需要犧牲一位來標記字節何時表示雜湊或其他內容。

或者我可以說,如果第一個字節,而不是位,是 0xff,那麼剩下的代表別的東西。這應該會降低散列衝突的機率,但是我將有 1/256 的機率以 0xff 開頭的散列,在我的編碼中產生歧義。我可以說,如果 4 個字節是 0xffffffff,那麼我最終可能會生成 1/2^32 的模棱兩可的編碼,但在任何情況下我都希望有一個明確定義的編碼。

有什麼我不知道的眾所周知的方法嗎?

對於所有備受推崇的散列函式,散列的位都具有相同的價值:據任何人所知(除非他們沒有告訴),這些位是不相關的。如果你拿 $ k $ 一點點 $ n $ -bit 雜湊,你得到一個 $ k $ 位散列函式。將 SHA-256 截斷為 255 位會給你一個幾乎和 SHA-256 一樣好的雜湊:它有 $ 2^{255} $ 抗原像攻擊的強度和 $ 2^{127.5} $ 對抗碰撞攻擊的強度。

有使用某些位的雜湊的先例。SHA-224 和 SHA-384 分別通過與 SHA-256 和 SHA-512 基本相同的計算獲得,只是初始值不同(這與算法的強度無關)並且輸出截斷為較小的尺寸。另一個先例是UUID可以由 122 位 MD5 或 SHA-1 雜湊(分別為 128 或 160)建構。

對於 SHA3,有一個更清潔的結構。不要採用 SHA3-256 並切斷一位,而是採用SHAKE256 255 位或 248 位輸出。SHAKE256 與 SHA3-256 完全相同,只是在計算開始附近有兩位,因此它具有相同的安全屬性,但它被明確設計為具有可變長度輸出。您甚至可以使用 SHAKE128 代替 SHAKE256,它的計算成本略低,不會造成重大的安全損失。

截斷散列不太可能存在實際的安全問題,但使用 SHAKE 可以讓您更有信心不會出錯。更好的是,為了避免域衝突(系統的兩個部分出於不同原因計算同一字元串的雜湊),請使用唯一字元串作為自定義字元串計算cSHAKE輸出。

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