Padding

SHA3 十六進制 paddig 奇數長度字元串

  • November 26, 2020

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 星只是意味著零或更多

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