一个正式的分析已经由Phil Rogaway在2011年已经完成,在这里。第1.6节给出了我在这里转录的摘要,加上我自己强调的粗体(如果你不耐烦,那么他的建议是使用CTR模式,但我建议你阅读我的段落有关消息完整性与加密的情况)。
请注意,其中大多数要求IV是随机的,这意味着不可预测,因此应该使用加密安全性生成。但是,有些只需要一个“nonce”,它不要求该属性,而只要求它不被重用。因此,依赖于nonce的设计比不设计的设计更不容易出错(并且相信我,我已经看到许多CBC没有通过正确的IV选择实现的情况)。因此,当Rogaway说“当IV是nonce时未达到机密性”时,你会看到我添加了粗体,这意味着如果你选择IV加密安全(不可预测),那么没问题。但如果你不这样做,那么你就失去了良好的安全属性。 切勿在任何这些模式下重复使用IV。
此外,了解消息完整性和加密之间的区别非常重要。加密隐藏数据,但攻击者可能能够修改加密数据,如果您不检查邮件完整性,则软件可能会接受结果。虽然开发人员会说“但修改后的数据将在解密后作为垃圾返回”,一位优秀的安全工程师会发现垃圾导致软件出现不良行为的可能性,然后他会将该分析转化为真正的攻击。我见过许多使用加密的情况,但实际上需要的信息完整性比加密更多。了解您的需求。
我应该说尽管GCM同时具有加密和消息完整性,但它是一个非常脆弱的设计:如果你重新使用IV,你就会被搞砸 - 攻击者可以恢复你的密钥。其他设计不那么脆弱,所以我个人不敢根据我在实践中看到的不良加密代码的数量来推荐GCM。
如果你需要消息完整性和加密,你可以结合两种算法:通常我们看到CBC与HMAC,但没有理由将自己绑定到C