《对称加密、非对称加密与哈希算法》
加密算法是保障数据传输与存储安全的基石。按加密与解密使用的密钥关系,可以分为对称加密与非对称加密;此外还有哈希算法(单向散列)用于完整性校验与密码存储。
1 对称加密(Symmetric-key algorithm)
定义:对称加密又称私钥加密、共享密钥加密。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单相互推算的密钥。这组密钥成为两个或多个成员之间的共同秘密,以维持专属的通讯联系。
常见算法:AES、DES、3DES、Blowfish、IDEA、RC5、RC6。
特点:加密解密效率高、速度快,适合大数据量的加解密。主要缺点是密钥分发困难——双方必须提前取得相同的密钥。
2 非对称加密(Public-key cryptography)
定义:非对称加密也叫公开密钥加密,需要一对密钥:公钥和私钥。这两个密钥数学相关,用其中一个密钥加密所得的信息,只能用另一个密钥解密;知道其中一个并不能推导出另一个。因此公开公钥不会危害私钥的安全。
常见算法:RSA、ECC、DSA。
特点:算法复杂、加解密速度慢,但安全性高。实际应用中通常与对称加密结合使用——对内容使用对称加密,对密钥使用非对称加密(hybrid encryption)。
3 哈希加密(单向散列)
哈希算法应用于密码学领域时,将任意长度的消息输入,经过某种哈希函数迭代压缩,生成固定长度的「消息摘要」(Message Digest)。
哈希算法的特性:
- 哈希是一种单向密码体制:只有加密过程,没有解密过程;
- 相同输入经过同一哈希函数得到相同散列值;但散列值相同不代表输入相同(哈希碰撞);
- 每种算法根据初始化参数生成固定长度的摘要,如 SHA-256 生成 256 位摘要,长度越长安全性越高。
哈希加密算法的过程:
- 预处理(Preprocessing):消息填充、将消息分割成 m 个处理块、设置比哈希初始值;
- 哈希计算(Hash Computation):利用哈希函数和相关常数,将预处理后的数据生成消息摘要。
常见哈希算法:MD5、SHA-1、SHA-2、SHA-256、SHA-X(系列)。
哈希加盐(salt):在密码中加入一段随机字符串后再做哈希,显著提高针对彩虹表的破解难度。
4 各类算法性能对比
4.1 散列算法
| 名称 | 安全性 | 速度 |
|---|---|---|
| SHA-1 | 高 | 慢 |
| MD5 | 中 | 快 |
4.2 对称加密算法
| 名称 | 密钥长度 | 运行速度 | 安全性 | 资源消耗 |
|---|---|---|---|---|
| DES | 56 位 | 较快 | 低 | 中 |
| 3DES | 112 或 168 位 | 慢 | 中 | 高 |
| AES | 128 / 192 / 256 位 | 快 | 高 | 低 |
4.3 非对称加密算法
| 名称 | 成熟度 | 安全性 | 运行速度 | 资源消耗 |
|---|---|---|---|---|
| RSA | 高 | 高 | 中 | 中 |
| ECC | 高 | 高 | 慢 | 高 |
5 AES vs RSA
- AES(对称加密):速度快,适合加密大量数据;密钥需安全分发;
- RSA(非对称加密):用于加密密钥、数字签名等小数据;每个密钥对绑定一个实体,支持身份认证。
常见组合:HTTPS 中先用 RSA 协议协商并交换 会话密钥,再用 AES 加密实际的业务流量,兼顾安全性与性能。
6 AES 加密运算与性能
AES 的加密操作涉及 4 种操作:字节代替(SubBytes)、行移位(ShiftRows)、列混淆(MixColumn)、轮密钥加(AddRoundKey)。解密过程正好相反。每轮的轮密钥由初始密钥扩展得到,所有操作均以字节为基础。
几个术语:
- 状态(state):密码运算的中间结果,以 4 行矩阵表示,列数记为
Nb; - 密钥(Cipher Key):类似地用 4 行矩阵表示,列数记为
Nk; - Nb:分组长度 / 32,可取 4、6、8,对应分组长度 128、192、256 bit;
- Nk:密钥长度 / 32,可取 4、6、8,对应密钥长度 128、192、256 bit;
- Nr:对一个分组加密的轮数;主循环执行
(Nr-1)轮迭代,最后一轮省略列混淆。
AES 相关参数:
| 名称 | 密钥长度(bits) | 明文分组长度(bits) | 轮数 | 每轮密钥长度(bits) | 扩展密钥长度(bytes) | 可能的组合数量 |
|---|---|---|---|---|---|---|
| AES-128 | 128 | 128 | 10 | 128 | 176 | 3.4×10^38 |
| AES-192 | 192 | 128 | 12 | 128 | 206 | 6.2×10^57 |
| AES-256 | 256 | 128 | 14 | 128 | 240 | 1.1×10^77 |
AES-128 与 AES-256 的主要区别是密钥长度(128 vs 256 bits)和加密处理轮数(10 vs 14 轮),后者强度高于前者。目前 AES 是公认较为安全的对称加密算法。
实测中 10 万次 AES-128 / AES-192 / AES-256 加解密耗时差异较小(0.3s 左右),密钥更长带来的性能损失在大多数场景可接受。
7 跨语言 AES 密文交互
不同编程语言(Lua、Go、Python 等)之间做 AES 密文交互时,最容易踩坑的是参数不一致:
- 加密模式:CBC / ECB / CTR / GCM 必须一致;
- 填充方式:PKCS5 / PKCS7 / ZeroPadding 必须一致;
- 密钥与 IV 的编码:base64 / hex;
- 密钥长度:128 / 192 / 256 必须一致。
参考实现:
8 面试常考点
- 对称加密 vs 非对称加密的区别与使用场景;
- HTTPS 中证书、对称与非对称加密、数字签名如何配合;
- 为什么密码存储要加盐哈希而不是明文或 MD5;
- AES 的 ECB / CBC 模式差别(CBC 需要 IV,且 IV 不能重复使用);
- 哈希算法为什么不可逆,以及「加盐 + 慢哈希(如 bcrypt / scrypt)」的意义。