国密算法简介:SM2、SM3、SM4 归纳总结

做密码学安全,说到底就是在跟「谁能用、怎么用、多快能用」这几个问题打交道。国密算法,也就是中国自主设计的密码标准,咱们得把它们吃透。我个人习惯,先梳理算法的定位,再看它们组合起来怎么干活。

这套算法体系,核心就三个:SM2(公钥密码)、SM3(密码杂凑)、SM4(分组对称密码)。你想想看,TLS握手过程里,这三兄弟刚好覆盖了密钥协商、完整性校验、数据加密全部环节。嗯,缺一不可。

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

SM2 对标的是国际上的 ECDSA/ECIES。它不是 RSA 那种大整数分解路线,而是基于椭圆曲线离散对数难题。说白了,256 位的 SM2 密钥,安全强度跟 3072 位的 RSA 差不多。我建议选型时优先考虑 SM2,存储和传输开销小很多。

核心能力

  • 密钥对生成:私钥是一个随机大整数,公钥是椭圆曲线上的一个点。
  • 数字签名:支持签名和验签,用于身份认证和消息完整性。
  • 密钥交换:双方通过 SM2 密钥交换协议,协商出对称密钥。
  • 加密/解密:混合加密,公钥加密对称密钥,对称密钥加密数据。

我在项目中遇到过不少把 SM2 当 RSA 用的朋友——直接用公钥加密长消息。这不对。SM2 的加密实际只加密一个 32 字节的随机数(派生对称密钥),跟 RSA 加解密式思维完全两码事。

工程经验

SM2 签名结果包含两个整数 (r, s),编码后通常是 64 或 65 字节(加上压缩标识)。TLS 握手时,CertificateVerify 消息里的签名需要按国密标准 DER 编码,跟国际标准稍有不同,别搞混。

SM3:密码杂凑算法

SM3 就是国密的 SHA-256。输出长度 256 位,分组长度 512 位。结构上它采用了 Merkle–Damgård 构造,但消息扩展和压缩函数有独特设计。经检测,抗碰撞能力优于 SHA-256——虽然实际用起来差别不大,但合规要求必须用 SM3。

它干的活主要两件:

  • 计算消息摘要,用来做完整性校验(比如 TLS Finished 消息)。
  • 作为密钥派生函数(KDF)的组件,生成密钥材料。

注意坑点

我曾经碰到一个团队,用 SM3 直接对几十 MB 的文件做哈希。结果内存占满,性能一塌糊涂。SM3 是按 512 位分组计算的,它可以在流式模式下分块处理。务必用更新接口(SM3_Update),不要等全量数据到了再做。

SM4:分组对称密码算法

SM4 是国标的 AES 替代品。分组长度 128 位,密钥长度 128 位。结构上是 32 轮的非平衡 Feistel 网络。嗯,每一轮一个 S 盒,4 个 S 盒都一样,实现起来比 AES 的查表还要简单一点。

它主要的加密模式包括:ECB、CBC、CTR、GCM。在国密 TLS 里,通常使用 CBC 或 GCM 模式。我建议优先用 GCM——自带认证加密,一个算法搞定机密性和完整性,省掉额外计算 HMAC 的步骤。

性能对比

SM4 在纯软件实现上比 AES 略慢,但差得不多。现代 CPU 如果支持 AES-NI 指令集,AES 更快。但 SM4 在硬件里面积可以做得非常小——很多国产 SoC 用硬核实现,能耗很低。选型时,按平台特性来。

算法 类型 密钥/输出长度 典型用途
SM2 公钥密码 私钥 32B,公钥 65B 签名、密钥交换、加密
SM3 密码杂凑 256 位摘要 完整性校验、KDF
SM4 分组对称 128 位密钥/分组 批量数据加密

三者的协作关系:国密TLS 视角

光知道单个算法没用,得看它们怎么一起跑。在国密 TLS 握手流程里:

  1. 身份认证:SM2 签名证书,客户端验证服务端签名。
  2. 密钥协商:SM2 密钥交换协议(或 ECDHE 变种),生成预主密钥。
  3. 密钥派生:SM3 作为 HKDF 的底层哈希,从预主密钥派生出会话密钥。
  4. 数据加密:SM4-GCM 使用会话密钥加密应用数据,SM3 或 GCM 认证标签做完整性。

你看,SM2 负责最核心的「信任锚点」,SM3 负责「证据链」的不可篡改,SM4 负责「路上」的防盗。缺哪一个都不行。我个人习惯在画国密方案架构图时,直接把这三个算法拧成一个「密码服务三件套」的模块——方便和其他组件解耦。

国密算法体系与TLS协作流程 SM2 公钥密码 椭圆曲线 256位 签名 | 密钥交换 | 加密 身份认证 / 预主密钥 SM3 密码杂凑 256位输出 完整性校验 | KDF 派生会话密钥 SM4 分组对称 128位密钥/分组 CBC / GCM 模式 批量数据加密 国密TLS握手流程与算法协作 ① SM2 签名验证 ② SM2 密钥交换 ③ SM3 KDF 派生 ④ SM4-GCM 加密 协作成果 密钥材料 加密通道 双向身份 验证完整

实战中的选型建议

如果你在做一个国密 TLS 网关,我的建议是:

  • 握手阶段:SM2 做签名 + 密钥交换,SM3 做哈希。这个组合已经写进 GM/T 0024 SSL VPN 技术规范里了。
  • 记录层加密:SM4-GCM。GCM 模式自带认证,不需要额外计算 MAC,性能更好。
  • 密钥管理:SM3 作为 KDF 的底层。不要自己想当然用 SHA-256 代替,合规审查过不了。

合规红线

国家密码管理局明确要求:等保三级以上系统、金融核心交易、政务外网,必须使用国密算法。一旦审计发现用了 SHA256 + RSA 代替 SM3 + SM2,轻则整改,重则通报。这不仅仅是技术选择,而是合规义务。

嗯,掌握了这三个算法的定位和配合方式,后面学国密 TLS 握手时,你就能一眼看出每一步在干什么。不是密码学家也能把安全配好,关键是心里要有这张协作图。