Keccak 填充實現和位排序
我正在為我的學校工作嘗試用 Java 實現 Keccak。我被困在兩個地方:
- 在摘要頁面上,填充顯示為
P = M || 0x01 || 0x00 || … || 0x00
P = P xor (0x00 || … || 0x00 || 0x80)
然而,在規範頁面第 1.1.2 節中,他們提到可變速率填充為 10*1。
我閱讀它的方式,為吸收階段準備消息,您將消息切成大小
r
(比特率)。要獲得消息長度的倍數,r
您可以將消息附加或連接起來,(為簡單起見,我只考慮字節),以防只需要 1 個字節的填充0x81
。如果需要超過一個字節,那麼它將是0x80...0x01
. 所以我的填充實現就像P = M || 0x80…01
我在哪里以錯誤的方式閱讀規範? 2. 位在狀態中的位置如何?我的意思是,如果我有一個說 2 位的消息,那麼我的位會進入狀態 position
S[0][0][0]
,但是我應該將下一位放置在 的同一行S[0][1][0]
或同一通道中的位置S[0][0][1]
。我會假設將位放置在行中的下一個單元格中,然後當您完成一個切片中的位時,然後您再次從[0][0]
下一個切片中的位置開始。但是大多數函式是針對切片定義的,這讓我覺得,它可能是其他方式。我無法在規範中找到他們明確提到這一點的地方。請指出規範中可以解決我的困惑的地方。謝謝。
兩者都是正確的,這是令人困惑的,因為摘要頁面以字節為單位討論狀態,而規範文件以位為單位討論。Keccak-1600 的實際狀態是由 64 位字建構的。
在將輸入消息轉移到狀態期間,字節基本上以相反的順序放入單詞中,這現在使摘要頁面正確。這與規範的字節順序以及輸入消息如何放入狀態有關。
這是 Keccak c=1024,r=576 的前 576 位輸入狀態的範例,在填充簡單消息“test”之後。
0000000174736574 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000
可以看出,附加到消息的 0x01 字節在第一個 64 位字內的消息之前,最後的 0x80 字節佔據了最終 64 位字的最高位,正如 10*1 填充方案所說的那樣它應該。
經過 24 輪排列後得到的輸出摘要為:
1e2e9fc2002b002d75198b7503210c05a1baac4560916a3c6d93bcce3a50d7f00fd395bf1647b9abb8d1afcc9c76c289b0c9383ba386a956da4b38934417789e
我相信 NIST 送出文件中的某處有描述位/字節順序的符號,因為 NIST 對 SHA-3 API 使用了不同的位順序。