← [ BACK_TO_NOTES ]

CBC(Cipher Block Chaining)

CBC 在加密前将当前 plaintext block 与前一个 ciphertext block(首块用 IV)异或,从而隐藏重复模式;它只提供 confidentiality,不提供 authentication,并受 IV、padding、malleability 与 padding-oracle 边界约束。

#evergreen #concept #crypto #algorithm

[!info] related notes

CBC(Cipher Block Chaining)

一句话定义

CBC 把每个 plaintext block 与前一个 ciphertext block 做 XOR 后再加密:

C_i = E_K(P_i XOR C_(i-1))

首块使用:

C_0 = IV

解密:

P_i = D_K(C_i) XOR C_(i-1)

为什么它比 ECB 隐藏模式更好

在 ECB 中,相同 plaintext block 会得到相同 ciphertext block。

CBC 中,当前 block 还依赖前一个 ciphertext block。

因此即使:

P_i = P_j

只要 chaining state 不同,通常就会得到不同 ciphertext。

这减少了 ECB 那种直接的结构泄露。

IV

CBC 第一个 block 没有前一个 ciphertext,所以需要 IV。

对 CBC 来说,经典安全要求不是“IV 保密”,而是:

IV 应满足算法/协议要求,通常需要不可预测。

IV 可以和 ciphertext 一起传输。

但:

  • 重用;
  • 可预测;
  • 被 attacker 控制;

都可能破坏安全假设。

不要把 IV 当成第二个 secret key。

Encryption Dependency

CBC encryption:

C_i depends on C_(i-1)

所以天然顺序依赖。

第 i 个 ciphertext 未生成前,不能完成第 i+1 个 encryption。

这限制了 encryption parallelism。

Decryption

CBC decryption 需要:

D_K(C_i)

以及前一个 ciphertext C_(i-1)。

如果完整 ciphertext 已经拿到,多个 block-cipher decryption operation 可以并行计算,再与对应前块 XOR。

所以:

CBC encryption 顺序依赖,比 CBC decryption 的并行性更差。

Padding

CBC 处理完整 block。

如果 plaintext 长度不是 block size 的整数倍,常见协议会使用 padding,例如 PKCS#7。

这引入一个重要安全边界:

padding validation 不能通过可区分错误、时延或响应泄漏给 attacker。

否则可能形成 padding oracle。

Padding Oracle

典型错误设计:

  1. attacker 修改 ciphertext;
  2. server decrypt;
  3. padding 错时返回一种错误;
  4. MAC/业务错误时返回另一种错误;
  5. attacker 重复试探。

如果响应差异可观察,就可能逐步恢复 plaintext。

这也是为什么现代协议更倾向使用标准 AEAD,而不是自己组合 CBC + padding + error handling。

CBC 不提供 Authentication

CBC 只提供 confidentiality。

它本身不能检测 attacker 对 ciphertext 的主动修改。

CBC 具有 malleability。

修改前一个 ciphertext block 的某些 bit,会可预测地影响后一个 plaintext block 的对应 bit。

因此:

“CBC 解得出来”不等于“ciphertext 没被篡改”。

Error Propagation

如果传输中的 C_i 某些 bit 损坏:

  • P_i 通常大范围错误;
  • P_(i+1) 对应 bit 会翻转;
  • 更后面的 block 通常恢复正常。

这和 attacker 主动利用 malleability 是相关但不同的问题。

CBC + MAC

历史协议常见正确方向是:

Encrypt-then-MAC

ciphertext + metadata
→ MAC

接收端先验证 MAC,再解密。

但如果平台提供成熟 AEAD,现代新系统通常不应重新自己拼装 CBC + HMAC。

CBC 在今天的位置

CBC 仍然重要,因为:

  • 旧 TLS/协议;
  • legacy encrypted format;
  • 旧企业系统;
  • 密码学教学;

仍然大量出现。

但新系统的默认设计方向应优先考虑标准 AEAD。

常见误区

CBC 比 ECB 安全,所以 CBC 本身就够了

错误。CBC 仍然没有 authentication。

IV 必须保密

通常不需要保密,关键是满足协议规定的不可预测/唯一等要求。

CBC 不容易被篡改,因为后面 block 会乱

错误。CBC 有明确 malleability。

padding 只是格式细节

错误。padding error behavior 可能形成安全 oracle。

学习检查

  1. CBC 为什么可以隐藏 ECB 的重复 block pattern?
  2. CBC 的 IV 为什么通常不要求保密,但仍有严格安全要求?
  3. 为什么 CBC encryption 难以并行,而 decryption 更容易并行?
  4. CBC 为什么通常需要 padding?
  5. padding oracle 的“oracle”来自哪里?
  6. CBC 为什么不提供 authentication?
  7. attacker 修改 C_(i-1) 为什么能影响 P_i?
  8. 新系统为什么通常更倾向 AEAD?
创建于 2026/1/8 更新于 2026/9/30
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本