Implementation

初始化八個工作變數 SHA256

  • December 5, 2014

我對 FIPS 對 SHA256 的解釋有點困惑

a, b, c, d, e, f, g, h

被初始化為(這是我不明白的)

  1. 初始化八個工作變數, $ 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 $

$ \ \ \ \ } $

我看到的中間值是用變數計算的,而不是相反。

  1. 計算 $ 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 個素數的平方根)。您不再使用這些初始值。

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