国密算法概述:SM2/SM3 算法背景、国家标准、应用场景
为什么我们需要国密?
说起国密,很多人第一反应是「合规」。没错,但这只是表面。说白了,国际算法(RSA、ECDSA、SHA‑256)的底层参数完全由国外机构掌控,一旦出现黑盒后门或被禁运,整个国家的数字基础设施都会瘫痪。我亲身经历过一个金融项目,客户突然要求把所有 RSA 签名换成 SM2,因为监管审计发现老系统不满足等保三级。当时真是手忙脚乱——库没适配、密钥格式要重写、证书也得换。所以国密不是选择题,是必答题。
国家密码管理局在 2010 年前后密集发布了一系列商用密码标准,其中 SM2 和 SM3 是两大核心支柱。它们分别对标 RSA/ECDSA 和 SHA‑256,但从算法设计到密钥长度都做了自主优化。
| 算法 | 类型 | 对标国际算法 | 标准号 | 密钥/输出长度 |
|---|---|---|---|---|
| SM2 | 公钥密码 | RSA(密钥交换/加密)、ECDSA(签名) | GM/T 0003‑2012 | 256 比特 |
| SM3 | 密码杂凑 | SHA‑256 | GM/T 0004‑2012 | 256 比特 |
关键点:SM2 的椭圆曲线参数是独立设计的,不是 NIST 曲线的简单翻版。SM3 的结构基于 Merkle–Damgård,但压缩函数和消息扩展都做了改动。你想想看,如果直接照搬国际算法,那还叫什么「国产」?
SM2 算法:不止是签名
SM2 是一个完整的公钥密码体系,涵盖三个子功能:数字签名、密钥交换和公钥加密。我早期做 SDK 适配时,经常看到有人只用 SM2 做签名,却忽略了它的加密能力——其实 SM2 加密在传输层也很实用。
国家标准 GM/T 0003‑2012 定义了 SM2 的椭圆曲线参数(素数域 256 位)、密钥生成、数字签名算法(SM2‑DSA)、密钥协商协议(SM2‑KE)和加密算法(SM2‑ECIES)。应用场景非常明确:
- 身份认证:数字证书、电子签章
- 数据加密:端到端加密、PKI 体系
- 密钥交换:TLS 握手、VPN 通道
我个人习惯:做适配时把 SM2 的签名密钥和加密密钥分开管理。虽然算法复用同一套曲线,但密钥用途不可混用——我曾经见过有人拿加密密钥去签名,结果验签失败还查了半天。
SM3 算法:国密版的 SHA‑256
SM3 是密码杂凑算法,输出 256 比特。结构上和 SHA‑256 类似,但压缩函数的操作数、移位量、常数都不一样。我测试过两者的抗碰撞性——目前都没有公开有效攻击,安全等级一致。
标准编号 GM/T 0004‑2012。典型应用:
- 数字签名中的消息摘要(配合 SM2)
- HMAC 消息认证码
- 文件完整性校验(比如国密版 shasum)
- 随机数生成
| 特性 | SM3 | SHA‑256 |
|---|---|---|
| 消息分组长度 | 512 比特 | 512 比特 |
| 字长 | 32 比特 | 32 比特 |
| 压缩轮数 | 64 | 64 |
| 初始化向量 | 自定义 8 个常数 | NSA 定义的 8 个常数 |
| 扩展函数 | 16 字 → 68 字 | 16 字 → 64 字 |
注意:SM3 的硬件指令集还不像 SHA‑256 那样普及。我在嵌入式平台上移植时,纯软件实现每秒只能处理几十 KB,后来用了 ARM NEON 做优化才勉强够用。如果你的项目对性能敏感,需要提前评估。
应用场景:从政务到金融
国密算法已经渗透到几乎所有关键领域。我接触过的典型场景:
- 电子政务:税务、社保、工商登记系统的数字签名
- 金融:网银 U 盾、手机银行交易校验、证券报单
- 物联网:智能电表、车联网的认证和通信加密
- 密码机:服务器密码机、签名验签服务器
每类场景的合规要求不同。比如金融领域必须过《金融电子认证管理办法》,而政务系统要满足《电子签名法》。说白了,你只把算法从 RSA 换成 SM2 还不够,整个证书链、密钥管理、HSM 接口都得跟着改。
避坑指南:我曾经在适配某国产操作系统时,发现系统自带的 OpenSSL 不支持 SM2/SM3,需要自己编译。但编译时链接的 GMP 库版本不对,导致 SM2 签名一直报错。后来发现是椭圆曲线点乘依赖了未定义符号。教训:库的依赖链和最小版本一定要列清楚。
知识体系一图清
下面这张图帮你串起 SM2 和 SM3 在国密体系中的位置、标准、功能和对标关系。看一眼就能定位到你现在关心的是什么。
小结
这一章我们只聊了背景和轮廓。SM2 的椭圆曲线参数长什么样?SM3 的压缩函数如何计算?这些细节后面会逐一拆解。不过你放心,我会一直在旁边用项目里的真实坑给你提个醒。国密适配没有想象中那么难,但每一步都得踩实。