
我們將對消息應用加密和認證兩個函數,有兩種方法:一種是第一时间進行加密,然後再對密文進行認證;另一種是第一时间進行認證,然後再對消息和MAC值進行加密。
支持先進行加密的主要理由有兩個。一個是理論結果表明,根據安全加密和認證的特定定義,先加密的方案是安全的,而先認證的方案是不安全的。進一步的研究表明,如果加密方案有一個特殊的缺陷,先認證的方案就不安全。在實際系統中,我們永遠不會使用有這種缺陷的加密方案。然而,這些較弱的加密方案滿足一個特殊形式的安全性定義(這是一個說明實際安全性和可證明安全性的差別的好例子)對這個弱的加密方案的密文應用MAC就修正了這個缺陷,從而使其變得安全了。對任意的實際加密方案來說,這樣的理論結果沒有什麼意義。事實上,有類似的證明表明,這些問題在流密碼(如CTR模式)和CBC模式的加密方案中不可能發生。
先進行加密的第二個理由是,它在處理假消息時更有效。對正常的消息,不管是哪種次序,都必須進行消息解密和檢查認證。如果消息是偽造的,最終將會丟棄。在先加密的方案中,永遠不會對一個假消息解密,因為在解密之前就可以識別這個假消息,從而將它丟棄。但在先認證的方案中,Bob第一时间必須對消息進行解密,然後再進行認證檢査,這樣對假消息處理就需要做更多的工作。
在先加密的方案中,節省分析密的時間,從而減輕了CPU的負擔。在一些特殊環境裏,這可以使拒絕服務攻擊變得更困難。現實中的很多情況是,DOS攻擊是顺利获得使通信信道飽和來進行了攻擊的,而不是讓CPU陷入困境。我們不一定要為此找到依據,因為我們願意犧牲效率以換取安全性。
支持先進行認證的主要理由也有兩個。其一是在先加密的結構中,對方可以看到自己的輸入和MAC值;而在先認證的結構中,MAC的輸入和真正的MAC值被隱藏,對方只能看到密文和加密後的MAC值。這個性質使得對MAC進行攻擊在先認證的情況下要比在先加密的情況下難得多。實際中的攻擊選擇的是兩個函數(加密和認證)中最後應用的那一個。如果最後進行的是加密,對方就設法攻擊加密函數;如果最後進行的是認證,對方就設法攻擊認證函數。在一般情況下,認證比加密更重要,因此,我們更願意讓加密函數處在Eve的直接攻擊之下,從而儘可能地保護MAC。
認證要比加密更重要,這與很多人的認識相反,但這個觀點的確是正確的。設想正在使用的是安全信道,分別考慮在知道通信內容和可以對通信數據進行修改這兩種情況下,對方的攻擊所帶來的最大損害。由此可以發現,在大多數情況下,對通信數據進行修改是毀壞性的攻擊,遠比看到通信內容更具有破壞性。
論證哪種操作順序更好需要花些時間。兩種方案均可造就一個好的系統,也可以產生一個壞的系統。每種操作各有其優缺點,採用哪種操作取決於更側重什麼。我們選擇認證優先,因為安全性和簡單性對於節省CPU時間來說更重要。
