初始化八個工作變數 SHA256
我對 FIPS 對 SHA256 的解釋有點困惑
a, b, c, d, e, f, g, h
被初始化為(這是我不明白的)
- 初始化八個工作變數, $ a,b,c,d,e,f,g, $ 和 $ h $ , 與 $ (i-1)^{st} $ 雜湊值:
$ \ \ \ \ a = H_0^{(i-1)} $
$ \ \ \ \ b = H_1^{(i-1)} $
$ \ \ \ \ c = H_2^{(i-1)} $
$ \ \ \ \ d = H_3^{(i-1)} $
$ \ \ \ \ e = H_4^{(i-1)} $
$ \ \ \ \ f = H_5^{(i-1)} $
$ \ \ \ \ g = H_6^{(i-1)} $
$ \ \ \ \ h = H_7^{(i-1)} $
因此,在迭代的第 1 階段,變數
a, b, c, d, e, f, g, h
將具有(預定義)H 的初始值。但是在這些變數的計算階段,沒有使用下一階段的中間雜湊值 H。
3 . $ For\ t=0\ to\ 63: $
$ \ \ \ \ { $
$ \ \ \ \ \ \ \ \ T_1=h+\sum_1^{{256}}(e)+Ch(e,f,g)+K_t^{{256}}+W_t $
$ \ \ \ \ \ \ \ \ T_2=\sum_0^{{256}}(a)+Maj(a,b,c) $
$ \ \ \ \ \ \ \ \ h=g $
$ \ \ \ \ \ \ \ \ g=f $
$ \ \ \ \ \ \ \ \ f=e $
$ \ \ \ \ \ \ \ \ e=d+T_1 $
$ \ \ \ \ \ \ \ \ d=c $
$ \ \ \ \ \ \ \ \ c=b $
$ \ \ \ \ \ \ \ \ b=a $
$ \ \ \ \ \ \ \ \ a=T_1+T_2 $
$ \ \ \ \ } $
我看到的中間值是用變數計算的,而不是相反。
- 計算 $ i^{th} $ 中間雜湊值 $ H^{(i)} $ :
$ \ \ \ \ H_0^{(i)}=a+H_0^{(i-1)} $
$ \ \ \ \ H_1^{(i)}=b+H_1^{(i-1)} $
$ \ \ \ \ H_2^{(i)}=c+H_2^{(i-1)} $
$ \ \ \ \ H_3^{(i)}=d+H_3^{(i-1)} $
$ \ \ \ \ H_4^{(i)}=e+H_4^{(i-1)} $
$ \ \ \ \ H_5^{(i)}=f+H_5^{(i-1)} $
$ \ \ \ \ H_6^{(i)}=g+H_6^{(i-1)} $
$ \ \ \ \ H_7^{(i)}=h+H_7^{(i-1)} $
您能否向我解釋一下 2. 階段(初始化)如何適合 SHA256 的迭代過程。
變數在壓縮函式主循環的每一輪
a, b, c, d, e, f, g, h
中分配,但中間雜湊值僅考慮每個消息塊(即在所有輪次完成後)我發現Wikipedia 虛擬碼比您問題中的描述更容易理解,並且很清楚變數與臨時雜湊值的關係。請注意您的參考與以前的雜湊組件相關的位置 $ H_0^{(i)}=a+H_0^{(i-1)} $ 虛擬碼只是分配
h0 = a + h0
,因為不需要保留以前的雜湊值,只需要在處理每個塊後更新的目前雜湊值。就在計算每個塊的輪數之前,目前
H
數組和a, b, c, d, e, f, g, h
保存相同的數據。這在計算回合期間會發生變化,您需要保留 的值,H
以便可以在塊的末尾將其添加回。在開始第一個消息塊時,在任何處理輪之前,
H
並a, b, c, d, e, f, g, h
保持“H 的初始值”(基於前 8 個素數的平方根)。您不再使用這些初始值。