使用 AES 進行身份驗證
我需要在不支持浮點操作但具有允許加密/解密操作的 AES 加速器模組的嵌入式環境中實現身份驗證機制。
目前,我正在考慮使用以下方法:
- 使用密鑰 k1 計算消息的密文。
- 使用密鑰 k2(k1) 並行計算同一消息的密文 $ \neq $ k2)。在對每個塊進行加密時,目前塊與前一個塊進行異或運算,因此驗證碼的長度始終等於塊的大小(即 128 位)。
- 將密文與認證碼拼接得到待發送的消息。
這種方法安全嗎?
TL;DR
不,這種方法不安全。請改用CMAC之類的標準。或者更好的是,檢查您的 AES 加速器模組,看看它是否支持任何AEAD加密模式,如GCM、CCM、EAX。
長版
為了保證消息驗證碼 (MAC)的安全,具有預言機訪問 MAC 的攻擊者(基本上這意味著攻擊者可以將任意消息發送到將計算 MAC 標籤的黑盒),不應該能夠偽造一個 MAC(即,為黑盒從未計算過 MAC 的東西構造一個有效的 MAC)。
我現在將忽略第 1 步,因為這是保密部分,對身份驗證部分沒有影響。另外,我假設您根據您的評論使用 AES-CBC 和 128 位密鑰。
所以建議是用密鑰加密明文 $ k_2 $ ,然後對所有塊進行異或運算以獲得 MAC 標籤。假設 MAC 使用全 0 的靜態 IV。
對於兩塊消息,說 $ m_1,m_2 $ ,MAC 將是 $ MAC_1 = E_{k_2}(m_1)\oplus E_{k_2}(E_{k_2}(m_1)\oplus m_2) $ . 我也可以向 oracle 詢問 MAC $ m_1 $ 本身,這將是 $ MAC_2 = E_{k_2}(m_1) $ .
現在註意到 $ MAC_1\oplus MAC_2 $ 是消息的有效 MAC $ E_{k_2}(m_1)\oplus m_2 $ ,但我從未向黑匣子詢問過那個 MAC。所以這將是一個休息。
這有多大用處?好吧,既然攻擊者控制 $ m_1 $ 和 $ m_2 $ ,並且可以得到 $ E_{k_2}(m_1) $ 在選擇之前 $ m_2 $ , 攻擊者可以使 $ E_{k_2}(m_1)\oplus m_2 $ 通過設置她想要的任何東西 $ m_2 $ 適當地。因此,攻擊者可以在看起來非惡意的消息上請求兩個 MAC(可能它們看起來是隨機的),但在選定的消息上獲得一個 MAC。
所以,不,你的方法不安全。