攻击者发起一种非常弱(且真实)的选择密文攻击。他只需要知道所选择的密文是否有效。
CBC 只能加密长度是底层 PRP 块大小的倍数的消息(通常是 16 字节)。如果消息不具有该条件,则需要将其“填充”到正确的长度。假设 m 是 L 字节长,令 (因此 L + b 是 16 的倍数)。为了填充 m ,只需在末尾附加 b 次 b 的值(如果 b = 0 , 则将 0 添加 16 次),例如:
- Hello → Hello||BBBBBBBBBBB ( B 是 11 的十六进制表示)
- HelloWorld → HelloWorld||666666
- abcdefghijklmnop → abcdefghijklmnop||0000000000000000
解密程序需要读取最后一个字节 0xb,然后检查最后 b 个字节是否全是 0xb,如果是,删除最后 b 个字节然后输出剩余的字符串, 否则输出填充错误
Padding-Oracle 攻击是一种利用加密系统中填充校验机制的侧信道攻击。这种攻击针对的是基于块加密的模式(如 CBC 模式),其加密数据的最后一块通常需要填充(padding)以满足块大小要求。在解密时,如果填充无效,系统会返回一个错误。
攻击核心流程:
- 填充校验:在解密数据时,系统会检查解密后的数据是否有正确的填充格式(如符合 PKCS#7 标准)。如果填充不正确,系统通常会返回一个错误。
- 攻击者的能力:攻击者假设自己可以:
- 拥有一个密文解密的“填充 Oracle”,即:
- 当密文解密后填充正确时,系统返回无错误。
- 当填充不正确时,系统返回错误信息。
- 能选择密文来访问这个预言机
- 拥有一个密文解密的“填充 Oracle”,即:
- 利用填充信息:
- 从前向后尝试修改后面块的 m 的第 i 位,如果修改到 padding 位则会报错,那么这个时候就掌握了 padding 的长度
- 把 padding 的长度标识全部加 1,然后搜索前面一位,当 plaintext 和我们枚举的 i 异或的结果等于修改过的长度标识的时候才能不报错,而长度标识和 i 我们都知道了,这个时候就知道了 plaintext 的一位
- 向前重复这个操作可以将这个块完全恢复出来