国密算法 SM2 / SM3 / SM4 简介

国密算法,说白了就是国家密码管理局发布的一套商用密码标准。我刚接触时也觉得「不就是个国产版 RSA 加 SHA256 嘛」,后来做 KMS 集成才发现——它们的设计细节跟国际算法有不少差异,坑还挺多。

这一节我带你快速过一遍 SM2、SM3、SM4 的核心要点。你不用背参数,但要知道它们各自干什么、长什么样、集成时容易在哪翻车。

SM2 —— 椭圆曲线公钥密码算法

SM2 是一套公钥密码体系。它覆盖了三个功能:数字签名、密钥交换、公钥加密。你想想看,RSA 一个算法就把签名和加密都干了,但 SM2 是基于椭圆曲线(ECC)的,安全性更高,密钥更短。

我记得在第一次对接国密证书时,对方给了一个 SM2 签名的原始字节流,我直接拿 ASN.1 解,结果怎么都对不上。后来才发现,SM2 签名结果的默认编码格式和 ECDSA 不一样——它用的是 (r, s) 原始串,不是 DER 编码。嗯,这个坑希望大家别踩。

特性SM2RSA (对比)
密钥长度256 位2048 位起
签名性能快(约 2~5ms)慢(约 10~20ms)
加密数据长度有限(推荐对称密钥包装)有限
标准规范GM/T 0003PKCS#1
签名编码坑原始 r||s(64 字节)DER 编码
我曾经踩过的坑:SM2 签名输出是 64 字节的 r || s,不是 ASN.1 结构。如果第三方库要求 DER 格式,你必须自己拼 SEQUENCE { INTEGER r, INTEGER s }。反过来,也要能解。

SM3 —— 密码杂凑算法

SM3 输出 256 位摘要,类似 SHA-256。我最初觉得这俩差不多,替换起来应该很平滑。但实际做数据迁移时发现,SM3 的初始向量 IV 和填充方式跟 SHA-256 不一样,导致同一条原文算出来的摘要完全不同。所以千万别在同一个系统里混用两种哈希。

SM3 的安全性略高于 SHA-256,至少在设计上是有意加强抗碰撞能力。我在项目中测试过,100M 文件的 SM3 算力大约比 SHA-256 慢 10%~15%,但在 KMS 里通常是毫秒级,完全可接受。

特性SM3SHA-256
输出长度256 位256 位
分组大小512 位512 位
IV0x7380166F ...0x6A09E667 ...
性能略慢于 SHA-256较快
国标GM/T 0004FIPS 180-4
一点小经验:SM3 在 OpenSSL 1.1.1 之后才正式支持,低版本需要自己编译。如果你的 KMS 部署在老旧操作系统上,务必先确认底层库的 SM3 支持情况。

SM4 —— 分组密码算法

SM4 是对称加密,128 位分组,128 位密钥。跟 AES 比,它的设计更简单——轮数 32 轮,S 盒固定。但简单不代表弱,目前公开分析没有本质漏洞。

我在国密改造项目中,最头疼的是 SM4 的补位方式。很多开发以为默认就是 PKCS7,但 SM4 标准里推荐的是 CMS-Padding(跟 PKCS7 几乎一样,只是补位值定义稍有歧义)。我建议统一用 PKCS7 风格补位,然后在两端确认一致。

SM4 支持 ECB、CBC、CTR、GCM 等模式。我个人习惯在 KMS 里优先用 GCM 模式——既有加密又有认证,省去额外算 HMAC。不过要注意,SM4-GCM 不是所有硬件加速卡都支持,选型时务必跟厂商确认。

特性SM4AES-128
分组大小128 位128 位
密钥长度128 位128 / 192 / 256 位
轮数3210
硬件加速部分国产芯片支持广泛
补位标准PKCS7 / CMS-PaddingPKCS7
注意:SM4 的 S 盒在软件实现时很容易因为查表顺序错误导致加解密不一致。我曾经因为 endianness 没对齐,花了一整天 debug。建议先用官方测试向量验证后再集成。

三种算法在 KMS 中的协作关系

光知道单个算法没用——在 KMS 里它们是怎么配合的?我用一张图来总结。

国密算法与 KMS 集成关系图 用户/应用 KMS 集成层 SM2 签名 / 加密 / 密钥交换 SM3 摘要 / 哈希校验 SM4 对称加解密 密钥存储(HSM / 软件) 该图展示了用户通过 KMS 集成层调用 SM2/SM3/SM4 三种算法,底层统一使用密钥存储。

从图上你能看出来,KMS 的角色是统一调度器。上层业务不用关心密钥是存在 HSM 还是软件文件,也不用管摘要用的是 SM3 还是 SHA-256——只要配置好算法标识,KMS 会自动路由到底层实现。

核心思路:国密算法不是三个独立工具,而是一套协同体系。SM2 做身份认证和密钥协商,SM3 保证数据完整性,SM4 负责批量数据加密。
在 KMS 里,它们通过统一的密钥生命周期管理串在一起。

我个人建议,做集成测试时不要只测单个算法功能,要测混合场景——比如先用 SM4 加密数据,再用 SM3 对密文做摘要,最后用 SM2 对摘要签名。这个链路走通了,你的系统才算真的支持国密。