第1章 国密算法概述:SM2/SM3/SM4/SM9 从原理到落地
大家好,我是这门课的主讲。做了十几年的密码工程,从最早的 OpenSSL 插件到后来用 Go 实现国密网关,我算是跟国密算法“死磕”上了。今天咱们先聊聊国密算法的全景——你可能会问,“国密到底指什么?跟 RSA、AES 有什么区别?”别急,咱们慢慢拆开看。
1.1 国标与合规:为什么必须上国密?
国密算法,全称是中国国家密码管理局发布的商用密码算法标准。包括 SM2(椭圆曲线公钥密码)、SM3(密码杂凑)、SM4(分组对称密码)、SM9(基于标识的密码)四大金刚。说白了,就是咱们自己的一套“密码工具箱”。
合规要求——这是很多企业上国密的直接动力。根据《密码法》和《商用密码管理条例》,涉及国家安全和公共利益的网络系统,必须使用国密算法进行保护。比如政府云平台、金融核心交易、能源调度系统……我一个做政务系统的朋友,就因为没用 SM2 签名被评审打回,硬生生多花了两个月改代码。
1.2 SM2:椭圆曲线公钥密码的“国产替身”
SM2 对标的是 ECDSA 和 ECDH,但曲线参数和签名流程都是独立的。我个人习惯把它看作“更安全的 ECC”——它的素数阶椭圆曲线参数经过优化,能够抵抗一些已知的攻击。
- 原理:基于椭圆曲线离散对数难题(ECDLP)。签名过程包括预处理、签名生成和验证三步。核心公式不展开了,但记住一条——SM2 签名需要随机数 k,这个随机数如果泄漏,私钥就没了。我曾经在项目中遇到 developer 为了省性能,把 k 固定成常数,结果上线前被安全测试直接打穿。
- 应用场景:数字签名(SM2-with-SM3)、密钥交换、证书签发。比如银行的电子回单签名、电子票据验证。
1.3 SM3:密码杂凑算法的“哈希之星”
SM3 是国密哈希标准,输出 256 位(32 字节)摘要。它跟 SHA-256 结构相似,但消息扩展和压缩函数不同。我记得第一次看 SM3 的官方文档时,被它的“消息字符扩展”部分绕晕了——后来用 Python 写了个纯软件实现,才彻底搞懂。
SM3 的应用范围非常广:
- 数字签名(配合 SM2 使用)
- 完整性校验(文件哈希、日志摘要)
- 密码存储(别再用 MD5 了,SM3 更安全)
实话实说,SM3 的软件性能比 SHA-256 慢大约 10%~20%,但在硬件加速下差距几乎为零。如果你的系统已经上了 SM2,那默认就用 SM3 做哈希,别混用。
1.4 SM4:对称密码的“国密 AES”
SM4 是 128 位分组对称密码,密钥长度也是 128 位。它跟 AES 的结构完全不同——采用 32 轮非线性迭代 Feistel 结构,S 盒是自定义的。我个人觉得 SM4 的软件实现比 AES 更容易写出无分支的常数时间代码,适合防侧信道攻击。
| 特性 | SM4 | AES-128 |
|---|---|---|
| 分组长度 | 128 位 | 128 位 |
| 密钥长度 | 128 位 | 128/192/256 位 |
| 轮数 | 32 轮 | 10/12/14 轮 |
| 软件性能 | 约 0.8~1.0 cycles/byte | 约 0.6~0.8 cycles/byte |
应用场景:数据加密(文件、数据库字段)、通信链路加密(VPN、TLS 国密套件)。注意 SM4 的加密模式(ECB、CBC、CTR 等)跟 AES 一样,但初始向量和 padding 的处理要注意国密规范的特殊要求——比如 PKCS#7 padding 在国密里必须每字节都填充相同值。
1.5 SM9:基于标识的密码(IBC)——免证书的“黑科技”
SM9 是国密中最“年轻”也最有潜力的算法。它不需要数字证书,直接用用户标识(如邮箱、手机号)作为公钥。原理基于双线性对(Weil 对/ Tate 对)。
你可能觉得这很炫酷,但我必须提醒你:SM9 的密钥生成中心(KGC)拥有用户私钥,存在“密钥托管”风险。我参与过一个物联网项目,客户非要上 SM9 做设备身份认证,结果 KGC 被攻破直接导致瘫痪。所以 SM9 适合内网可控环境,慎用于公网系统。
1.6 知识结构图:国密算法全景
1.7 选型实战:你到底该用哪个?
我在项目中见过最离谱的是:一个存内部日志的系统居然强推 SM9 签名,结果密钥托管问题把运维逼疯。所以这里给你一个简单的选型参考表:
| 需求 | 推荐算法 | 理由 |
|---|---|---|
| HTTPS 通信加密 | SM2 + SM4(国密 TLS) | 标准套件,浏览器兼容性最好 |
| 电子合同签名 | SM2 + SM3 | 法律效验要求国密签名 |
| 数据库字段加密 | SM4(CBC/CTR) | 性能高,支持范围查询(需配合保留格式) |
| 物联网设备认证 | SM9 或 SM2 证书 | SM9 免证书,SM2 更成熟 |
| 日志完整性 | SM3 | 简单高效,防篡改 |
1.8 合规检查清单——做对每一步
最后,给出一份合规落地时的自检清单。我吃过太多没做清单的亏了:
- 算法证书:确认使用的国密实现是否通过国密局检测(具有型号证书)?
- 密钥管理:SM2 密钥对是否安全生成?私钥是否加密存储?是否使用硬件安全模块(HSM)?
- 模式合规:SM4 是否只用了 NIST 标准的加密模式?国密规范不允许用 OFB 模式。
- 互操作性验证:不同厂商的国密实现能否互相签名/验签?我曾见过 A 厂签名 B 厂验不过的坑。
- 日志审计:所有密钥操作(生成、导入、导出、销毁)必须记录不可篡改的日志。