发布于 2021-01-25 15:10:21
怎样才能在AES-GCM或Cha20-Poly1305这样的AEAD中加入关键的承诺呢?
首先,让我们首先回顾一下AES-GCM/Poly1305在内部是如何工作的(以及这些关键的承诺攻击是如何工作的)。
下面是关于它们的工作方式的顶层概述(在这个级别上,AES-GCM和Poly1305的工作方式基本相同):首先,密文和AAD被组合成一系列字段元素M_n, M_{n-1}, ..., M_1;它们之间如何组合的细节不同;但是它们都具有这样的属性:它们可以通过调整特定的密文块来控制特定消息块M_i的值。
然后,取一个键相关值H,并在某个有限域计算多项式:
M_n H^n + M_{n-1} H^{n-1} + ... + M_i H^i + ... + M_1 H^1 + F(key, nonce)
这就是标记(嗯,不是完全在Poly1305中;最后添加的是模块化2^{128},但是这只是这次攻击的一个小麻烦)。
两者之间的有限域不同(GCM使用GF(2^{128}),而Poly1305使用素数字段GF(2^{130}-5)),但这并不重要。
现在,试图为两个不同的键找到具有相同标记的消息(因此在两个键下都被接受为有效)的攻击者控制密文,并知道一切( AAD、键、H值和F(key, nonce)值。因此,攻击者可以做的是修复整个密文(除了有助于M_i的部分),并将标记计算的这些部分组合成已知的常量C, C',然后查找生成满足以下条件的M_i值的剩余密文块的值:
M_i H^i + C = M_iH'^i + C'
(其中H, H'是两个键的内部H值)。这是一个很容易解决的问题,导致消息对两个消息都具有相同的标记值(而且由于攻击者知道一切,他可以很容易地计算出该公共值)。实际上,这对于Poly1305来说要复杂一些,因为并不是所有的M_i值都可以从密文块中获得,但是非平凡的分数可以得到,所以攻击者可以通过调整另一个密文块来找到这样的值。
好了,现在我们已经回顾了这次攻击,让我们来看看这三个想法会有多好:
在上面的攻击中,这将修改值F(key, nonce)值,使其依赖于键;然而,这已经依赖于键,因此攻击将按计划进行。
在上面的攻击中,这将修改一些M_j值(依赖于AAD的值);但是,由于攻击者会知道这些M_j值,这只会修改上述攻击中出现的C, C'值,因此不会使攻击复杂化。
上面的攻击根本没有解决这个问题。相反,在实际的解密步骤中会发生这种防御;在这一步骤中,关键的明文块将被计算为P_i = C_i \oplus F( key, nonce, i ),并找到两个不同的密钥将P_i块解密为所有的零(这是消息与两个密钥一起被接受所必需的),攻击者将需要找到两个F( key, nonce, i ) = F( key', nonce, i )所在的密钥;AES或ChaCha20中没有已知的可被利用的弱点,因此已知的最佳攻击将是生日冲突攻击。这表明,要获得2^k的安全性以抵御这种攻击,我们需要在2k 0前面加上(这可能涉及跨几个块的冲突攻击;这不会改变分析)。
https://crypto.stackexchange.com/questions/87771
复制相似问题