对称加密原理:从工作模型到主流算法

对称加密,说白了就是加密和解密用同一把钥匙。你想想看,就像你用一把锁锁上箱子,再用同一把钥匙打开它。这个概念听起来简单,但实际工程里坑不少。我刚开始做密码学时,总觉得对称加密没什么好研究的,直到在一次项目中因为密钥管理不当导致数据泄露……嗯,从那以后我再也不敢轻视这个基础模块了。

对称加密的工作模型

对称加密的核心流程其实就三步:

  1. 发送方用密钥 K 对明文 P 加密,得到密文 C
  2. 信道传输密文 C(信道可能不安全)
  3. 接收方用同样的密钥 K 对密文 C 解密,还原出明文 P

这里有个关键点——密钥必须通过安全通道提前协商好。我在项目中见过有人直接把密钥写在配置文件里上传到 Git,那场面……

核心公式:

  • 加密:C = E(K, P)
  • 解密:P = D(K, C)

其中 E 和 D 是对应的加密/解密算法,K 是密钥。

你可能会问:那密钥怎么安全地传给对方?这个问题叫「密钥分发问题」,是密码学里最头疼的事之一。实际工程中常用 Diffie-Hellman 密钥交换或非对称加密来协商对称密钥,这些后面章节会细讲。

流密码 vs 分组密码:两种截然不同的思路

对称加密按处理方式分为两大类:流密码和分组密码。我当年面试时被问到这个问题,答得磕磕巴巴,后来在项目中才真正理解它们的区别。

对比维度 流密码 分组密码
处理单位 逐比特/逐字节 固定长度分组(如 64 位、128 位)
典型算法 RC4、ChaCha20 DES、AES、SM4
实现复杂度 较低,适合硬件 较高,但更灵活
错误传播 无(每比特独立) 有(分组间可能影响)
典型场景 实时通信、流媒体 文件加密、数据库加密

流密码的工作原理是:用密钥生成一个与明文等长的伪随机密钥流,然后与明文逐比特异或。加密和解密完全对称——再异或一次就还原了。我记得有一次做物联网项目,设备内存只有几 KB,用流密码就特别合适,因为它不需要缓存整个分组。

分组密码则先把明文切成固定大小的块(比如 64 位或 128 位),然后逐块加密。如果最后一块不够长,就需要填充。这里有个坑:不同的填充方式会导致兼容性问题。我曾经在对接银行接口时,因为 PKCS7 填充和 ISO 10126 填充没对齐,折腾了两天才排查出来。

我的建议:

新项目优先选分组密码(如 AES),除非你有明确的实时性要求或硬件资源受限。流密码虽然快,但实现时容易出安全漏洞——RC4 就是前车之鉴。

常见对称加密算法概览

下面这几个算法,你大概率都会在工作中遇到。我按出现顺序一个一个说。

DES(数据加密标准)

DES 是 1977 年发布的,分组大小 64 位,密钥长度 56 位。在当年是神作,但现在……56 位的密钥用暴力破解,普通电脑几天就能搞定。我在 2015 年还见过某老系统用 DES,当时就建议客户赶紧升级。

警告:DES 已经不安全了,任何新系统都不应该使用。如果你在维护老系统,尽快迁移到 AES。

3DES(三重 DES)

3DES 本质上是把 DES 做了三次:加密-解密-加密(EDE 模式)。密钥长度变成 112 位或 168 位,安全性提升不少。但它的性能太差了——比 AES 慢好几倍。我记得有个支付系统用 3DES 做交易加密,每秒只能处理几百笔,换成 AES 后直接飙到几千笔。

3DES 目前还没被完全淘汰,但 NIST 已经要求在 2023 年后禁用。如果你还在用,建议尽快规划迁移。

AES(高级加密标准)

AES 是现在的工业标准,分组大小 128 位,密钥长度支持 128/192/256 位。它取代 DES 成为主流,不是没有原因的:

  • 安全性高:至今没有有效的攻击方法
  • 性能优秀:软件和硬件实现都很快
  • 标准化程度高:几乎所有语言和平台都原生支持

我个人习惯,只要没有特殊限制,一律用 AES-256-GCM。GCM 模式同时提供加密和认证,能防篡改,省得再单独算 HMAC。

SM4(国密算法)

SM4 是中国国家密码管理局发布的对称加密标准,分组大小 128 位,密钥长度 128 位。结构上和 AES 不同,但安全性经过充分评估,目前没有发现明显弱点。

如果你做的是国内政务、金融项目,SM4 是强制要求。我在做某银行核心系统时,就被要求全部替换成 SM4。说实话,SM4 的性能和 AES 差不多,但生态支持差一些——有些旧版 OpenSSL 不支持,需要额外装补丁。

算法选择速查表:

场景 推荐算法 备注
通用数据加密 AES-256-GCM 安全 + 性能均衡
国内合规项目 SM4 国密要求
实时流媒体 ChaCha20-Poly1305 移动端性能更好
遗留系统维护 尽快迁移到 AES DES/3DES 已不安全

对称加密的核心结构图

下面这张图展示了对称加密的完整工作流程,以及流密码和分组密码的内部差异:

对称加密工作模型与流/分组密码对比 对称加密工作模型与流/分组密码对比 发送方 明文 P 加密 E(K, P) 密钥 K 密文 C 不安全信道 接收方 解密 D(K, C) 密钥 K 明文 P 流密码 • 逐比特/字节处理 • 密钥流 = 伪随机序列 • 加密:C = P ⊕ KeyStream • 解密:P = C ⊕ KeyStream • 典型:ChaCha20、RC4 • 适合:实时通信、低延迟 分组密码 • 固定长度分组处理 • 需要填充(Padding) • 多种工作模式(ECB/CBC/GCM) • 典型:AES、SM4、DES • 适合:文件加密、数据库 • 注意:ECB 模式不安全

从图上可以清楚看到:发送方和接收方共享同一个密钥 K,加密和解密是互逆操作。流密码和分组密码在底层处理方式上完全不同——流密码像流水一样逐字节处理,分组密码则把数据切成块再处理。

避坑指南:

我曾经在项目中遇到一个坑:用 AES-ECB 模式加密图片,结果加密后的图片还能看出轮廓。这是因为 ECB 模式下相同的明文块会生成相同的密文块,失去了语义安全性。后来换成 CBC 或 GCM 模式才解决。记住:永远不要用 ECB 模式。

对称加密是整个密码学的基石。理解了它,后面学非对称加密、哈希函数、数字签名都会轻松很多。这些算法虽然看起来多,但核心思想就一个:用密钥保护数据。选对算法、管好密钥,你的系统就安全了一大半。