在加密学中,密文填塞攻击(,字面译为填充神谕攻击)是指使用密文的填充验证信息来进行解密的攻击方法。密码学中,可变长度的明文信息通常需要经填充后才能兼容基础的。此攻击方式依赖对密文是否被正确填充的反馈信息。密文填塞攻击常常与分组密码内的密码块链接解密模式有关。非对称加密算法,如最优非对称加密填充算法,也可能易受到密文填充攻击。
对称加密
在对称加密中,填充可应用在分组密码工作模式上,其反馈的“神谕”(通常为服务器)信息将返回泄漏密文填充的正确与否。攻击者可在没有加密密钥的情况下,透过此信息的神谕密钥解密(或加密)信息。
对密码块链接进行密文填充攻击
对密码块链接进行解密需要先解密所有密文组,再验证填充,随后移除PKCS7填充,最后再返回解密后的明文信息。
若服务器返回“填充无效”信息而非“解密失败”错误,则攻击者可利用服务器本身进行密文填塞来解密(或加密)信息。
进行密码块链接解密的数学公式为
:P_i = D_K(C_i) \oplus C_{i-1},
:C_0 = IV.
如上文所述,进行密码块链接解密时会将每个明文块与先前的密文块进行异或比较。
因此,若块C_1更改了一个字节,则块P_2中的对应字节也会被修改。
假设攻击者拥有密文块C_1, C_2,且欲解密第二个密文块来获得明文P_2。
攻击者可以更改C_1的最后一个字节(即C_1'),并发送(IV,C_1',C_2)至服务器。
服务器随后将返回最后一个解密块(P_2')的填充是否正确(是否等于0x01)。
若填充正确,攻击者则能确定D_K(C_2) \oplus C_1'的最后一个字节是\mathrm{0x01},即D_K(C_2) = C_1' \oplus \mathrm{0x01}。
若填充不正确,攻击者则可以将C_1'的最后一个字节更改为下一个可能的值。
在最不理想的情况下,攻击者需要进行256次尝试(即尝试每个字节)来寻找P_2的最后一个字节。若解密的明文块内包含填充信息或用于填充的字节,攻击者则还需要进行额外的尝试来排除不同的可能性。
在确定P_2的最后一个字节后,攻击者可以使用相同的手段来获取P_2的倒数第二个字节。
攻击者可将C_1的最后一个字节设置为D_K(C_2) \oplus \mathrm{0x02},进而可将P_2的相应字节设置为\mathrm{0x02}。
利用上述的相同方式,攻击者可继续更改倒数第二个字节,直到填充正确为止(0x02, 0x02)。
若一个密文块包含了128比特(或16字节)的信息(如AES),攻击者可在255x16=4080次尝试中获取到明文的P_2信息。这比使用暴力破解所需的2^{128}次尝试要快得多。
使用密文填塞进行攻击
使用密文填塞的攻击方法起初由于2002年发布。攻击者随后利用此方法投入实际,用于应对SSL 和IPSec。除此之外,此攻击方法也用于多个网页框架上,如JavaServer Faces、Ruby on Rails、ASP.NET和Steam游戏客户端。2012年,此方法被证明为应对加固安全设备的有效方式。
虽然早期的攻击方法均已被大多数TLS实现修复,但在2013年,网络上出现了名为幸运十三攻击的新变种,它使用侧信道来重新利用软件中的缺陷。截止2014年上半年,尽管幸运十三攻击理论上对特定机器依然有效(参见信噪比),但研究学者们认为此方法在现实中已无威胁。,对解密互联网加密协议的最活跃攻击方法为降级攻击,如Logjam和Export RSA/FREAK攻击,此类方法会欺骗客户端使用旧版安全性相对较低的但兼容性较高的加密算法。另外,一种名为(2014年下半年出现)将降级攻击(降级至SSL 3.0)与对老版本不安全协议的密文填充攻击相结合,进而破解传输中的数据。2016年5月,研究人员发现OpenSSL在修复幸运十三时引入了另一个填充神谕,此缺陷被标记为CVE-2016-2107。
参考文献
评论 (0)