Hash

為什麼這些特定值用於初始化 SHA-512 中的雜湊緩衝區?

  • November 12, 2012

我正在閱讀William Stallings 撰寫的《 Network Security Essentials 》一書。

要使用 SHA-512 創建消息摘要,我們必須執行一些步驟:

  1. 附加填充位。
  2. 附加長度
  3. 初始化雜湊緩衝區
  4. … 很快。

書中為第 3 步編寫:

512 位緩衝區用於保存散列函式的中間和最終結果。緩衝區可以表示為 8 個 64 位寄存器 (a,b,c,d,e,f,g,h)。這些寄存器初始化為以下 64 位整數(此處為十六進制值):

 a = 6A09E667F3BCC908
 b = BB67AE8584CAA73B
 ...

註冊h

為什麼要使用這些特定的十六進制值,這背後有什麼特別的原因嗎?我知道為什麼它們是必要的,但為什麼這些特定的呢?

SHA-512 的初始雜湊值是第 9 到第 16 個素數(23、29、31、…、53)的平方根小數部分的 64 位二進制擴展。那是:

$$ I_0 = \left \lfloor \mathrm{frac} \left (\sqrt{23} \right ) · 2^{64} \right \rfloor $$ $$ I_1 = \left \lfloor \mathrm{frac} \left (\sqrt{29} \right ) · 2^{64} \right \rfloor $$ $$ \cdots $$ 很明顯,他們使用素數的原因是他們的平方根總是無理數,這使得數字看起來很好,看起來很隨機。取四的平方根就沒那麼有趣了,因為它會給出 0。這也意味著常數彼此相對獨立,因為它們中的任何一個都不能很容易地用任何其他來表示,這可能是一個弱點 - 但是這可能並不重要。

以這種方式選擇它們是因為雖然它們通常不需要特別的任何東西,但只要選擇的數字沒有某些特殊屬性(即,將它們設置為零可能是一個糟糕的選擇),SHA-的設計者- 512 想讓人們知道這些數字沒有被選擇,以便在算法中悄悄引入後門(例如,如果選擇了某種初始值組合,那麼 NSA 可能會更多地破壞雜湊函式很容易)這將很難確認或反駁,因為它需要數月甚至數年的密碼分析。

使用任何人都可以重新創建的公開可用數字,這裡是一些素數平方根的小數部分,解決了這個問題 - 任何人都無法更改這些數字(例如,沒有人可以更改 23 的平方根),這是相當可觀的設計一個算法在設定的常數下有一個後門比先設計算法然後再計算出這些常數更難。

的前幾位數字 $ \pi $ 或者 $ e $ 也是流行的選擇,但前提是您使用第一個數字。例如,如果您使用從位置 94858991 開始的數字,我會非常懷疑。

See Nothing up my sleeve number,也是這個類似的問題

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