国密算法概览:SM2/SM3/SM4/SM9
聊到国密,很多同学第一反应是“跟国际算法有啥区别?”或者说“不就换几个函数库吗?”其实没那么简单。我最早接触国密是在一个金融支付项目里,客户明确要求必须使用国产密码算法替换RSA和SHA-256。那时候我才真正意识到:国密不只是“换个算法名”,而是从数学原理到应用生态的全面独立。
先看一张图,帮你快速建立整体认知。
一、SM2:中国的椭圆曲线密码
SM2 是一套基于椭圆曲线(ECC)的公钥密码算法。它既做加密,也做数字签名和密钥交换。说白了,你在网上看到的“HTTPS证书+RSA签名”那一套,用国密实现时,把RSA换成SM2就行。
我个人习惯把 SM2 理解成“RSA + ECDSA + ECDH”的合体。它用一条特定的256位素域椭圆曲线,安全性对标 RSA-2048 或更高。
| 功能 | SM2 对应 | 国际对标 |
|---|---|---|
| 数字签名 | SM2-Sign | ECDSA / RSA签名 |
| 公钥加密 | SM2-Encrypt | RSA-OAEP / ECIES |
| 密钥交换 | SM2-KeyExchange | ECDH |
Z_A 的计算很轻量但很容易漏写。切记——不能直接套用标准 ECDSA 实现。
二、SM3:256位密码杂凑算法
SM3 是一种密码学哈希函数,输出256位的摘要。它的设计思路和 SHA-256 非常像,但内部结构做了特定调整。
你想想看,为什么微服务里经常用 SM3?因为签名之前,通常要对消息先做一次哈希。比如SM2签名前,计算 Hash(M) || Z_A,这一步的标准哈希就是 SM3。同样,完整性校验、口令存储、区块链交易摘要,都能用 SM3。
一个核心参数对比:
- SM3:256位输出,消息分组512位,压缩函数64轮
- SHA-256:256位输出,消息分组512位,压缩函数64轮
嗯,从性能上看,SM3 在软件实现上比 SHA-256 慢 5%~15%,但差距在可接受范围内。硬件加速后基本持平。
三、SM4:国产对称分组密码
SM4 是国密标准中的对称加密算法,分组长度128位,密钥长度128位。它跟 AES-128 是直接竞争对手。
我记得第一次在微服务里配 SM4,心里嘀咕:AES 有硬件加速,SM4 会不会很慢?实际压测下来,在主流 CPU 上用纯软件跑 SM4 大概 350~400 MB/s,AES-NI 加持的 AES 能到 1 GB/s 以上。不过好消息是很多国产硬件(鲲鹏、飞腾、兆芯)已经原生支持 SM4 指令集了。
Cipher.getInstance("SM4/GCM/NoPadding") 这种方式在很多国密 Provider 里是支持的,但请先确认你的运行时环境是否有对应的实现类。
四、SM9:基于标识的密码算法
SM9 有意思——它不需要证书。用户的公钥可以直接由“标识”(如邮箱、手机号、域名)通过系统参数推导出来。这在微服务场景下能省掉一整个证书管理环节。
当然,SM9 也有代价:需要引入密钥生成中心(KGC),私钥由 KGC 计算并分发给用户。所以 SM9 的信任模型和 PKI 不太一样,适合机构内部网络或联盟链这种半封闭环境。
| 特性 | SM2 | SM9 |
|---|---|---|
| 公钥获取方式 | 必须通过证书(X.509) | 通过标识直接计算 |
| 是否需要 CA | 需要CA签发证书 | 需要KGC但不依赖CA |
| 密钥管理复杂度 | 较高(证书链、CRL) | 较低(标识即公钥) |
| 典型场景 | 电子政务、数字签名 | 物联网、消息加密 |
五、与国际标准的对比:一张表说清楚
下面这个表可以贴在墙上当参考。不是每个国密算法都生硬地对应一个国际算法,但业务上确实有明确的对标关系。
| 国密 | 国际对标 | 核心差异 |
|---|---|---|
| SM2 | RSA / ECDSA / ECDH | 椭圆曲线参数固定;签名计算含用户标识 |
| SM3 | SHA-256 | 轮常数不同,输出与SHA-256不兼容 |
| SM4 | AES-128 | S盒不同;密钥扩展算法不同;无硬件加速时性能稍低 |
| SM9 | BF-IBE / BB1-IBE | 不使用双线性对?(实际上用了双线性对);完全自主设计 |
1.2.156.10197.1.501,如果你在证书和接口里没正确带上这个 OID,国产密码机根本认不出来。微服务里做国密改造,OID 映射表是必须提前梳理的。
六、应用场景选型建议
什么时候用 SM2?什么时候用 SM4?什么时候干脆上 SM9?我自己的判断逻辑是这样:
- 数字签名 & 身份认证 → 首选 SM2,证书体系成熟,兼容性好
- 大量业务数据加密 → SM4 跑 CBC/CTR 模式,性能最优
- 消息完整性校验 & 口令保护 → SM3,搭配 HMAC-SM3 更好
- 无证书场景 / 设备权限管控 → SM9,省掉CA,但要做好KGC灾备
你想想看,在 Spring Cloud 微服务里,服务间调用往往用 HTTPS + 证书做加密和身份认证。国密改造后,HTTPS 证书换成 SM2 证书,密钥协商走 SM2+SM3,数据加密通道走 SM4/GCM。这就是最典型的“国密全链路”方案,我们会在后面的章节一步步落地。