对称密码算法基础
做安全选型,咱得先把地基打牢。
这一章讲的都是最基础的东西——分组密码怎么切数据、密钥长短有啥影响、工作模式哪个靠谱。我记得十年前刚接触密码项目时,觉得这些概念背下来就行。后来踩了坑才明白,选错模式比选错算法还要命。
分组密码:把数据切成块
对称密码分两类:流密码和分组密码。咱们今天聊的都是分组密码。
说白了,分组密码就是把明文切成一块一块,然后每块用同一个密钥加密。AES和SM4都属于分组密码。
- 块大小:AES不管密钥是128、192还是256位,块大小固定128位(16字节)。SM4也是128位块。这个尺寸在安全性和性能之间取了平衡。
- 为什么不能更小或更大?块太小,容易碰撞;块太大,内存开销高、填充浪费。
这就引出一个关键问题:如果明文不是块大小的整数倍怎么办?
有一次我接手一个项目,他们用零填充,结果遇到恰好是16倍数时,最后一个字节0x00被误删了——密码学里这类"差一错误"很难排查。
密钥长度:越长越安全?
| 算法 | 密钥长度(位) | 安全强度(等价) |
|---|---|---|
| AES-128 | 128 | 128位 |
| AES-192 | 192 | 128位(因攻击成本略高) |
| AES-256 | 256 | 128位(量子前安全,实际强于128) |
| SM4 | 128 | 128位 |
看到没?AES-256密钥是SM4的两倍长。但别以为这就安全了。密钥长度和算法强度不是简单的乘法关系。SM4的128位密钥,在经典计算下穷举需要2¹²⁸次尝试,这在可预见的未来都是天文数字。
我个人习惯:对普通业务数据,AES-128已经够用;如果涉及高敏感或合规要求(比如国密、金融监管),我会选AES-256或SM4。别为了"看上去很安全"而盲目用256,多出来的计算开销在嵌入式设备上很痛苦。
工作模式:同一个算法,不同的命运
分组密码有五种常用模式,我挑四个和选型强相关的讲:ECB、CBC、CTR、GCM。为什么跳过CFB和OFB?因为CTR和GCM基本替代了它们。
ECB——千万别在生产环境用
ECB太简单了:每块独立加密。问题在于,同样的明文块会得到同样的密文块。你想想,如果有张图片用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。每个节点代表一种模式,箭头表示演进关系,红色标注了核心缺陷。
小结一个避坑指南
我曾经踩过的坑,列出来你防着点:
- IV重复 — 在GCM和CTR中,IV一旦重复,密钥流泄露,等于加密失效。用随机IV,或计数器+唯一标识。
- ECB侥幸心理 — 我见过有人只在内部网络用ECB,结果内部攻击照样能破解。加密从来不是只防外部。
- CBC不填MAC — 只加密不认证,攻击者可以翻转密文块控制明文。必须搭配HMAC或直接上GCM。
- 密钥长度迷信 — 别以为AES-256就比AES-128安全多少,算法实现和模式选择才是短板。