在確定性加密中使用 CBC-MAC 作為初始向量和密鑰校驗值是否安全?
我想用 AES-128 CBC 確定性地加密 <50 字節的短消息。我還希望能夠檢測是否使用了正確的密鑰。
密文和IV的完整性將由更高層的軟體來保證,因此不可能篡改密文、IV或附加數據。加密密鑰也為惡意方廣為人知,但一台伺服器除外。加密僅用於對該伺服器的合理否認,因此允許惡意方讀取所有內容。伺服器應該能夠盲目地將相同的消息分組,因此是確定性加密。
由於消息大小很小,我想盡量減少密文旁邊的成本。我已經閱讀了一個密鑰檢查值,可用於檢測是否應用了正確的密鑰進行解密。這可以通過在使用 AES 加密之前在消息前面添加一個零塊或另一個常量來完成。
我想知道是否可以使用明文的 128 位 CBC-MAC 作為該常量,並同時將其用作 IV 來加密消息。這是為了防止只有相等的消息的第一個字節導緻密文中的第一個字節相等。
基本上,這個想法歸結為連接兩次明文,應用 AES-CBC,IV 為零。使用前半部分的最後一個 AES 塊的輸出作為 IV,將整個後半部分作為密文。解密後,接收者可以對解密後的明文進行 CBC-MAC 以查看它是否與使用的 IV 匹配,從而使用正確的密鑰。
請注意,CBC-MAC 僅用於創建確定性 IV。MAC 的所有屬性都不需要它。
我的想法是否正確,並且惡意使用者(可以訪問加密密鑰)不會(或非常難以)能夠在我的 IV-密文組合中產生衝突,以便伺服器將不相等的消息組合在一起?
我的想法是否正確,並且惡意使用者(可以訪問加密密鑰)不會(或非常難以)能夠在我的 IV-密文組合中產生衝突,以便伺服器將不相等的消息組合在一起?
如果伺服器檢查 IV 密文中的所有字節(並聲明衝突,只有兩個加密消息的每個字節都相同),並且如果您可以解密它(並且加密消息的解密將始終輸出原始消息),那麼顯然不可能生成兩條不同的消息被聲明為衝突(除了這兩個事實之外,您不必擔心加密方法的細節)。
考慮兩個不同的明文消息 $ M \ne M’ $ ,它們將被加密成密文消息(包括IV) $ C = E(M) $ 和 $ C’ = E(M’) $ . 現在,解密過程是密文和密鑰的函式(僅此而已;這就是為什麼我將 IV 算作密文的一部分)。如果我們有 $ C = C’ $ ,那麼這個常見的密文會解密成什麼?如果是 $ M $ ,然後我們有一條消息 $ M’ $ 加密後無法正確解密(因此違反了加密值的解密總是返回原始明文的假設)。
因此,惡意使用者無法生成伺服器會與另一條消息混淆的消息。