Padding Oracle

1. Padding Oracle

Padding Oracle(填充预言机)是一种针对加密算法(主要是对称加密中的分组加密模式,如CBC模式)中填充机制的攻击方式。它利用了加密系统在解密时对填充错误的不同响应,从而一步步推测出密文对应的明文内容,甚至可以伪造合法的密文。

1.1. 详细解释

在分组加密(如AES-CBC)中,明文长度往往不是分组长度的整数倍,因此需要填充(Padding)到合适的长度。常见的填充方式有PKCS#7等。

Padding Oracle攻击的核心:

  • 攻击者可以提交任意的密文给服务器解密。
  • 服务器会根据填充是否正确,返回不同的错误信息或响应(比如“填充错误”或“解密成功”)。
  • 攻击者通过分析这些不同的响应,逐步推测出原始明文内容。

1.2. 攻击流程简述

  1. 攻击者截获一段密文。
  2. 攻击者修改密文的某些字节,并将其发送给服务器。
  3. 服务器尝试解密并检查填充,如果填充错误,返回特定错误信息。
  4. 攻击者根据服务器的反馈,调整密文,最终可以推算出每一个明文字节。

1.3. 危害

  • 可以解密密文,获取敏感信息。
  • 在某些情况下,还可以伪造合法的密文,实现数据篡改。

1.4. 防御方法

  • 不要将填充错误和解密错误区分开,统一返回错误信息。
  • 使用认证加密(如AES-GCM、AES-CCM等),保证密文的完整性和真实性。
  • 对解密操作进行时间上的统一处理,避免通过响应时间泄露信息。

2. 例子

2.1. 场景设定

假设有一个网站使用AES-CBC模式加密用户的敏感信息,填充方式为PKCS#7。攻击者可以提交任意密文给服务器,服务器会解密并根据填充是否正确返回不同的错误信息。

明文(假设):  6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79

加密后的密文(假设):  C1 C2 C3 C4 C5 C6 C7 C8 | D1 D2 D3 D4 D5 D6 D7 D8
                           (IV)                    (密文块)

2.2. 攻击步骤(简化版)

  1. 攻击者截获密文,比如 IV | 密文块。
  2. 攻击者修改IV的最后一个字节,比如将C8改为C8',然后把修改后的密文提交给服务器。
  3. 服务器解密后检查填充:- 如果填充正确,返回“解密成功”。
  • 如果填充错误,返回“填充错误”。
  1. 攻击者根据服务器的反馈,不断尝试不同的C8',直到服务器返回“解密成功”。
  2. 通过数学推算,攻击者可以得到明文的最后一个字节。
  3. 重复上述过程,可以逐字节恢复整个明文。

2.3. 形象化流程

  • 假设原始填充为 01(即明文最后一个字节是1,表示填充1个字节)。
  • 攻击者将IV的最后一个字节从C8改为C8',使得解密后最后一个字节变成01。
  • 服务器返回“填充正确”,攻击者就知道了明文最后一个字节的值。
  • 继续修改倒数第二个字节,推算倒数第二个明文字节,依次类推。