加密然後 MAC 或 MAC 然後加密什麼更有效
我一直在網際網路上搜尋有關先加密然後 MAC、MAC 然後加密、MAC 和加密以及散列然後加密的效率的資源,但我想出了所有這些資源。大多數消息來源會給出他們將保護的內容,但沒有人會告訴我什麼在時間和資源方面更有效。
Encrypt-then-MAC 和 MAC-then-encrypt 的效率差不多。當使用分組密碼實現時,兩者都需要相同的數字 $ 2\lceil n/b\rceil+1 $ 塊加密,對於 $ n $ -位消息和 $ b $ 位塊。
當效率很重要時,應該通過通用雜湊使用具有完整性的身份驗證加密,例如 AES-GCM 或 ChaCha-Poly1305:因為通用雜湊比 CBC-MAC 快得多,對於與 MAC 相同的功能,可以顯著節省成本-然後加密。
您沒有發現太多關於性能的資訊,因為它基本上是相同的。關於他們的相對安全性,有很多有趣的事情要說,但除了“基本相同”之外,沒有太多要說的。
撇開大多數不起作用的 hash-then-encrypt 不談,有三種方法。給定一個明文 P:
- Encrypt-then-MAC:加密明文並附加密文
C = E(P)
的 MACT = M(E(P))
。在另一個方向,給定C || T
,檢查那T
是C
然後解密C
找到的 MACP
。- MAC-then-encrypt:計算明文的MAC,對
T = M(P)
明文附加MAC進行加密E(P || T)
。在另一個方向,解密密文,將結果拆分為P || T
並檢查T = M(P)
.- MAC-and-encrypt:加密明文
C = E(P)
並附加明文的MACT = M(P)
。在另一個方向,給定C || T
,解密C
以查找P
並檢查T
是 的 MACP
。在所有情況下,對於長度為 的消息
n
,您需要計算字節的 MAC 和n
字節的加密或解密n
。區別最多是是否需要加密/解密 MAC 值。這是一個恆定的成本(與消息長度無關),它與算法的其他細節具有相同的數量級,例如是否涉及填充,消息的長度如何編碼,密鑰如何準備使用,等等。所以通用方法之間沒有有意義的區別。上面我沒有考慮並行化。如果您的硬體支持,並行進行身份驗證計算和加密/解密計算是很有吸引力的。以 encrypt-then-MAC 為例,MAC 的輸入是加密的輸出,所以你不能同時完美地完成這兩者。相反,MAC-and-encrypt 允許加密和 MAC 並行化,而不是最後一步加密 MAC。但是,大多數原語從左到右一次處理一小塊數據,因此一旦加密處理了一個塊,您就可以使用該塊開始 MAC 操作:因此 encrypt-then-MAC 可以並行化為
- 加密第一個塊。
- MAC 第一個塊,同時加密第二個塊。
- MAC第二個塊,同時加密第三個塊。
等等。因此,無論消息長度如何,並行化懲罰都只有一個塊。此外,並行化懲罰被反轉以用於解密。結果,即使考慮並行化,性能差異也很小,而且它們在加密和解密之間是相反的,所以再一次,泛型結構對性能的影響不如算法的細節。