1. 国密算法综述:SM2/SM3/SM4/SM9 简介、国密标准与商用密码应用场景
做 Go 国密 SDK 适配之前,咱们得先搞清楚「国密」到底是个啥。我最开始接触国密时,说实话有点懵——SM2、SM3、SM4、SM9,一堆字母数字,容易搞混。后来实际对接过几个项目,踩了些坑,才慢慢理清脉络。
1.1 SM2:非对称加密与数字签名
SM2 是国密标准里的椭圆曲线公钥密码算法,对标的是 ECDSA 和 ECDH。说白了,它既能做签名验签,也能做密钥交换和加密。
我记得第一次用 SM2 时,一直在纠结曲线参数。国密 SM2 推荐了一条 256 位的素域椭圆曲线,参数是固定的——p = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF。你不需要自己算,直接用标准库就行,但得注意:公钥压缩格式和未压缩格式,很多商用接口只认未压缩的。
- 签名算法:SM2 签名基于 ECDSA 变种,输出是 (r, s) 两个大数,编码成 64 字节。
- 加密算法:混合加密(用 SM2 密钥协商 + SM4 对称加密)。
- 密钥交换:支持双向认证和会话密钥生成。
1.2 SM3:密码杂凑算法
SM3 就是国标的 SHA-256——输出 256 位(32 字节)的摘要。我自己测试过,SM3 的速度和 SHA-256 差不多,但安全性设计上多了些防御手段。
SM3 主要用在数字签名(SM2)、消息认证码、随机数生成等场景。你在 Go 里调用 sm3.Sum() 就可以,但要注意国密规范里的字节序(大端)。
1.3 SM4:对称分组密码
SM4 是我们常用的对称加密算法,分组长度 128 位,密钥长度 128 位。它的 S 盒和密钥扩展算法跟 AES 差异很大。我平时做数据库加密、文件加密时首选 SM4——效率高,且国产化合规。
- 工作模式:ECB、CBC、CTR、GCM 等都支持,推荐用 GCM 模式(带认证)。
- 密钥长度固定:16 字节,不能多不能少。
- 白盒实现:如果做移动端防护,可能需要用白盒 SM4,但那是另一个话题。
1.4 SM9:基于标识的密码算法
SM9 就比较特殊了——它不需要证书,直接用用户的标识(比如手机号、邮箱)作为公钥。底层依赖双线性对(椭圆曲线上的配对运算)。说实话,SM9 的数学比 SM2 复杂很多,我刚开始看规范时头都大了。
SM9 支持签名、密钥交换和加密。它的优势在于去掉了证书管理,很适合 IoT、无服务器场景。但计算开销较大,目前商用落地不如 SM2/SM4 多。
| 算法 | 类别 | 输出/密钥长度 | 对标国际算法 | 常见场景 |
|---|---|---|---|---|
| SM2 | 非对称 | 256 位密钥 | ECDSA / ECDH | 签名、加密、密钥交换 |
| SM3 | 杂凑 | 256 位摘要 | SHA-256 | 数字签名、完整性校验 |
| SM4 | 对称 | 128 位密钥 | AES-128 | 数据加密、通信加密 |
| SM9 | 非对称(基于标识) | 256 位(标识公钥) | (无直接对标) | 无证书签名、加密 |
1.5 国密标准体系与应用场景
国密标准不是一张白纸。咱们国内有几个关键标准号要记住:
- GB/T 32918 – SM2
- GB/T 32905 – SM3
- GB/T 32907 – SM4
- GM/T 0044 – SM9
- GB/T 35276 – 密码算法应用接口规范
在商用密码应用场景上,我归纳了三大类:
- 政务与金融:网上银行、电子印章、CA 证书——基本都是 SM2 + SM3 + SM4 铁三角。
- 通信与物联网:VPN 网关、5G SIM 卡、车联网——常用 SM4 做流加密,SM9 用于轻量级身份认证。
- 云与数据安全:数据库加密、对象存储加密、密码机——SM4 硬件加速后性能很好。