国密算法概览:SM2/SM3/SM4/SM9

聊到国密,很多同学第一反应是“跟国际算法有啥区别?”或者说“不就换几个函数库吗?”其实没那么简单。我最早接触国密是在一个金融支付项目里,客户明确要求必须使用国产密码算法替换RSA和SHA-256。那时候我才真正意识到:国密不只是“换个算法名”,而是从数学原理到应用生态的全面独立。

先看一张图,帮你快速建立整体认知。

国密算法核心体系 SM2 非对称加密 密钥交换 / 数字签名 / 加密 SM4 对称加密 分组密码 / 加解密速度高 SM3 密码杂凑 摘要长度256位 SM9 标识密码 基于标识 / 无需证书 两套体系 公钥密码基础设施(SM2 / SM9) 对称密码与哈希(SM4 / SM3) 典型应用 电子政务 / 金融交易 / 物联网 Spring Cloud 微服务集成

一、SM2:中国的椭圆曲线密码

SM2 是一套基于椭圆曲线(ECC)的公钥密码算法。它既做加密,也做数字签名和密钥交换。说白了,你在网上看到的“HTTPS证书+RSA签名”那一套,用国密实现时,把RSA换成SM2就行。

我个人习惯把 SM2 理解成“RSA + ECDSA + ECDH”的合体。它用一条特定的256位素域椭圆曲线,安全性对标 RSA-2048 或更高。

功能SM2 对应国际对标
数字签名SM2-SignECDSA / RSA签名
公钥加密SM2-EncryptRSA-OAEP / ECIES
密钥交换SM2-KeyExchangeECDH
避坑指南:我曾经在一个项目中直接用国际库的 ECDSA 代码改参数就当成 SM2,结果验签一直失败。因为 SM2 在签名上下文中加入了“用户标识符”,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 指令集了。

重要提醒:SM4 的工作模式基本沿用了国际标准的分组模式。ECB、CBC、CFB、OFB、CTR,甚至 GCM 模式都有对应的国密实现。在 Spring Cloud 中集成时,Cipher.getInstance("SM4/GCM/NoPadding") 这种方式在很多国密 Provider 里是支持的,但请先确认你的运行时环境是否有对应的实现类。

四、SM9:基于标识的密码算法

SM9 有意思——它不需要证书。用户的公钥可以直接由“标识”(如邮箱、手机号、域名)通过系统参数推导出来。这在微服务场景下能省掉一整个证书管理环节。

当然,SM9 也有代价:需要引入密钥生成中心(KGC),私钥由 KGC 计算并分发给用户。所以 SM9 的信任模型和 PKI 不太一样,适合机构内部网络或联盟链这种半封闭环境。

特性SM2SM9
公钥获取方式必须通过证书(X.509)通过标识直接计算
是否需要 CA需要CA签发证书需要KGC但不依赖CA
密钥管理复杂度较高(证书链、CRL)较低(标识即公钥)
典型场景电子政务、数字签名物联网、消息加密

五、与国际标准的对比:一张表说清楚

下面这个表可以贴在墙上当参考。不是每个国密算法都生硬地对应一个国际算法,但业务上确实有明确的对标关系。

国密国际对标核心差异
SM2RSA / ECDSA / ECDH椭圆曲线参数固定;签名计算含用户标识
SM3SHA-256轮常数不同,输出与SHA-256不兼容
SM4AES-128S盒不同;密钥扩展算法不同;无硬件加速时性能稍低
SM9BF-IBE / BB1-IBE不使用双线性对?(实际上用了双线性对);完全自主设计
个人经验:我做过一次从 RSA 切换到 SM2 的客户端改造,最坑的地方不在算法本身,而在算法标识和 OID。比如国密 SM2 签名的 OID 是 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。这就是最典型的“国密全链路”方案,我们会在后面的章节一步步落地。