对称加密算法:AES、DES原理及实现
对称加密,你肯定听说过。说白了,就是加密和解密用同一把钥匙。就像你用一把锁锁门,又用同一把钥匙开门一样,简单直接。
这个领域里,有两个绕不开的名字:DES和AES。DES是前辈,AES是当下的王者。我刚开始搞安全那会儿,还踩过DES的坑。今天咱们就把这两兄弟彻底聊透。
从DES说起——数据加密标准
DES(Data Encryption Standard)诞生于1977年。那时候计算机性能还差得远,64位块、56位密钥,在当时看来已经很安全了。
DES的核心结构
DES是一种分组密码。什么意思?就是把明文切成64位一组,一组一组地加密。整个流程分为三个大阶段:
- 初始置换(IP):把64位数据按固定规则重新排列
- 16轮Feistel结构迭代:核心加密步骤,重复16次
- 逆初始置换(IP⁻¹):还原数据顺序,得到密文
每轮Feistel网络做的事其实很规律:
- 把数据分成左半32位、右半32位
- 右半经过扩展置换变成48位,再和48位子密钥做异或
- 然后送入8个S盒,得到32位输出
- 最后和左半异或,交换位置进下一轮
DES密钥的生成
56位主密钥通过置换和循环移位,每轮生成一个48位子密钥。注意,密钥本身也有奇偶校验位,实际有效长度只有56位。
AES——现代加密的基石
DES太老了,NIST在1997年公开征集新标准。2001年,Rijndael算法胜出,正式成为AES。
AES为什么更牛?
说实话,我刚入行时也分不清AES和DES到底差在哪。后来自己动手实现了一遍,才算彻底明白了。
- 块大小:固定128位,比DES的64位翻了一倍
- 密钥长度:支持128、192、256位,安全性按需选择
- 结构:不是Feistel,而是SPN(Substitution-Permutation Network)
SPN结构的好处是啥?你想想看,Feistel网络一轮只更新一半数据,而SPN在每一轮都会完整处理全部128位。扩散效果更好,混淆也更充分。
我个人习惯,在项目里新系统一律用AES-256。虽然计算量稍大一点,但安全性多了一层保障,值得。
AES加密流程
AES加密分为四个关键步骤,每轮都会重复执行(除最后一轮少一步MixColumns):
- SubBytes(字节代换):通过S盒对每个字节做非线性替换
- ShiftRows(行移位):对状态矩阵的行做循环左移
- MixColumns(列混合):对状态矩阵的列做矩阵乘法,实现扩散
- AddRoundKey(轮密钥加):和本轮子密钥做异或
AES-128共10轮,AES-192共12轮,AES-256共14轮。轮数越多,抗攻击能力越强。
AES vs DES:一张表看懂差异
| 对比维度 | DES | AES |
|---|---|---|
| 分组大小 | 64位 | 128位 |
| 密钥长度 | 56位 | 128 / 192 / 256位 |
| 网络结构 | Feistel | SPN |
| 轮数 | 16轮 | 10 / 12 / 14轮 |
| 实现难度 | 软硬件都容易 | 软硬件都高效 |
| 当前安全性 | 已不安全 | 足够安全 |
代码实现:用Python跑一个AES示例
我通常用Python的 pycryptodome 库来演示AES。当然,生产环境建议用更成熟的库,但学习阶段自己实现一遍很有帮助。
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
# 生成随机密钥和初始向量
key = get_random_bytes(32) # AES-256 密钥
iv = get_random_bytes(16) # CBC模式需要IV
# 待加密数据(必须是16字节的倍数)
plaintext = b"Hello AES World!!!"
# 加密
cipher = AES.new(key, AES.MODE_CBC, iv)
ciphertext = cipher.encrypt(plaintext)
print("密文(十六进制):", ciphertext.hex())
# 解密
decipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = decipher.decrypt(ciphertext)
print("解密后:", decrypted.decode())
常用工作模式
AES和DES都支持多种工作模式。我挑几个最常用的说说:
- ECB(电子密码本):每块独立加密。简单,但不安全。相同的明文块会产生相同的密文块,容易被分析。我建议除非是玩具项目,否则别用。
- CBC(密码分组链接):每个明文块先和前一个密文块异或,再加密。需要初始向量IV。安全性比ECB好很多,是目前使用最广泛的模式。
- CTR(计数器):用计数器生成密钥流,再和明文异或。可以并行加解密,效率高。适合流式数据或高吞吐场景。
- GCM(伽罗华/计数器模式):在CTR基础上加了认证标签,保证数据完整性和真实性。我新项目里基本只用GCM了,一次搞定加密+认证。
避坑指南
选择对称加密算法时,我的建议很简单:
- 新系统直接用AES-256,密钥长度不要妥协
- 开启GCM或CCM模式,附加认证标签
- 彻底放弃DES和3DES,它们已经是过去式了
- 密钥管理别写死在代码里,用专门的密钥管理系统或硬件安全模块
对称加密是整个加密世界的基础。理解AES和DES,就像打地基。后面的令牌化方案也好,混合加密也罢,都离不开这两块基石。脚踏实地,把这里弄透,后面的路就好走了。