第2章 国密算法基础:SM2、SM3、SM4 原理与应用场景

国密算法,说白了就是咱们国家自己的密码算法标准。搞 TLS 国密套件,这三兄弟是躲不开的——SM2 非对称加密、SM3 哈希、SM4 对称加密。我刚开始接触时也觉得有点乱,但拆开来理解,每个角色都很清晰。

这节课咱们不扯虚的,直接讲清楚「它是什么」「怎么用」「有什么坑」。我会结合自己在项目里踩过的雷,帮你少走弯路。

2.1 SM2:椭圆曲线非对称加密

SM2 本质上就是 ECC(椭圆曲线密码学)的一种国家标准实现。它比 RSA 更省带宽、算得更快。我个人习惯在需要数字签名和密钥交换的场景里优先选 SM2。

基本原理

SM2 基于椭圆曲线上的离散对数难题。它定义了一条标准曲线(参数固定),使用公钥和私钥对。加解密过程你想想看,公钥加密只能由私钥解密,签名验证恰好相反。

我踩过的坑: 早期版本里把 SM2 当成普通 ECC 用,结果发现国密要求必须使用固定的曲线参数(sm2p256v1)。你要是用 OpenSSL 的 EC 通用接口,得手动指定曲线 OID,不然验签就会失败。嗯,这个坑我当时调了两天才发现。

核心操作

  • 密钥生成:随机选取私钥 d,计算公钥 P = d * G(G 为基点)。
  • 加密:使用接收方公钥 P,通过 KDF 派生出对称密钥,再加密数据。
  • 解密:使用接收方私钥 d,还原对称密钥并解密。
  • 签名:私钥签名,公钥验证。

应用场景

场景说明
数字签名身份认证、不可否认性,比如证书签名、电子合同
密钥交换TLS 握手中的 ECDHE 国密变种,协商对称密钥
加密通信小数据量加密(配合 SM4 做混合加密)

2.2 SM3:密码哈希函数

SM3 类似于 SHA-256,输出固定 256 位(32 字节)摘要。我曾经在日志完整性校验中用过它,速度比 SHA-256 略慢但还在可接受范围。

为什么需要 SM3?

哈希函数在国密体系里承担三件事:

  1. 消息摘要——验证数据完整性。
  2. 数字签名中的哈希——先对消息做 SM3 摘要,再对摘要做 SM2 签名。
  3. 密码派生——比如 TLS 国密套件里的 PRF 函数会用到 SM3。
特别注意: SM3 和 SM2 签名必须配对使用。不能拿 SHA-256 算摘要然后给 SM2 签,虽然 OpenSSL 能过,但国密合规性检查会报错。我见过有人图省事混用,结果被拒。

SM3 与其他哈希对比

算法输出长度性能(相对)国密合规
SM3256 bit中等是
SHA-256256 bit稍快否
MD5128 bit快(但不安全)否

2.3 SM4:对称分组加密

SM4 是国标对称加密算法,分组长度 128 位,密钥长度 128 位。说白了跟 AES 对标——但它有自己的一套轮函数和 S 盒。我在做数据库字段加密时用过 SM4-CBC,配合 PKCS7 填充很顺滑。

SM4 的几种模式

  • ECB:简单但不安全(相同明文分组得到相同密文),尽量别用。
  • CBC:需要 IV,安全性好,我最常用。
  • GCM:认证加密模式,同时提供机密性和完整性,TLS 里主要用这个。
  • CTR:可并行计算,适合流式数据。

一句话总结三者的角色:

SM2 负责建立信任(密钥交换、签名),SM3 验证完整性,SM4 高效加密数据。在 TLS 国密套件里,它们组合成一套完整的机密性+完整性+身份认证方案。

2.4 三者之间的关系图

下面这张图帮你理清国密三宝在 TLS 里怎么配合的:

国密三宝在TLS握手中的协作 客户端 服务端 SM2 密钥交换 SM3 摘要 SM3 签名验证 SM4 对称加密(GCM模式) SM2协商临时对称密钥 → SM3保证消息完整性 → SM4加密应用数据

2.5 实战中的注意事项

我个人的一揽子建议:
  • SM2 签名前一定要用 SM3 做哈希,别混用其他算法。
  • SM4 密钥不要硬编码在代码里,通过 SM2 密钥交换安全分发。
  • SM3 校验最好加上时间戳或随机数,防止重放攻击。

我曾经犯过的错:

在做一个金融报文系统时,我直接拿 SM2 公钥加密大文件,结果性能惨不忍睹。后来改成「SM2 加密一次性对称密钥 + SM4 加密文件主体」,速度提了几十倍。记住,非对称加密适合小数据,大数据必须混合加密。

好了,这一章就讲这些。理解了三者的定位和配合逻辑,后面看到 TLS 国密套件的密码套件字符串(比如 ECC-SM2-SM4-GCM-SM3)就不会懵了。