第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)、密钥交换、证书签发。比如银行的电子回单签名、电子票据验证。
避坑指南:SM2 的公钥长度是 64 字节(未压缩),签名长度是 64 字节。相比 ECDSA,它的签名效率稍低,但安全性等价于 256 位椭圆曲线,比 2048 位 RSA 快得多。

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 适合内网可控环境,慎用于公网系统。

小贴士:SM9 在 2021 年已经被纳入 ISO/IEC 18033-5 国际标准,相当于获得了国际认可。在工业互联网标识解析场景中,SM9 的免证书特性大大降低了管理成本。

1.6 知识结构图:国密算法全景

国密算法知识体系 国密算法 SM2 公钥密码 SM3 哈希算法 SM4 对称密码 SM9 标识密码 签名/密钥交换 证书签发 消息摘要 完整性校验 数据加密 通信加密 身份认证 密钥分发 说明: SM2/SM3 常组合使用(签名哈希);SM4 用于数据加密; SM9 免证书设计适合物联网/内部系统。

1.7 选型实战:你到底该用哪个?

我在项目中见过最离谱的是:一个存内部日志的系统居然强推 SM9 签名,结果密钥托管问题把运维逼疯。所以这里给你一个简单的选型参考表:

需求 推荐算法 理由
HTTPS 通信加密 SM2 + SM4(国密 TLS) 标准套件,浏览器兼容性最好
电子合同签名 SM2 + SM3 法律效验要求国密签名
数据库字段加密 SM4(CBC/CTR) 性能高,支持范围查询(需配合保留格式)
物联网设备认证 SM9 或 SM2 证书 SM9 免证书,SM2 更成熟
日志完整性 SM3 简单高效,防篡改
我的建议:如果团队国密经验不足,先上 SM2+SM4+SM3 铁三角,等跑顺了再考虑 SM9。别一上来就上最复杂的,容易翻车。

1.8 合规检查清单——做对每一步

最后,给出一份合规落地时的自检清单。我吃过太多没做清单的亏了:

  1. 算法证书:确认使用的国密实现是否通过国密局检测(具有型号证书)?
  2. 密钥管理:SM2 密钥对是否安全生成?私钥是否加密存储?是否使用硬件安全模块(HSM)?
  3. 模式合规:SM4 是否只用了 NIST 标准的加密模式?国密规范不允许用 OFB 模式。
  4. 互操作性验证:不同厂商的国密实现能否互相签名/验签?我曾见过 A 厂签名 B 厂验不过的坑。
  5. 日志审计:所有密钥操作(生成、导入、导出、销毁)必须记录不可篡改的日志。