Cmac

我應該在共享公共字節的兩個不同字元串上計算兩個 CMAC 嗎?

  • July 27, 2014

我正在嘗試保護我的 RF 通信,其中一個 RF 包由兩個單獨的段組成。如果您知道我的意思,我需要確保一個數據包的一個片段不會被某個先前數據包的有效片段替換。

我的 RF 數據包長 32 字節,我需要使用 CMAC 保護它(我發現 AES-128 在 CBC 模式和 CMAC 中的實現 - 在 16 字節塊上執行)。我打算這樣做:

[B1][B2][B3]...[B30][B31][B32] = bytes in my RF packet

[B1] [B2]... [B10] = first segment (10 bytes long)
[B11][B12]...[B20] = second segment (also 10 bytes long)
[B21][B22]...[B32] = remaining bytes of RF packet contain CMAC of first segment, 
                    and CMAC of second segment (both truncated to first 6 bytes
                    in order to fit into 32 bytes that I have for one transmission).

現在解決問題:為了確保沒有人擷取我的兩個 RF 數據包,並創建第三個新數據包,其中包含數據包 1 的第一段和數據包 2 的第二段(還複製了相應的 CMAC)我計劃計算 CMAC第一段 + 6 字節的第二段,並通過借用第一段的最後 6 字節和第二段的剩餘 10 字節來計算第二段的 CMAC。

我應該這樣做嗎?如果不是,我如何確保有人不傳輸包含我之前傳輸的兩個有效段的第三個自定義數據包?如果我能以某種方式計算整個 20 字節的 CMAC,那將是最好的,但據我所知,我最多只能使用 16 字節塊。

通過使用 6 字節 MAC,您只能驗證 $ 2^{24} $ 在看到碰撞之前平均發送消息,這將允許攻擊者將一條消息交換為另一條消息。您很有可能會更早地看到一個,因此實際上您只能安全地使用密鑰來處理數千個數據包。

因此,最好的選擇是找到 CMAC(或其他安全 MAC,如 HMAC)的實現,它允許您為整個 20 字節消息創建單個 12 字節身份驗證器。

如果您出於某些原因確實需要使用 16 字節 CMAC 實現,我認為將第一個 MAC 作為第二條消息的一部分比重疊更好,重疊可能在兩條消息之間共享。即計算第二個為 $ MAC(B[11]…B[20]||MAC(B[1]…B[10])) $ . 在發生碰撞之前,您仍然可以發送的消息數量受到限制。

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