Phil Rogaway 于 2011 年在此处进行了正式分析。第 1.6 节给出了我在此处转录的摘要,并用粗体添加了我自己的重点(如果您不耐烦,那么他的建议是使用 CTR 模式,但我建议您阅读下面我关于消息完整性与加密的段落)。
请注意,其中大多数要求 IV 是随机的,这意味着不可预测,因此应该使用密码安全性生成。但是,有些只需要一个“nonce”,它不要求该属性,而只要求它不被重复使用。因此,依赖随机数的设计比不依赖随机数的设计更不容易出错(相信我,我见过很多没有通过适当的 IV 选择来实现 CBC 的情况)。因此,您会看到,当 Rogaway 说“当 IV 是随机数时无法实现机密性”时,我添加了粗体字,这意味着如果您选择 IV 加密安全(不可预测),那么没问题。但是,如果您不这样做,那么您将失去良好的安全属性。 切勿将 IV 重复用于任何这些模式。
此外,了解消息完整性和加密之间的区别也很重要。加密隐藏数据,但攻击者可能能够修改加密数据,如果您不检查消息完整性,您的软件可能会接受结果。虽然开发者会说“但是修改后的数据在解密后会变成垃圾”,但一个好的安全工程师会发现垃圾在软件中引起不良行为的概率,然后他会将这种分析变成真正的攻击。我见过很多使用加密的情况,但确实比加密更需要消息完整性。了解你需要什么。
我应该说,尽管 GCM 具有加密和消息完整性,但它是一个非常脆弱的设计:如果你重新使用 IV,你就完蛋了——攻击者可以恢复你的密钥。其他设计不那么脆弱,所以我个人害怕根据我在实践中看到的糟糕加密代码的数量来推荐 GCM。
如果你需要消息完整性和加密两者,你可以结合两种算法:通常我们看到 CBC 和 HMAC,但没有理由将自己绑定到 CBC。重要的是要先加密,然后 MAC 加密内容,而不是反过来。此外,IV 需要成为 MAC 计算的一部分。
我不知道知识产权问题。
现在来看看 Rogaway 教授的好东西:
分组密码模式,加密但不是消息完整性
ECB:一种分组密码,该模式通过分别加密每个 n 位片段来加密 n 位的倍数的消息。安全属性很弱,该方法在块位置和时间上泄漏块的相等性。具有相当大的遗留价值,并且具有作为其他方案的构建块的价值,但该模式本身并不能实现任何普遍期望的安全目标,必须非常谨慎地使用;ECB不应被视为一种“通用”的保密模式。
CBC : 一种基于 IV 的加密方案,该模式作为概率加密方案是安全的,实现与随机位不可区分,假设为随机 IV。如果 IV 只是一个 nonce,或者它是在该方案使用的相同密钥下加密的 nonce ,则无法实现机密性,正如标准错误地建议的那样。密文具有高度可塑性。没有选择密文攻击 (CCA) 安全性。对于许多填充方法,如果存在正确的填充预言,机密性将被丧失。由于本质上是串行的,因此加密效率低下。广泛使用,该模式的仅限隐私的安全属性导致频繁的误用。可用作 CBC-MAC 算法的构建块。我无法确定与 CTR 模式相比的重要优势。
CFB:一种基于IV的加密方案,该模式作为概率加密方案是安全的,假设随机IV,实现与随机位的不可区分性。如果 IV 是可预测的,或者它是由在方案使用的相同密钥下加密的 nonce 生成的,则无法实现机密性,正如标准错误地建议的那样。密文是可延展的。没有 CCA 安全性。由于本质上是串行的,因此加密效率低下。方案取决于参数 s,1 ≤ s ≤ n,通常 s = 1 或 s = 8。需要一次分组密码调用来仅处理 s 位效率低下。该模式实现了一个有趣的“自同步”特性;在密文中插入或删除任意数量的 s 位字符只会暂时中断正确的解密。
OFB:一种基于IV的加密方案,该模式作为概率加密方案是安全的,实现与随机位不可区分,假设是随机IV。如果 IV 是 nonce,则无法实现机密性,尽管 IV 的固定序列(例如,计数器)确实可以正常工作。密文具有高度可塑性。没有 CCA 安全性。由于本质上是串行的,因此加密和解密效率低下。本机加密任何位长度的字符串(不需要填充)。我无法确定与 CTR 模式相比的重要优势。
CTR:一种基于 IV 的加密方案,该模式实现了与假设 nonce IV 的随机位的不可区分性。作为一种安全的基于 nonce 的方案,该模式也可以用作概率加密方案,具有随机 IV。如果随机数在加密或解密中被重用,则隐私完全失败。该模式的并行性通常使其速度更快,在某些设置中比其他机密模式更快。认证加密方案的重要组成部分。总体而言,通常是实现仅隐私加密的最佳和最现代的方式。
XTS:一种基于 IV 的加密方案,该模式通过将可调整的分组密码(作为强 PRP 安全)应用于每个 n 位块来工作。对于长度不能被 n 整除的消息,最后两个块被特殊处理。该模式唯一允许的用途是加密块结构存储设备上的数据。底层 PRP 的狭窄宽度和部分最终区块的不良处理是问题。比(宽块)PRP 安全分组密码更有效但不太理想。
MACs(消息完整性但不加密)
ALG1-6:MAC 的集合,所有这些都基于 CBC-MAC。方案太多。有些作为 VIL PRF 可证明是安全的,有些作为 FIL PRF,有些则没有可证明的安全性。一些计划承认破坏性攻击。有些模式已经过时了。对于具有它的模式,密钥分离没有得到充分关注。不应大量采用,但可以选择性地选择“最佳”方案。也可以不采用这些模式,而支持 CMAC。一些 ISO 9797-1 MAC 被广泛标准化和使用,尤其是在银行业。该标准的修订版 (ISO/IEC FDIS 9797-1:2010) 即将发布 [93]。
CMAC:基于 CBC-MAC 的 MAC,该模式可证明是安全的(直到生日界限)作为(VIL)PRF(假设底层块密码是一个好的 PRP)。对于基于 CBCMAC 的方案而言,开销基本上是最小的。在某些应用程序域中固有的串行性质是一个问题,并且与 64 位分组密码一起使用将需要偶尔重新键入密钥。比 ISO 9797-1 的 MAC 集合更干净。
HMAC:基于加密散列函数而不是块密码的 MAC(尽管大多数加密散列函数本身是基于块密码的)。机制享有强大的可证明安全界限,尽管不是来自首选假设。文献中的多个密切相关的变体使了解已知内容变得复杂。从未提出过破坏性攻击。广泛标准化和使用。
GMAC:基于随机数的 MAC,是 GCM 的一个特例。继承了 GCM 的许多优点和缺点。但是对于 MAC 来说,nonce 要求是不必要的,在这里它几乎没有什么好处。如果标签被截断为 ≤ 64 位并且解密范围不受监控和缩减,则实际攻击。nonce-reuse 完全失败。如果采用 GCM,则无论如何使用都是隐含的。不推荐单独标准化。
经过身份验证的加密(加密和消息完整性)
CCM:一种基于 nonce 的 AEAD 方案,它结合了 CTR 模式加密和原始 CBC-MAC。本质上是串行的,在某些情况下会限制速度。假设底层块密码是一个好的 PRP,可证明是安全的,具有良好的界限。笨拙的建筑,显然可以完成这项工作。比 GCM 更容易实现。可用作基于 nonce 的 MAC。广泛标准化和使用。
GCM:一种基于 nonce 的 AEAD 方案,结合了 CTR 模式加密和基于 GF(2128) 的通用散列函数。对于某些实现环境具有良好的效率特性。假设标签截断最少,良好的可证明安全的结果。存在大量标签截断时的攻击和可证明的安全边界差。可以用作基于 nonce 的 MAC,然后称为 GMAC。允许 96 位以外的随机数的可疑选择。建议将随机数限制为 96 位,将标签限制为至少 96 位。广泛标准化和使用。