更改 SHA-512 的初始雜湊值/噸噸t
Fips 180-4在 5.3.6 下定義瞭如何計算 SHA512 的初始雜湊值/ $ t $ 對於給定的值 $ t $ .
有人可以解釋一下 t 實際上是如何影響程序的結果的(據我所知,它只是計算八個 64 位字 XOR 與
a5a5a5a5a5a5a5a5
)?此外,我不明白如何將新計算的初始雜湊值傳遞給雜湊函式,而不是 SHA-512 的預設值。有人可以解釋如何使用
java.security.MessageDigest
類(或其他東西)在 Java 中做到這一點嗎?
有人可以解釋一下 t 實際上是如何影響程序的結果的(據我所知,它只是用“a5a5a5a5a5a5a5a5”計算八個 64 位字異或)?
那是不對的。
十六進制
5
和A
編碼都設置了 4 位中的兩位;a5
轉換為1010 0101
位。即一半的位被翻轉。這種異或值經常被使用(參見例如 HMAC)。XOR 計算只是在 ASCII 值上為 SHA-512 計算創建內部
"SHA-512/<t>"
IV,其中 T 是用普通數字表示的數字。不可能使用 SHA-512 的黑盒實現,因為它不允許更改內部 IV。之後的 SHA-512/t 計算也是如此。如何使用帶有特殊 IV 的 SHA-512 雜湊的結果可以在所引用文件的第 6.4 節中看到。基本上首先用 XOR 值初始化 SHA-512’。現在計算 的結果
SHA-512'("SHA-512/<t\>")
。這又被用作 SHA-512/t 的初始值。請注意,
SHA-512'("SHA-512/<t>")
對於給定的 t,結果仍然是靜態的。SHA-512/224 和 SHA-512/256 的內部 IV 值實際上在 5.3.6.1 和 5.3.6.1 部分的文件中給出。SHA-384 使用另外定義的 IV,參見第 5.3.4 節。此外,我不明白如何將新計算的初始雜湊值傳遞給雜湊函式,而不是 SHA512 的預設值。有人可以解釋如何使用
java.security.MessageDigest
類(或其他東西)在java中做到這一點嗎?這是不可能的,因為 IV(初始 $ H^0_x $ 值)對於 SHA-512 是固定的。需要改用實現的程式碼。原則上,您可以使用 GPL 的 OpenJDK 原始碼,但由於 Oracle 的滑稽動作,這可能會給您帶來麻煩。
幸運的是,Bouncy Castle 已經實現了
org.bouncycastle.crypto.digests.SHA512tDigest
. 我不會將該類的實現——尤其是方法的實現tIvGenerate
——作為良好編碼實踐的主要例子,但它確實實現了上述方案。