SHA3 十六進制 paddig 奇數長度字元串
FIPS-202 規範的 B2 部分描述了填充位的十六進制形式,它基本上是位填充 0110*1 的翻譯。但是一開始他們認為消息是“字節對齊的,即 len(M) = 8m”,那麼如果不是(例如長度為奇數時)我該怎麼辦?在 B1 部分,他們還假設十六進製字元串的長度為 2m,但如果它是奇數呢?
如果我們有“abcd”,我們用 ||060*80 填充,這樣 Keccak 狀態的第一行是 $ [00\ ..\ 00\ 06\ cd\ ab] $ 沒關係。
但是,如果我們有“abc”並且我們做同樣的事情,我們最終會得到 abc||06080 ,它給出一個狀態,其第一行是 $ [00\ ..\ 00\ 06\ c0\ ab] $ 這不是正確的墊子。我還嘗試僅添加 6080 ,然後將 6 與原始字元串的最後一個元素交換,所以 $$ \begin{equation*} ab,c \rightarrow ab,c6,080 \rightarrow ab,6c,080 \rightarrow [00 \ ..\ 00\ 00\ 6c\ ab] \end{equation*} $$ 但這與線上 SHA3 計算器相比也給出了錯誤的雜湊值。那麼正確的方法是什麼?
KECCAK家族中標
實際上,對於一般情況,填充是基於第 5.2 節中定義的位;
Algorithm 9: pad10*1(x, m) Input: positive integer x; non-negative integer m. Output: string P such that m + len(P) is a positive multiple of x. Steps: 1. Let j = (– m – 2) mod x. 2. Return P = 1 || 0^j|| 1.
並且還記為
因此,這至少是 2 位填充。如果消息大小 $ m \bmod r = {0,-1} $ 那麼將需要一個新的塊。
這 $ x $ 設置為 $ x = r (rate) $
後綴和填充 $ \operatorname{SHA3-224} $
Keccak對 SHA3、rawShake 和 Shake 系列使用**域分離。**對於 SHA3-x,消息首先以 01 為後綴,然後應用填充(第 6.1 節);
$$ M||\underbrace{01}{suffix}||\underbrace{10^*1}{padding bits} $$
$$ \operatorname{SHA3-224}(M) = \operatorname{KECCAK}[448] (M || 01, 224); $$
在這種情況下,最小添加位為 4,後綴為 2,填充至少為 2。
奇數十六進制編號消息的字節填充修復。
但要做一些填充,我首先需要將輸入從十六進制轉換為二進制。為此,我可以在 B1 部分中使用算法 10,但這僅適用於偶數長度的十六進製字元串,因此無法使用,這就是為什麼我要詢問有關十六進制填充的詳細資訊
由於編碼反 $ \texttt{abc||06080} $ 至 $ [80\ ..\ 00\ 06\ c0\ ab] $ 明顯的解決方案是使用 $ \texttt{ab6c||080} $ 這將被翻譯成 $ [80\ ..\ 00\ 00\ 6c\ ab] $ 按要求。
混淆來自 NIST 將消息定義為
消息 任意長度的位串,是 SHA-3 函式的輸入。
所以位填充自然應用於位串。對於十六進制值的字元串,它必須被轉換算法 10: h2b(H, n) 但文件隱含地定義了轉換之前的字節填充。轉換後它仍然是位填充。
注意: $ \phantom{a}^* $ 代表Kleene 星只是意味著零或更多。