Reference-Request

Keccak 填充實現和位排序

  • May 12, 2015

我正在為我的學校工作嘗試用 Java 實現 Keccak。我被困在兩個地方:

  1. 摘要頁面上,填充顯示為

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 使用了不同的位順序。

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