对称加密基础:原理、算法与工作模式
对称加密,说白了就是加密和解密用同一把钥匙。就像你家里的大门,用一把钥匙锁上,也用同一把钥匙打开。这个概念听起来简单,但实际落地时坑不少。我做了这么多年安全协议,见过太多因为对称加密用错而出事故的案例。
对称加密的核心原理
对称加密的数学本质,其实就是一个可逆的置换函数。我给你个公式:
C = E(K, P) // 加密:明文P,密钥K,输出密文C
P = D(K, C) // 解密:密文C,密钥K,还原明文P
这里的关键点在于:密钥K必须保密。一旦密钥泄露,整个加密体系就崩塌了。我在2018年帮一家金融公司做安全审计时,发现他们把AES密钥硬编码在配置文件里,还上传到了Git仓库...嗯,那场面,你懂的。
常见对称加密算法
目前主流的对称加密算法,我按实际使用频率排个序:
| 算法 | 密钥长度 | 分组大小 | 安全性 | 我的评价 |
|---|---|---|---|---|
| AES | 128/192/256位 | 128位 | 高(推荐) | 业界标准,首选 |
| SM4 | 128位 | 128位 | 高(国标) | 国内项目必用 |
| DES | 56位 | 64位 | 低(已淘汰) | 别用了,真的 |
| 3DES | 112/168位 | 64位 | 中(过渡期) | 能不用就别用 |
AES(高级加密标准)
AES是目前最广泛使用的对称加密算法。我个人习惯用AES-256,虽然性能比AES-128慢一点点,但安全余量更大。AES的加密过程包括字节代换、行移位、列混合和轮密钥加,总共10-14轮(取决于密钥长度)。
我记得有一次做嵌入式设备的安全方案,芯片只支持硬件AES加速。当时我选了AES-128-GCM模式,既利用了硬件加速,又保证了数据完整性。这个组合在IoT设备上特别常见。
SM4(国密算法)
SM4是中国国家密码管理局发布的对称加密标准。它的结构和AES类似,但轮函数设计不同。SM4使用32轮非线性迭代,密钥长度128位。
做国内项目时,SM4是绕不开的。我去年给一个政务系统做安全方案,客户明确要求必须用SM4。说实话,SM4的安全性经过多年验证,已经相当可靠了。它的加解密速度在软件实现上甚至比AES还快一点。
DES(数据加密标准)
DES是历史产物了。它的密钥只有56位,用现在的硬件几小时就能暴力破解。我曾经在维护一个老系统时看到DES,当时就建议客户立刻升级。你想想看,56位的密钥空间只有2^56,而AES-256是2^256,这差距有多大?
密钥分发问题
对称加密最大的痛点,就是密钥分发。加密方和解密方必须共享同一个密钥,但怎么安全地把密钥传给对方?这是个经典的「先有鸡还是先有蛋」问题。
常见的解决方案有几种:
- 预共享密钥: 提前通过安全渠道(比如面对面)交换密钥。适合小规模场景。
- 密钥协商协议: 比如Diffie-Hellman,双方在不安全的信道上协商出共享密钥。
- 密钥分发中心(KDC): 由可信第三方负责分发密钥。Kerberos就是典型例子。
- 混合加密: 用非对称加密传输对称密钥。HTTPS就是这么干的。
我在实际项目中,最常用的是混合加密方案。比如设计一个即时通讯协议,先用ECDH协商出临时密钥,再用这个密钥做AES-GCM加密。这样既解决了密钥分发问题,又保证了前向安全性。
工作模式
对称加密算法处理的是固定大小的数据块(比如AES是128位)。但实际数据长度不固定,所以需要工作模式来处理。我挑三个最常用的模式讲讲:
ECB(电子密码本模式)
ECB是最简单的模式。每个数据块独立加密,互不影响。但问题也出在这里:相同的明文块会生成相同的密文块。
我举个例子:如果你用ECB模式加密一张图片,加密后的图片还能看出轮廓。为什么?因为相同颜色的像素块加密后也相同。这在安全领域是致命的。
CBC(密码分组链接模式)
CBC模式引入了初始化向量(IV)。每个明文块先与前一个密文块异或,再加密。这样相同的明文块会生成不同的密文块。
CBC的加密过程:
C1 = E(K, P1 ⊕ IV)
C2 = E(K, P2 ⊕ C1)
C3 = E(K, P3 ⊕ C2)
...
CBC的问题在于:加密是串行的,不能并行计算。而且如果IV固定或可预测,安全性会大打折扣。我曾经在渗透测试中,通过预测IV成功破解了CBC加密的会话Cookie。
GCM(伽罗瓦/计数器模式)
GCM是我个人最推荐的工作模式。它结合了CTR模式的并行加密和GMAC的消息认证,能同时提供机密性和完整性保护。
GCM的优势很明显:
- 支持并行计算: 加密速度快,适合高性能场景。
- 内置认证: 能检测密文是否被篡改。
- 支持附加数据(AAD): 可以认证一些不需要加密的头部信息。
GCM的输入参数包括:密钥K、初始化向量IV、明文P、附加数据AAD。输出是密文C和认证标签T。
(C, T) = AES-GCM-Encrypt(K, IV, P, AAD)
我在设计API网关的安全方案时,就用AES-256-GCM来加密请求体和响应体。GCM的认证标签能确保数据在传输过程中没有被篡改。而且GCM的IV只需要96位(12字节),比CBC的128位更节省带宽。
总结一下
对称加密是安全通信的基石。选算法时,优先考虑AES-256或SM4。工作模式上,GCM是全能选手,CBC也能用但要小心IV管理。至于ECB...嗯,让它留在教科书里吧。
密钥分发是绕不开的难题。我的经验是:能用混合加密就别用纯对称加密。非对称加密负责密钥协商,对称加密负责数据加密,各司其职。
最后送你一句话:加密算法本身很少出问题,出问题的往往是密钥管理和模式选择。做安全方案时,多想想「密钥怎么来的」「IV怎么生成的」「数据完整性怎么保证」,比纠结用AES还是SM4重要得多。