created: "2025-05-08 00:27"
tags:
- 密码学
Type: Note
aliases:
- Padding Oracle
updated: "2025-05-08 09:15"
Padding Oracle(填充预言机)是一种针对加密算法(主要是对称加密中的分组加密模式,如CBC模式)中填充机制的攻击方式。它利用了加密系统在解密时对填充错误的不同响应,从而一步步推测出密文对应的明文内容,甚至可以伪造合法的密文。
在分组加密(如AES-CBC)中,明文长度往往不是分组长度的整数倍,因此需要填充(Padding)到合适的长度。常见的填充方式有PKCS#7等。
- 攻击者可以提交任意的密文给服务器解密。
- 服务器会根据填充是否正确,返回不同的错误信息或响应(比如“填充错误”或“解密成功”)。
- 攻击者通过分析这些不同的响应,逐步推测出原始明文内容。
- 攻击者截获一段密文。
- 攻击者修改密文的某些字节,并将其发送给服务器。
- 服务器尝试解密并检查填充,如果填充错误,返回特定错误信息。
- 攻击者根据服务器的反馈,调整密文,最终可以推算出每一个明文字节。
- 可以解密密文,获取敏感信息。
- 在某些情况下,还可以伪造合法的密文,实现数据篡改。
- 不要将填充错误和解密错误区分开,统一返回错误信息。
- 使用认证加密(如AES-GCM、AES-CCM等),保证密文的完整性和真实性。
- 对解密操作进行时间上的统一处理,避免通过响应时间泄露信息。
假设有一个网站使用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) (密文块)
- 攻击者截获密文,比如 IV | 密文块。
- 攻击者修改IV的最后一个字节,比如将C8改为C8',然后把修改后的密文提交给服务器。
- 服务器解密后检查填充:- 如果填充正确,返回“解密成功”。
- 攻击者根据服务器的反馈,不断尝试不同的C8',直到服务器返回“解密成功”。
- 通过数学推算,攻击者可以得到明文的最后一个字节。
- 重复上述过程,可以逐字节恢复整个明文。
- 假设原始填充为 01(即明文最后一个字节是1,表示填充1个字节)。
- 攻击者将IV的最后一个字节从C8改为C8',使得解密后最后一个字节变成01。
- 服务器返回“填充正确”,攻击者就知道了明文最后一个字节的值。
- 继续修改倒数第二个字节,推算倒数第二个明文字节,依次类推。