对称密码算法基础

做安全选型,咱得先把地基打牢。

这一章讲的都是最基础的东西——分组密码怎么切数据、密钥长短有啥影响、工作模式哪个靠谱。我记得十年前刚接触密码项目时,觉得这些概念背下来就行。后来踩了坑才明白,选错模式比选错算法还要命。

分组密码:把数据切成块

对称密码分两类:流密码和分组密码。咱们今天聊的都是分组密码。

说白了,分组密码就是把明文切成一块一块,然后每块用同一个密钥加密。AES和SM4都属于分组密码。

  • 块大小:AES不管密钥是128、192还是256位,块大小固定128位(16字节)。SM4也是128位块。这个尺寸在安全性和性能之间取了平衡。
  • 为什么不能更小或更大?块太小,容易碰撞;块太大,内存开销高、填充浪费。

这就引出一个关键问题:如果明文不是块大小的整数倍怎么办?

填充是必然的。我最常用的填充方式是PKCS7。比如缺3个字节,就补3个0x03。缺1个字节就补0x01。块对齐时,还要补一整个块(16个0x10),不然解密时无法区分合法数据和填充。
有一次我接手一个项目,他们用零填充,结果遇到恰好是16倍数时,最后一个字节0x00被误删了——密码学里这类"差一错误"很难排查。

密钥长度:越长越安全?

算法密钥长度(位)安全强度(等价)
AES-128128128位
AES-192192128位(因攻击成本略高)
AES-256256128位(量子前安全,实际强于128)
SM4128128位

看到没?AES-256密钥是SM4的两倍长。但别以为这就安全了。密钥长度和算法强度不是简单的乘法关系。SM4的128位密钥,在经典计算下穷举需要2¹²⁸次尝试,这在可预见的未来都是天文数字。

我个人习惯:对普通业务数据,AES-128已经够用;如果涉及高敏感或合规要求(比如国密、金融监管),我会选AES-256或SM4。别为了"看上去很安全"而盲目用256,多出来的计算开销在嵌入式设备上很痛苦。

工作模式:同一个算法,不同的命运

分组密码有五种常用模式,我挑四个和选型强相关的讲:ECB、CBC、CTR、GCM。为什么跳过CFB和OFB?因为CTR和GCM基本替代了它们。

ECB——千万别在生产环境用

ECB太简单了:每块独立加密。问题在于,同样的明文块会得到同样的密文块。你想想,如果有张图片用ECB加密,头像轮廓还能看出来。这叫模式泄露模式。

不要用ECB。我曾经在一个旧项目里看到过ECB被用来加密支付报文,结果攻击者通过观察密文块重复就能推断出交易金额是否相同。后来我强制要求升级为GCM。那个整改还挺费劲,因为数据库里已经有大量ECB加密的历史数据。

CBC——需要IV,但不防篡改

CBC每个块在处理前会和上一个密文块异或,所以引入了IV(初始化向量)。好处是相同的明文在不同IV下产生不同密文。缺点是:

  • 加密不能并行(必须等前一密文)
  • 不提供完整性校验,攻击者可以翻转密文来篡改明文
  • 需要IV随机且不重复

这模式现在用得少了,除非你在做旧系统对接。

CTR——并行与随机访问

CTR把密钥流算出来和明文异或,每个块用不同的计数器值。优点很明显:

  • 可以并行加密/解密
  • 支持随机访问(解密任意块不依赖其他块)
  • 不需要填充(流式做异或)

缺点是仍然没有认证,容易被替换密文。

GCM——认证加密,安全选型首选

GCM = CTR模式 + 伽罗瓦认证。它在加密的同时产生一个MAC(认证标签),能同时保证机密性和完整性。这是目前最推荐的工作模式,尤其是网络传输、API加密场景。

  • 提供认证(防篡改)
  • 并行处理,效率高
  • 支持附加认证数据(AAD)
  • 但实现复杂,IV不能重复(一旦重复,密钥流暴露,认证被直接绕过)

我参与过的一个IoT项目,最初用CBC+HMAC自己拼认证,结果开发者不小心重用了IV,密钥流泄露导致设备被远程控制。后来统一改成AES-256-GCM,利用硬件加速,性能没降,安全性大幅提升。

工作模式对比表

模式并行需要IV完整性填充推荐场景
ECB是否无是❌ 禁止使用
CBC否是无是旧系统兼容(不推荐新项目)
CTR是是无否流媒体、数据库字段加密(需自建认证)
GCM是是有(认证标签)否✅ 新项目首选,API、网络传输

SVG:分组密码工作模式关系图

下图展示了我对这几种模式的理解——从最基础的ECB出发,到带链的CBC,再到流式并行的CTR,最终到达带认证的GCM。每个节点代表一种模式,箭头表示演进关系,红色标注了核心缺陷。

对称密码工作模式演进与安全性对比 分组密码基础 块128位 · 密钥128/192/256 ECB 不推荐 · 明文泄露 CBC 需IV · 不可并行 CTR 可并行 · 无认证 GCM = CTR + 认证 认证加密 · 推荐首选 💡 选型建议: ECB坚决不用;CBC仅旧系统;CTR适合流式场景(但必须自建MAC);GCM是新项目的不二之选。

小结一个避坑指南

我曾经踩过的坑,列出来你防着点:

  • IV重复 — 在GCM和CTR中,IV一旦重复,密钥流泄露,等于加密失效。用随机IV,或计数器+唯一标识。
  • ECB侥幸心理 — 我见过有人只在内部网络用ECB,结果内部攻击照样能破解。加密从来不是只防外部。
  • CBC不填MAC — 只加密不认证,攻击者可以翻转密文块控制明文。必须搭配HMAC或直接上GCM。
  • 密钥长度迷信 — 别以为AES-256就比AES-128安全多少,算法实现和模式选择才是短板。