我们将对消息应用加密和认证两个函数,有两种方法:一种是首先进行加密,然后再对密文进行认证;另一种是首先进行认证,然后再对消息和MAC值进行加密。
支持先进行加密的主要理由有两个。一个是理论结果表明,根据安全加密和认证的特定定义,先加密的方案是安全的,而先认证的方案是不安全的。进一步的研究表明,如果加密方案有一个特殊的缺陷,先认证的方案就不安全。在实际系统中,我们永远不会使用有这种缺陷的加密方案。然而,这些较弱的加密方案满足一个特殊形式的安全性定义(这是一个说明实际安全性和可证明安全性的差别的好例子)对这个弱的加密方案的密文应用MAC就修正了这个缺陷,从而使其变得安全了。对任意的实际加密方案来说,这样的理论结果没有什么意义。事实上,有类似的证明表明,这些问题在流密码(如CTR模式)和CBC模式的加密方案中不可能发生。
先进行加密的第二个理由是,它在处理假消息时更有效。对正常的消息,不管是哪种次序,都必须进行消息解密和检查认证。如果消息是伪造的,最终将会丢弃。在先加密的方案中,永远不会对一个假消息解密,因为在解密之前就可以识别这个假消息,从而将它丢弃。但在先认证的方案中,Bob首先必须对消息进行解密,然后再进行认证检査,这样对假消息处理就需要做更多的工作。
在先加密的方案中,节省了解密的时间,从而减轻了CPU的负担。在一些特殊环境里,这可以使拒绝服务攻击变得更困难。现实中的很多情况是,DOS攻击是通过使通信信道饱和来进行了攻击的,而不是让CPU陷入困境。我们不一定要为此找到依据,因为我们愿意牺牲效率以换取安全性。
支持先进行认证的主要理由也有两个。其一是在先加密的结构中,对方可以看到自己的输入和MAC值;而在先认证的结构中,MAC的输入和真正的MAC值被隐藏,对方只能看到密文和加密后的MAC值。这个性质使得对MAC进行攻击在先认证的情况下要比在先加密的情况下难得多。实际中的攻击选择的是两个函数(加密和认证)中最后应用的那一个。如果最后进行的是加密,对方就设法攻击加密函数;如果最后进行的是认证,对方就设法攻击认证函数。在一般情况下,认证比加密更重要,因此,我们更愿意让加密函数处在Eve的直接攻击之下,从而尽可能地保护MAC。
认证要比加密更重要,这与很多人的认识相反,但这个观点的确是正确的。设想正在使用的是安全信道,分别考虑在知道通信内容和可以对通信数据进行修改这两种情况下,对方的攻击所带来的最大损害。由此可以发现,在大多数情况下,对通信数据进行修改是毁坏性的攻击,远比看到通信内容更具有破坏性。
论证哪种操作顺序更好需要花些时间。两种方案均可造就一个好的系统,也可以产生一个坏的系统。每种操作各有其优缺点,采用哪种操作取决于更侧重什么。我们选择认证优先,因为安全性和简单性对于节省CPU时间来说更重要。