Cmac
AES_CMAC 是否指定在初始化期間加倍加密零?
閱讀 SIV RFC https://www.rfc-editor.org/rfc/rfc5297#page-9,我發現 S2V 函式首先計算“零”塊的 MAC,將其加倍,然後將進一步的數據異或到結果。
現在看看 BouncyCastle 的實現,在 AES-CMAC 的初始化過程中會發生完全相同的事情。
我必須如何理解 S2V 規範?我是否必須做所有“零”的事情以及加倍和異或?或者這是否已經發生在 AES-CMAC 函式中?這是否意味著 AES-CMAC(key, plaintext) 等同於 S2V(key, plaintext)?
我是否必須做所有“零”的事情以及加倍和異或?
如果您正在使用 AES-CMAC 函式實現 S2V 原語,那麼是的,您將需要執行所有“零”操作以及加倍和 XORing。
是的,如果您查看 AES-CMAC 函式內部,您會發現一些看起來像這樣的邏輯;處理一個全零塊,將結果加倍,並對其進行一些異或運算。但是,CMAC 做的事情有點不同(處理的 0 塊的結果在鏈的末尾,而不是在開頭),並且在任何情況下,S2V 原語都將 CMAC 邏輯假定為原語;CMAC 內部所做的實際上與如何實現 S2V 無關。
這是否意味著 AES-CMAC(key, plaintext) 等同於 S2V(key, plaintext)?
不,如果您查看 RFC,那麼由單個明文組成的向量的 S2V(請記住,S2V 採用明文向量)將是:
- AES-CMAC(key, plaintext XOR AES(key, 0)) (對於明文 >= 128 位;異或應用於明文的結尾),或
- AES-CMAC(key, PAD(plainext) XOR double(AES(key, 0 )))(對於 < 128 位的明文)。