使用单个共享密钥来使用Encrypt-then-MAC方案保护消息是否有缺陷?

假设系统正在使用AES-256-CBC和SHA1-HMAC,并且两个操作使用相同的密钥。截获这些消息之一后,攻击者可能会通过尝试解决HMAC或成功解密密文的第一块来强行使用此密钥。

对单个AES-256块执行解密与对可能较大的消息执行SHA1-HMAC相比,此操作应该更轻松。因此,AES-256是大规模并行蛮力攻击的理想选择,并且使用SHA1-HMAC不会损害系统。被考虑了吗?

#1 楼

暴力破解密钥几乎不是问题:128位密钥(假设它们已正确生成)的空间太大,无法被暴力破解。和256位密钥(您在AES-256中放入的密钥)更大。 AES是否比HMAC“更快”并不能使这种暴力破解变得更加可行:即使每次密钥尝试都像一次简单的位翻转一样简单,对于任何实际的攻击者而言,128位密钥仍然太大。 >
否则,如果“大规模并行蛮力攻击”是相关的,则说明您的密钥未正确生成(错误的PRNG,错误的密钥交换算法,错误的密码到密钥派生...),并且是您的问题,而不是对AES和HMAC重用同一密钥。如果您设想保护的方式是AES vs HMAC / SHA-1的相对慢度,那么事情就顺着上游了。


使用相同密钥来解决潜在问题加密和MAC将具有结构性; @Henrick的示例是CBC-MAC,它的确与CBC加密相同,只是您仅将最后一个加密的块用作MAC。只要您不授予攻击者访问对(p,c)的权限,CBC-MAC即可正常工作:对于您用于CBC-MAC的密钥k,p是纯文本块,c是对应的密文块。但是,如果您使用相同的密钥k来加密数据,那么您将为攻击者提供许多此类块。

对于HMAC与AES,尚无此类干扰。密码学家的普遍感觉是,AES和SHA-1(或SHA-256)“足够不同”,因此对于AES和HMAC / SHA-1使用相同的密钥应该没有实际问题。但是,仅凭任何一种科学严谨来简单地定义“差异”将是困难的,并且它并不是探索性很强的安全功能。因此,这就是其中一种构造,可以被称为“没有紧迫性来修复它,但如果可以避免的话就不要这样做”。一种更“安全”的方式(在某种意义上是:“我们知道我们正在行使的算法的特征”)是采用良好的单向密钥推导函数来获取您的主密钥K并从中得出,一个用于加密的子密钥,另一个用于MAC的子密钥。这就像在K上应用SHA-256并将256位结果分成两个128位密钥一样简单。

有一些MAC和加密算法本质上支持共享同一密钥。这正是GCM中发生的情况。

评论


$ \ begingroup $
如果要从单个高熵主密钥(而不是密码)派生多个密钥(例如,加密和MAC),我建议将HKDF作为KDF。
$ \ endgroup $
– CodesInChaos
13年4月23日在11:26

$ \ begingroup $
@Thomas:我没有security.stackexchange帐户,我认为(security.stackexchange.com/questions/34821/…)您高估了这种超级计算机的成本。 (请参阅tau.ac.il/~tromer/twirl)
$ \ endgroup $
–user991
13年4月25日在18:03

$ \ begingroup $
@RickyDemer:TWIRL仅用于筛分步骤。该页面声称筛分步骤是分解过程中最昂贵的一半,据我所知,对于512位整数,这是正确的,但对于1024位整数,则是非常错误的。有一篇论文估计了为线性代数步骤设计然后制造机器的成本,据称该成本“不到200万美元”,我坦率地说并不十分相信。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
13年4月25日在18:10



$ \ begingroup $
@ThomasPornin是否需要两个子密钥,或者可以将主密钥用于加密,将一个子密钥用于MAC,反之亦然?
$ \ endgroup $
–伊恩·沃伯顿(Ian Warburton)
20-04-27在18:22

#2 楼

显然,如果您一直使用AES-256-CBC进行保密,而使用AES-256-CBC-MAC进行身份验证,则将同一密钥用于机密性和验证将不安全。因此,使用同一密钥进行机密性和身份验证通常是不安全的;您需要其他前提才能得出结论。在您的情况下,对于任何相关的密钥攻击来说,算法都是“太不同了”。通常认为此假设对于安全性来说有点不稳定,这就是为什么在与您以单个共享密钥开头的情况类似的情况下,既定做法是从该共享密钥派生出不同的密钥用于机密性和身份验证的原因。如果这样做,则构造的安全性将基于您使用的KDF是PRF的假设,而不是基于机密性算法和MAC算法的假定差异。