攻击者发起一种非常弱(且真实)的选择密文攻击。他只需要知道所选择的密文是否有效。

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)以满足块大小要求。在解密时,如果填充无效,系统会返回一个错误。

攻击核心流程:

  1. 填充校验:在解密数据时,系统会检查解密后的数据是否有正确的填充格式(如符合 PKCS#7 标准)。如果填充不正确,系统通常会返回一个错误。
  2. 攻击者的能力:攻击者假设自己可以:
    • 拥有一个密文解密的“填充 Oracle”,即:
      • 当密文解密后填充正确时,系统返回无错误
      • 当填充不正确时,系统返回错误信息
    • 能选择密文来访问这个预言机
  3. 利用填充信息
    1. 从前向后尝试修改后面块的 m 的第 i 位,如果修改到 padding 位则会报错,那么这个时候就掌握了 padding 的长度
    2. 把 padding 的长度标识全部加 1,然后搜索前面一位,当 plaintext 和我们枚举的 i 异或的结果等于修改过的长度标识的时候才能不报错,而长度标识和 i 我们都知道了,这个时候就知道了 plaintext 的一位
    3. 向前重复这个操作可以将这个块完全恢复出来