Hash

SHA-256(預)處理的輸入消息究竟是如何處理的?

  • January 10, 2018

我對 SHA-256 如何處理消息非常感興趣,但我有 3 個問題。(正如我之前已經閱讀過一些答案,SHA-256 不是直接在消息上執行,而是在數組上執行,謝謝。)

  1. 根據我的理解,將消息填充為 512 位長度的倍數後,我們將消息放入

64 條目消息調度數組 w

$$ 0..63 $$32 位字

這是一個有 64 個元素的數組,每個元素允許 32 位長嗎? 2. >

將塊複製到前 16 個單詞 w

$$ 0..15 $$消息調度數組的

但是後來我問自己,如果我們有一條消息,例如 4096 位長,並且我們只用原始消息填充數組的前 16 個元素,那麼其他 (4096-16*32 = 3584) 3584 會發生什麼資訊的一部分? 3. >

s0: = (v

$$ i-15 $$右旋轉 7) xor (w$$ i-15 $$右旋轉 18) xor (w$$ i-15 $$右移 3)

rightrotaterightshift運算符對數組中的元素做了什麼?

  1. 那麼這是一個包含 64 個元素的數組,每個元素的長度為 32 位嗎?

是的,儘管如果(嵌入式)處理器不支持 32 位操作,您也可以使用 128 個 16 位元素或 256 個 8 位元素。然而,SHA-256 在內部以 32 位執行,因此這是最有效的字長。

如果實現使用除 32 位操作之外的任何操作,則需要使用其他字大小之一複制 32 位操作。

  1. 但是後來我問自己,如果我們有一條消息,例如 4096 位長,並且我們只用原始消息填充數組的前 16 個元素,那麼其他 (4096-16*32 = 3584) 3584 會發生什麼資訊的一部分?

它們將在該塊之後被處理。SHA-256 一次處理 512 位的批次,這是 16 個字,即 16 * 32 = 512 位塊(維基百科虛擬碼說:對於每個塊)。

每個塊都被處理,這更新了 h0..h7 狀態,它提供了塊的下一個處理的開始。最終狀態用於產生輸出。

  1. rightrotate 和 rightshift 運算符對數組中的元素做了什麼?

好吧,他們將所選單詞的位向右移動。rightrotate 操作會將“脫落”單詞的位放回左側。在密碼學中,我們稱之為轉置。

如果這些操作在執行時中不直接可用,則可以使用按位遮罩操作來模擬這些操作中的任何一個(例如,Java 不支持旋轉,僅支持移位)。

處理器通常直接支持移位和旋轉。


筆記

請注意,重要的是要注意 SHA-2 被定義為大端和 SHA-3(不幸的是)小端。在具有不同字節序的執行時實現算法時,這一點很重要。

顯然維基百科的虛擬碼不應該直接實現。對於每個塊,它讀取:

創建一個 64 條目的消息調度數組 w

$$ 0..63 $$32 位字

通常你要確保 SHA-256 實現只分配一次消息調度數組,之後它可以被每個塊重用。編寫虛擬碼是為了理解算法,而不是提供有關如何有效實現它的提示。

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