国密算法知多少:SM2/SM3/SM4/SM9/ZUC 原理与工程落地全解析 📅 发布时间:2026/9/3 5:07:20 👁 浏览次数: 从一张密评整改单说起设想这样一场景你负责的业务系统要过等级保护三级测评测评机构出具了一份商用密码应用安全性评估俗称密评整改单上面写着——“系统传输通道未采用商用密码算法保护数据存储加密未使用 SM4摘要算法应替换为 SM3”。但真到动手时很多工程师的第一反应是国密算法到底有哪几个SM2 和 RSA 什么关系SM4 用什么模式TLCP 双证书又是什么这篇文章就把这些问题一次讲清——先建立算法家族的整体图景再逐个拆解原理最后落到应用场景与工程实践。文中所有 Node.js 代码均经实际运行验证可直接复用。国密算法家族总览“国密指国家密码管理局发布的商用密码SM即商密”算法系列。核心是五个算法家族覆盖了现代密码学的三大类目算法类别国家标准对标的国际算法典型用途SM2椭圆曲线公钥密码GB/T 32918-20165 部分RSA / ECDSA数字签名、密钥交换、公钥加密SM3密码杂凑算法GB/T 32905-2016SHA-256摘要、HMAC、数字签名的前置哈希SM4分组密码GB/T 32907-2016AES-128数据加解密传输与存储SM9标识密码算法GB/T 38635-2020IBC无直接对标以身份为公钥的签名与加密ZUC祖冲之序列密码GB/T 33133 系列Snow 3G / AES-CTR5G/4G 通信加密与完整性保护一句话记忆SM2 管非对称、SM3 管摘要、SM4 管对称、SM9 管身份即公钥、ZUC 管流密码。日常开发中 90% 的国密改造只涉及 SM2/SM3/SM4 三件套所以这三个我们展开讲SM9 和 ZUC 讲清定位即可。SM2国产椭圆曲线的一鱼三吃数学直觉SM2 是基于椭圆曲线密码ECC的公钥算法使用国密局指定的 256 位素域曲线 sm2p256v1。它的安全性来自椭圆曲线离散对数问题ECDLP——已知私钥 d 和基点 G 算公钥 P dG 是一次乘法而已知 P、G 反推 d 在计算上不可行。对比 RSA 基于大整数分解ECC 的优势是密钥短、速度快SM2 的 256 位密钥安全强度约 128 位大致等价于 RSA-3072。这意味着在同等安全等级下SM2 的签名速度和带宽开销都显著优于 RSA。一条曲线三种用途SM2 标准分为五部分但工程上真正要区分的是三个子场景数字签名GB/T 32918.2签名前先用 SM3 对消息做摘要注意 SM2 签名的哈希过程与先 SM3 再签名的直接拼接不同标准定义了含 Z 值的预处理用于身份认证、电子签章、交易防抵赖。密钥交换GB/T 32918.3类似 ECDH用于协商对称会话密钥。公钥加密GB/T 32918.4用接收方公钥加密短数据典型如会话密钥结构为 C1‖C3‖C2——C1 是椭圆曲线上的随机点C3 是 SM3 摘要防篡改C2 是密文。可运行代码Node.jssm-crypto 库// npm install sm-cryptoconst{sm2}require(sm-crypto);// 1. 生成密钥对生产环境请使用加密机或安全随机源constkeypairsm2.generateKeyPairHex();const{publicKey,privateKey}keypair;// 2. 公钥加密 / 私钥解密cipherMode1 表示 C1C3C2国密标准顺序constciphersm2.doEncrypt(国密算法SM2 / SM3 / SM4,publicKey,1);constplainsm2.doDecrypt(cipher,privateKey,1);// 3. 私钥签名 / 公钥验签constsigsm2.doSignature(transfer: 10000 CNY to Alice,privateKey);constoksm2.doVerifySignature(transfer: 10000 CNY to Alice,sig,publicKey);console.log(解密结果:,plain,| 验签结果:,ok);工程提示不同库对密文顺序默认值不一致有的默认 C1C2C3老标准草案有的默认 C1C3C2现行标准。跨系统对接时密文顺序不对齐是国密改造中最高频的联调事故务必显式声明。SM3国产杂凑算法结构与安全强度SM3 是密码杂凑哈希算法输出 256 位摘要分组长度 512 位采用 64 轮迭代压缩整体结构是经典的 Merkle–Damgård 构造。它对标的正是 SHA-256两者在性能上同量级且 SM3 设计至今未发现实际攻击。GB/T 32905 标准附录给出了测试向量其中最常用的一条sm3(abc) 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0这个向量是验证任何 SM3 实现正确性的第一块试金石。可运行代码const{sm3}require(sm-crypto);// 基本摘要已对照国标测试向量验证sm3(abc);// 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0// HMAC-SM3key 为十六进制字符串用于消息认证sm3(abc,{key:7365637265742d6b6579});工程提示SM3 几乎不单独存在它的角色是 SM2 签名的前置哈希、TLCP 协议的握手摘要、口令存储配合加盐以及 HMAC 构造。密评整改中把 MD5/SHA-1 换成 SM3通常是最简单的一项。SM4国产分组密码结构与 AES 的对应关系SM4 是分组密码分组长度 128 位、密钥长度 128 位32 轮迭代——这三个参数与 AES-128 完全一致所以安全强度也是 128 位。它采用对合结构的轮函数加解密共用同一套运算只是轮密钥倒序使用核心部件包括 S 盒非线性变换、线性扩散层 L 和轮密钥生成。维度SM4AES-128分组 / 密钥长度128 / 128 位128 / 128 位轮数3210安全强度128 位128 位硬件实现面积有优势适合物联网生态最成熟纯软件实现中 SM4 通常比 AES 略慢AES 有 AES-NI 指令加速这是数据库字段加密等高吞吐场景需要评估的点。工作模式SM4 不等于 ECB和 AES 一样SM4 作为分组密码必须搭配工作模式使用且常识完全通用ECB 模式禁止用于多分组数据——相同明文块产生相同密文块会泄露数据模式通用场景首选CBC需随机 IV或CTR需要加密 认证的传输场景应使用GCMRFC 8998 定义了 TLS 1.3 的 TLS_SM4_GCM_SM3 套件存储场景 GCM 的自校验也能防止密文被篡改。可运行代码const{sm4}require(sm-crypto);constkey0123456789abcdeffedcba9876543210;// 128 位十六进制constivfedcba98765432100123456789abcdef;// CBC 模式的初始向量constdataSM4 是分组密码分组长度与密钥长度均为 128 位;// CBC 模式加解密推荐constencsm4.encrypt(data,key,{mode:cbc,iv});constdecsm4.decrypt(enc,key,{mode:cbc,iv});console.log(解密结果:,decdata?一致:不一致);// ECB 仅限单分组数据演示生产禁用constencEcbsm4.encrypt(data,key);工程提示国密改造最常见的存储加密方案是SM4-CBC 密钥由 KMS/加密机托管密钥绝不能与密文同库存储更不能硬编码——这一点密评时会直接扣分。SM9 与 ZUC两个长尾但有想象力的算法SM9把身份当公钥SM9 是基于双线性对pairing的标识密码IBC算法。它解决的核心痛点是公钥就是用户的身份标识邮箱、手机号、设备号发件方直接加密给 zhangsanexample.com不需要先获取并验证对方证书私钥则由密钥生成中心KGC下发。这天然适合两类场景一是证书体系运维成本高的大规模终端如物联网设备出厂即内置设备标识二是需要撤销即失效细粒度控制的通信加密。代价是引入了 KGC 这个信任中心——它知道或能推导所有用户私钥所以 SM9 的合规部署必须配合受控的密钥管理中心。2025 年发布的 GB/T 46798-2025 进一步规范了标识密码认证系统的安全技术要求这个算法正在从小众走向可落地。ZUC跑在 5G 里的国产流密码祖冲之算法ZUC是序列密码流密码生成伪随机密钥流与明文逐比特异或。它是 3GPP 标准的 LTE/5G 空口加密与完整性算法EEA3/EIA3的基础GB/T 33133 系列将其确立为国家标准后续扩展的 ZUC-256 面向 5G 及未来场景。流密码的优势是加解密快、无填充、适合硬件流水线因此在运营商基站、SIM/USIM 卡、车联网 V2X 通信等管道层场景占主导。普通业务系统开发中直接使用 ZUC 的机会不多但理解它的定位有助于读懂通信行业的国密方案。应用场景国密算法在哪里落地场景一国密 HTTPS 与 TLCP 双证书Web 通道的国密化有两条技术路线TLCP 协议GB/T 38636-2020《传输层密码协议》国内金融、政务的主流方案。它独立于 TLS 1.2最鲜明的特征是双证书体系——客户端和服务端各持两张证书签名证书含 SM2 签名密钥对用于身份认证 加密证书含 SM2 加解密密钥对用于保护会话密钥。密钥用途分离是密评的关注重点。TLS 1.3 国密套件RFC 8998在标准 TLS 1.3 中使用 TLS_SM4_GCM_SM3 等套件路线更国际化铜锁Tongsuo原 BabaSSL、部分新版 OpenSSL 分支已支持。实践中国密网关/负载均衡Nginx 铜锁、各类国密 SSL 网关通常同时监听国际 TLS 与 TLCP按客户端 ALPN/协商结果自适应实现国密改造但不破坏存量兼容。场景二数字证书与电子签章基于 SM2 SM3 的 X.509 国密证书链CFCA、各地 CA 机构签发是电子合同、电子证照、电子印章的信任基础。签名流程通常是SM3 摘要 → SM2 签名 → 时间戳 CA 证书链验证配合《电子签名法》即具备法律效力。政务一网通办里的电子签章几乎全部基于这套体系。场景三金融支付人民银行 PBOC 系列规范如借记贷记密码应用技术规范较早完成了国密化银行卡芯片内的 SM2/SM3/SM4 应用、银联跨行交易的报文鉴别MAC 基于 SM4/SM3、移动支付的数字签名与传输加密。金融是国密渗透率最高、标准最细的行业。场景四物联网与车联网海量低功耗终端对密钥长度敏感SM2 短密钥与 SM4 轻量硬件实现是天然优势V2X 车联网通信安全标准采用 SM2/SM3 做假名证书与消息签名ZUC 则负责空口层加密。设备身份管理引入 SM9 IBC可以让设备序列号即公钥省去证书分发链路。场景五密评合规改造GB/T 39786-2021密评将密码应用要求分为四个技术层面 管理要求对应改造清单大致是层面典型改造项涉及算法物理和环境安全门禁认证、视频监控完整性保护SM3 / SM4网络和通信安全通道加密、设备身份认证TLCP / SM2 / SM4设备和计算安全登录认证、远程运维加密SM3口令摘要、SM2应用和数据安全数据传输加密、存储加密、签名验签SM2 / SM3 / SM4其中应用和数据安全是开发团队的主战场也是 SM2/SM3/SM4 三件套集中出现的地方。工程实践库选型与避坑清单各语言主流实现语言/平台推荐库说明JavaBouncyCastle / hutool-cryptoBC 是事实标准hutool 对 BC 做了易用封装Node.jssm-crypto轻量纯 JS覆盖 SM2/SM3/SM4Pythongmssl同名 pip 包API 简洁Goemmansun/gmsm功能全面含 ZUC、国密 TLS 支持C/CGmSSL、铜锁Tongsuo铜锁支持 TLCP 与国密 HTTPSOpenSSL1.1.1 内置 SM2/SM3/SM4但不支持 TLCP需铜锁分支Python 示例gmssl 包# pip install gmsslfromgmsslimportsm3,func digestsm3.sm3_hash(func.bytes_to_list(abc.encode()))# 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0避坑清单按踩坑频率排序密文/签名格式不统一C1C3C2 与 C1C2C3 顺序、是否带04未压缩点前缀、签名 r/s 拼接还是 DER 编码——四象限组合导致跨系统对接失败联调前先对齐格式约定或用国标测试向量互测。ECB 模式偷懒图省事用 SM4-ECB 加密整表字段密评直接不通过统一改 CBC随机 IV 随密文存储或 GCM。密钥管理裸奔SM4 密钥硬编码在配置文件、与密文同库密钥泄露等于加密白做。密钥应交由 KMS 或加密机托管定期轮换。随机数源不安全SM2 加密与签名的随机数 k 必须使用密码学安全随机源k 复用或可预测会直接泄露私钥PS3 当年 ECDSA 私钥泄露的同款教训。公钥未验证书链拿到公钥就加密/验签不验证证书有效性与链路信任中间人攻击敞开大门。性能评估缺位SM4 纯软件吞吐低于 AES无指令加速大字段全表加密前先压测高吞吐场景考虑国密加速卡/密码机。一份最小验证清单任何国密接入先用标准向量自证实现正确再谈业务联调sm3(abc)必须等于66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0SM2 密文用自家公钥加密后必须能被对端私钥解开验证顺序约定一致SM4 加密结果跨语言互通Node 加密、Java 解密跑一遍。总结国密算法不是另起炉灶的新密码学而是一套与国际主流算法能力对等、由国家标准背书的自研体系SM2 以 256 位短密钥对打 RSA-3072SM3 对标 SHA-256SM4 对标 AES-128SM9 用身份即公钥简化证书体系ZUC 守住通信空口。对开发者而言掌握三件套 TLCP 双证书就能应对绝大多数密评与国密改造需求真正决定项目成败的往往不是算法本身而是密文格式对齐、密钥管理和随机数安全这些工程细节。合规只是起点。随着信创深入和密码法体系落地国密能力正在从整改项变成默认项——早一天把它变成团队的基础设施就少一天临阵磨枪。