第2章 国密算法基础:SM2、SM3、SM4 原理与应用场景
国密算法,说白了就是咱们国家自己的密码算法标准。搞 TLS 国密套件,这三兄弟是躲不开的——SM2 非对称加密、SM3 哈希、SM4 对称加密。我刚开始接触时也觉得有点乱,但拆开来理解,每个角色都很清晰。
这节课咱们不扯虚的,直接讲清楚「它是什么」「怎么用」「有什么坑」。我会结合自己在项目里踩过的雷,帮你少走弯路。
2.1 SM2:椭圆曲线非对称加密
SM2 本质上就是 ECC(椭圆曲线密码学)的一种国家标准实现。它比 RSA 更省带宽、算得更快。我个人习惯在需要数字签名和密钥交换的场景里优先选 SM2。
基本原理
SM2 基于椭圆曲线上的离散对数难题。它定义了一条标准曲线(参数固定),使用公钥和私钥对。加解密过程你想想看,公钥加密只能由私钥解密,签名验证恰好相反。
核心操作
- 密钥生成:随机选取私钥 d,计算公钥 P = d * G(G 为基点)。
- 加密:使用接收方公钥 P,通过 KDF 派生出对称密钥,再加密数据。
- 解密:使用接收方私钥 d,还原对称密钥并解密。
- 签名:私钥签名,公钥验证。
应用场景
| 场景 | 说明 |
|---|---|
| 数字签名 | 身份认证、不可否认性,比如证书签名、电子合同 |
| 密钥交换 | TLS 握手中的 ECDHE 国密变种,协商对称密钥 |
| 加密通信 | 小数据量加密(配合 SM4 做混合加密) |
2.2 SM3:密码哈希函数
SM3 类似于 SHA-256,输出固定 256 位(32 字节)摘要。我曾经在日志完整性校验中用过它,速度比 SHA-256 略慢但还在可接受范围。
为什么需要 SM3?
哈希函数在国密体系里承担三件事:
- 消息摘要——验证数据完整性。
- 数字签名中的哈希——先对消息做 SM3 摘要,再对摘要做 SM2 签名。
- 密码派生——比如 TLS 国密套件里的 PRF 函数会用到 SM3。
SM3 与其他哈希对比
| 算法 | 输出长度 | 性能(相对) | 国密合规 |
|---|---|---|---|
| SM3 | 256 bit | 中等 | 是 |
| SHA-256 | 256 bit | 稍快 | 否 |
| MD5 | 128 bit | 快(但不安全) | 否 |
2.3 SM4:对称分组加密
SM4 是国标对称加密算法,分组长度 128 位,密钥长度 128 位。说白了跟 AES 对标——但它有自己的一套轮函数和 S 盒。我在做数据库字段加密时用过 SM4-CBC,配合 PKCS7 填充很顺滑。
SM4 的几种模式
- ECB:简单但不安全(相同明文分组得到相同密文),尽量别用。
- CBC:需要 IV,安全性好,我最常用。
- GCM:认证加密模式,同时提供机密性和完整性,TLS 里主要用这个。
- CTR:可并行计算,适合流式数据。
一句话总结三者的角色:
SM2 负责建立信任(密钥交换、签名),SM3 验证完整性,SM4 高效加密数据。在 TLS 国密套件里,它们组合成一套完整的机密性+完整性+身份认证方案。
2.4 三者之间的关系图
下面这张图帮你理清国密三宝在 TLS 里怎么配合的:
2.5 实战中的注意事项
- SM2 签名前一定要用 SM3 做哈希,别混用其他算法。
- SM4 密钥不要硬编码在代码里,通过 SM2 密钥交换安全分发。
- SM3 校验最好加上时间戳或随机数,防止重放攻击。
我曾经犯过的错:
在做一个金融报文系统时,我直接拿 SM2 公钥加密大文件,结果性能惨不忍睹。后来改成「SM2 加密一次性对称密钥 + SM4 加密文件主体」,速度提了几十倍。记住,非对称加密适合小数据,大数据必须混合加密。
好了,这一章就讲这些。理解了三者的定位和配合逻辑,后面看到 TLS 国密套件的密码套件字符串(比如 ECC-SM2-SM4-GCM-SM3)就不会懵了。