Block-Cipher
OMAC:在空字元串上填充
自上週以來,我開始使用此處給出的規範實施一些 MAC 。我目前正在使用測試向量測試 OMAC (one-key CBC) 。在第 4 頁的OMAC 規範中,他們解釋了填充的工作原理。在此之下,他們說:
$$ … $$其中空字元串計為一個塊。
這很奇怪,因為該塊是空的,這給我帶來了問題。如果為空,我如何使用
M[i]
和異或?(參見第 8 頁的算法定義)Y[i-1]``M[i]
M
在這個問題之後,即使在 for-loop 之後應用了填充,我是否應該在使用之前填充消息以獲得完整的塊?我認為這將是邏輯,但我對這個邏輯是否正確?對此的清晰解釋將不勝感激。感謝您提供的所有幫助。
規範所說的是,在處理之前,消息被填充到完整的塊長度,而空消息被填充到單個塊中。
第 4 頁的規範將算法的輸入描述為:
- 定義 $ ||a||_n = max{1, \lceil|a|/n\rceil } $ ,其中空字元串計為一個塊
- 讓 $ m = ||M||_n $
- 分割 $ M $ 進入 $ M[1] … M[m] $ , 在哪裡 $ |M[i]| = n $ 為了 $ 1 \le i < m $
即大小的塊數 $ n $ 在一條消息中 $ M $ 向上取整,並且必須至少為 1 才能傳遞給 $ CBC{-}MAC $ 算法的一部分。
應用於最後一個塊(空消息的空塊)的填充在公式中定義 $ (1) $ . 在字節方面,它轉換為:
- 將第一個字節設置為 $ 0x80 $ (即設置高位)
- 將所有剩餘字節設置為 $ 0 $
在實現方面,這意味著您將緩衝最多(並包括)一個完整的塊,並且僅在更多數據到達或 MAC 最終確定時處理該塊 - 因此,空消息被視為需要的 0 字節塊填充,並且不填充完整的最後一個塊。
如果您不想將規範作為練習來實現,Bouncy Castle CMAC 實現應該使緩衝區/填充方案清晰(CMAC 是 OMAC1 的 NIST 標準名稱)。