CBC(Cipher Block Chaining)
CBC 在加密前将当前 plaintext block 与前一个 ciphertext block(首块用 IV)异或,从而隐藏重复模式;它只提供 confidentiality,不提供 authentication,并受 IV、padding、malleability 与 padding-oracle 边界约束。
[!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
典型错误设计:
- attacker 修改 ciphertext;
- server decrypt;
- padding 错时返回一种错误;
- MAC/业务错误时返回另一种错误;
- 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。
学习检查
- CBC 为什么可以隐藏 ECB 的重复 block pattern?
- CBC 的 IV 为什么通常不要求保密,但仍有严格安全要求?
- 为什么 CBC encryption 难以并行,而 decryption 更容易并行?
- CBC 为什么通常需要 padding?
- padding oracle 的“oracle”来自哪里?
- CBC 为什么不提供 authentication?
- attacker 修改 C_(i-1) 为什么能影响 P_i?
- 新系统为什么通常更倾向 AEAD?