SHA-256(預)處理的輸入消息究竟是如何處理的?
我對 SHA-256 如何處理消息非常感興趣,但我有 3 個問題。(正如我之前已經閱讀過一些答案,SHA-256 不是直接在消息上執行,而是在數組上執行,謝謝。)
- 根據我的理解,將消息填充為 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)
rightrotate
和rightshift
運算符對數組中的元素做了什麼?
- 那麼這是一個包含 64 個元素的數組,每個元素的長度為 32 位嗎?
是的,儘管如果(嵌入式)處理器不支持 32 位操作,您也可以使用 128 個 16 位元素或 256 個 8 位元素。然而,SHA-256 在內部以 32 位執行,因此這是最有效的字長。
如果實現使用除 32 位操作之外的任何操作,則需要使用其他字大小之一複制 32 位操作。
- 但是後來我問自己,如果我們有一條消息,例如 4096 位長,並且我們只用原始消息填充數組的前 16 個元素,那麼其他 (4096-16*32 = 3584) 3584 會發生什麼資訊的一部分?
它們將在該塊之後被處理。SHA-256 一次處理 512 位的批次,這是 16 個字,即 16 * 32 = 512 位塊(維基百科虛擬碼說:對於每個塊)。
每個塊都被處理,這更新了 h0..h7 狀態,它提供了塊的下一個處理的開始。最終狀態用於產生輸出。
- rightrotate 和 rightshift 運算符對數組中的元素做了什麼?
好吧,他們將所選單詞的位向右移動。rightrotate 操作會將“脫落”單詞的位放回左側。在密碼學中,我們稱之為轉置。
如果這些操作在執行時中不直接可用,則可以使用按位遮罩操作來模擬這些操作中的任何一個(例如,Java 不支持旋轉,僅支持移位)。
處理器通常直接支持移位和旋轉。
筆記
請注意,重要的是要注意 SHA-2 被定義為大端和 SHA-3(不幸的是)小端。在具有不同字節序的執行時實現算法時,這一點很重要。
顯然維基百科的虛擬碼不應該直接實現。對於每個塊,它讀取:
創建一個 64 條目的消息調度數組 w
$$ 0..63 $$32 位字
通常你要確保 SHA-256 實現只分配一次消息調度數組,之後它可以被每個塊重用。編寫虛擬碼是為了理解算法,而不是提供有關如何有效實現它的提示。