国密算法SM2/SM3/SM4技术入门与实战指南
约 3700 字 | 商用密码 / 国密合规 | 2026-07
为什么要学国密?
2020年1月1日《中华人民共和国密码法》正式实施,商用密码的推广从"建议"变成了"要求"。等保2.0(网络安全等级保护制度2.0)明确规定:三级及以上信息系统应采用密码技术保障数据安全,关键信息基础设施应优先使用国产密码算法。金融行业更是走在前面——人民银行要求2027年前完成金融IC卡和POS终端的国密改造。
SM(ShangMi,商密)系列算法由中国国家密码管理局发布,是被写入国际标准的中国密码体系。其中SM2、SM3、SM4是最核心、应用最广的三个。对智能卡工程师来说,它们是"新的基本功"——就像十年前每个做支付的人都要会 RSA/3DES/SHA-1。
国密算法家族一览
| 算法 | 类型 | 对标国际 | 密钥/输出长度 | 安全强度 | 状态 |
|---|---|---|---|---|---|
| SM1 | 分组对称加密 | AES | 128 bits | 等同于 AES-128 | 未公开 |
| SM2 | 椭圆曲线公钥密码 | ECDSA/ECDH (P-256) | 私钥 256 bits | ≥ RSA-3072 | ISO/IEC 14888-3 |
| SM3 | 密码杂凑(哈希) | SHA-256 | 256 bits | 抗碰撞 | ISO/IEC 10118-3 |
| SM4 | 分组对称加密 | AES-128 | 128 bits | 等同于 AES-128 | ISO/IEC 18033-3 |
| SM7 | 轻量级对称加密 | PRESENT | 128 bits | 中 | 非接触式IC卡 |
| SM9 | 基于标识的公钥密码 | IBC (Boneh-Franklin) | 私钥 256 bits | ≥ RSA-3072 | ISO/IEC 14888-3 |
| ZUC | 序列密码(流加密) | SNOW 3G | 128 bits | 中高 | 4G/5G 通信 |
SM2 — 椭圆曲线公钥密码
数学基础
SM2 基于椭圆曲线 y² = x³ + ax + b (mod p),使用国家密码管理局推荐的 256 位素数域曲线 sm2p256v1。与 NIST P-256 相比,SM2 的曲线参数不同,但安全强度相当——都是 128 位安全级别。
| 参数 | SM2 (sm2p256v1) | NIST P-256 |
|---|---|---|
| 素数 p | FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF | 同上(巧合) |
| 系数 a | FFFFFFFE FFFFFFFF ... FFFFFFFC | FFFFFFFF 00000001 ... FFFFFFFC |
| 系数 b | SM2 自有值 | NIST 自有值 |
| 基点阶 n | FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123 | 不同 |
| 国际标准 | ISO/IEC 14888-3:2018 | FIPS 186-4 |
SM2 三大功能
1. 数字签名(对标 ECDSA)
SM2 签名算法基于 SM3 哈希,签名结果为 (r, s),各 32 字节。流程:
- 签名:ZA=SM3(用户标识+曲线参数) → e=SM3(ZA‖消息) → 随机数k → 计算(x,y)=k*G → r=(e+x) mod n → s=((1+私钥)⁻¹·(k-r·私钥)) mod n
- 验签:验证方用公钥重算并比对 r
与 ECDSA 的关键区别:SM2 的签名公式里有 ZA(用户标识的哈希),也就是说SM2 签名绑定了签名者的身份——这在法律认可和审计追溯场景中非常有用。
2. 密钥交换(对标 ECDH)
SM2 密钥交换协议是一个三回合协议,支持双向密钥确认。输出一个 128 位的共享密钥,可用于后续的 SM4 对称加密会话。
3. 公钥加密(对标 ECIES)
SM2 加密输出 C1‖C2‖C3 三部分:C1 是椭圆曲线点(64 字节)、C2 是密文(与明文等长)、C3 是 SM3 哈希(32 字节)。总开销 = 明文 + 96 字节。
SM3 — 密码杂凑算法
算法结构
SM3 采用 Merkle-Damgård 结构,消息分组 512 bits(64 字节),输出 256 bits(32 字节)。处理流程:消息填充 → 消息扩展 → 迭代压缩 → 输出 256 位哈希值。
SM3 的设计与 SHA-256 同源(都借鉴了 MD5/SHA-1 的迭代结构),但在消息扩展和压缩函数中加入了额外的扩散混合——这使得 SM3 在部分安全性指标上略优于 SHA-256,例如抗长度扩展攻击。
SM3 与 SHA-256 对比
| 特性 | SM3 | SHA-256 |
|---|---|---|
| 输出长度 | 256 bits | 256 bits |
| 分组大小 | 512 bits | 512 bits |
| 压缩轮数 | 64 轮 | 64 轮 |
| 消息扩展 | W₀...W₆₇ + W'₀...W'₆₃ (132 个字) | W₀...W₆₃ (64 个字) |
| 字节序 | 大端序(Big-Endian) | 大端序(Big-Endian) |
| 国际标准 | ISO/IEC 10118-3:2018 | FIPS 180-4 |
| 硬件效率 | 约 15K 等效门(ASIC) | 约 12K 等效门 |
SM3 已在智能卡芯片中广泛实现。银行卡的脱机数据认证中,SM3 可用于替代 SHA-1 对静态/动态数据进行哈希。在 Hash 在线计算器中可以体验 SM3 的输出。
SM4 — 分组对称加密
算法参数
| 参数 | SM4 | AES-128 |
|---|---|---|
| 分组长度 | 128 bits (16 bytes) | 128 bits |
| 密钥长度 | 128 bits (16 bytes) | 128 bits |
| 轮数 | 32 轮 | 10 轮 |
| S 盒 | 8×8 非线性置换(固定) | 8×8 非线性置换(基于 GF(2⁸) 逆元) |
| 结构 | 非平衡 Feistel 网络 | SPN(代换-置换网络) |
| 工作模式 | ECB/CBC/CFB/OFB/CTR/GCM | 同左 |
| 国际标准 | ISO/IEC 18033-3:2010 | FIPS 197 |
| ASIC 面积 | 约 3K~5K 等效门 | 约 3K~4K 等效门 |
SM4 采用非平衡 Feistel 结构(32 轮),比 AES 的 10 轮多得多。这不是因为 SM4 的每轮更弱——恰恰相反,Feistel 网络里每轮的扩散程度不如 SPN,所以需要更多轮来达到同等的混淆和扩散效果。
一个典型的 SM4-CBC 加密场景:
密钥: 0123456789ABCDEF FEDCBA9876543210 (16 bytes, 两端均可)
IV: 0000000000000000 0000000000000000 (16 bytes, 全零)
明文: "国密算法SM4加密测试" (UTF-8 编码)
密文: (使用 AES/SM4 对称加密工具可在线计算)
等保 2.0 与密码法的合规要求
对于智能卡行业的工程师,以下三条是最需要知道的合规事实:
- 等保三级及以上系统"应"采用密码技术——这里的"应"是强制要求。密码技术包括身份鉴别、访问控制、数据传输加密、数据存储加密、安全审计日志保护。
- 关键信息基础设施运营者(CIIO)"应当"使用商用密码——金融、能源、交通、政务等领域的企业必须推进国密改造。时间紧。
- 密码产品必须取得认证——商用密码产品(含金融IC卡、POS终端、密码键盘)需要通过国家密码管理局的检测认证才能上市销售。
金融国密改造路线图
人民银行在金融科技发展规划中明确:
- 2025年:新增金融IC卡全面支持 SM2/SM3/SM4
- 2027年:存量金融IC卡和终端完成国密算法迁移
- 中长期:金融领域核心系统由国际算法为主 → 国际+国密并存 → 国密为主
这意味着未来 5 年内,中国所有智能卡相关产品都需要完成双算法(国际 + 国密)支持。对工程师来说,现在开始学习 SM2/SM3/SM4,不是"锦上添花",是"雪中送炭"。
国密证书与国密 SSL
国密算法需要配套的 PKI 体系——不能拿 RSA 证书去保护 SM2 签名。目前国密证书的格式遵循 GM/T 0015(基于 SM2 的数字证书格式),与国际 X.509(基于 RSA/ECDSA)并行存在。
在实际部署中,通常会部署双证书(一个 RSA 国际证书 + 一个 SM2 国密证书),通过国密 SSL 网关实现自适应协商——浏览器支持国密就走国密,不支持就走 RSA。这就是所谓的"国密 SSL 单端口双算法"方案。