国密算法概述: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。典型应用:

  1. 数字签名中的消息摘要(配合 SM2)
  2. HMAC 消息认证码
  3. 文件完整性校验(比如国密版 shasum)
  4. 随机数生成
特性SM3SHA‑256
消息分组长度512 比特512 比特
字长32 比特32 比特
压缩轮数6464
初始化向量自定义 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 密码杂凑 数字签名 密钥交换 公钥加密 消息摘要 HMAC 认证 完整性校验 遵循 GM/T 0003-2012, GM/T 0004-2012

小结

这一章我们只聊了背景和轮廓。SM2 的椭圆曲线参数长什么样?SM3 的压缩函数如何计算?这些细节后面会逐一拆解。不过你放心,我会一直在旁边用项目里的真实坑给你提个醒。国密适配没有想象中那么难,但每一步都得踩实。