第3章 国密算法概览:SM2、SM3、SM4 原理与场景

做国密改造这么多年,我遇到最多的问题就是——这三种算法到底该用在哪?有人把 SM4 当哈希用,有人拿 SM2 去加密大文件,结果性能惨不忍睹。其实它们分工非常明确,就像工具箱里的三把扳手,各管各的活。

这一章我带大家走一遍核心原理,顺便聊聊我在实际对接中踩过的坑。你想想看,搞懂了底层逻辑,后面 KMS 对接才不至于抓瞎。

SM2:椭圆曲线公钥密码

SM2 是国内标准 GB/T 32918 定义的椭圆曲线公钥算法。说白了,它替代 RSA 用的。一条椭圆曲线上的点构成一个群,点加法运算的两倍用于密钥交换和数字签名。它的核心优势是 密钥更短、性能更好——256 位 SM2 相当于 3072 位 RSA 的安全强度。

典型场景:数字签名(比如 PDF 签章)、密钥协商(TLS 握手)、小数据加密(报文摘要的加密)。

我个人习惯把 SM2 看作“签名工具箱”。有一次给政务系统做 KMS 对接,对方要求用 SM2 做身份认证,结果发现他们只导入了公钥,没把私钥安全放硬件加密机里。嗯,这里要注意——SM2 的私钥必须隔离存储,否则签名就等于裸奔。

SM2 签名流程(简写版)

  1. 生成随机数 k,计算椭圆曲线点 (x1, y1) = k * G。
  2. 计算 r = (e + x1) mod n,若 r=0 或 r+k=n 则重试。
  3. 计算 s = ((1 + dA)^-1 * (k - r * dA)) mod n。
  4. 输出签名 (r, s)。
经验:SM2 签名验签的性能受曲线点乘运算影响很大。我曾用纯软件实现,TLS 握手时 SM2 签名比 RSA 慢 2 倍,后来换成硬件加速卡才压下去。

SM3:密码杂凑函数

SM3 对应国际的 SHA-256。它把任意长度的消息压缩成 256 位(32 字节) 的摘要。算法采用 Merkle-Damgård 结构,消息分组 512 位,经过 64 轮迭代压缩。我参与过一个等保三级项目,对方坚持要用 SM3 代替 SHA-256——其实 SM3 和 SHA-256 安全性相当,但国密支持是合规硬要求。

有个坑我得提一下:SM3 不能当加密用。前端时间有个同事想用 SM3 摘要当作密钥去加密文件,这完全不对——摘要不可逆,但密钥需要可派生。我曾经在培训时反复强调:哈希就是哈希,别乱用。

SM3 适用场景

  • 完整性校验(文件校验、固件签名)
  • 数字签名中的消息摘要(配合 SM2)
  • 密码存储的哈希(加盐后)
  • 彩虹表防护(SM3 速度适中,比 MD5 安全)
警告:SM3 的输出长度固定为 256 位,如果你的系统需要可变长度摘要,可能需要使用 HMAC-SM3 或消息认证码模式。另外 SM3 对消息长度有限制(< 2^64 位),一般不用操心,但超大文件分段处理时要注意。

SM4:分组对称密码

SM4 是国密标准里的对称加密算法,分组长度 128 位,密钥长度也是 128 位。它的结构是 32 轮非平衡 Feistel 网络。说人话:把明文分成两半,每轮用轮函数处理左半部分并与右半部分异或,再交换。

我最早接触 SM4 是在做数据库透明加密(TDE)的时候。当时选型纠结用 AES 还是 SM4——后来发现 SM4 在软件实现上比 AES 慢一点,但硬件支持已经很成熟了。我记得在 X86 上跑 OpenSSL 的 SM4,吞吐量大约 1.2 Gbps,够用。

SM4 工作模式对比

模式特点适用场景
ECB每个分组独立加密,并列快小数据块,不推荐(模式弱)
CBC需要 IV,链式依赖文件加密、消息加密
CTR可并行,支持随机读写磁盘加密、网络流加密
GCM带认证加密,防篡改KMS 数据密钥保护、传输加密
偏向:做 KMS 对接时,我几乎只用 GCM 模式——既保证机密性,又保证完整性。曾经遇到一个项目用 SM4-CBC 加密 API ,结果没加 MAC,被中间人篡改分组导致系统崩溃,教训啊。

三种算法知识体系结构

下面这张图是我自己画的知识地图,帮你理清 SM2、SM3、SM4 在整个密码体系中的位置。

国密算法体系核心三层 SM2 非对称 SM3 哈希 SM4 对称 密钥协商 数字签名 数据加密 完整性校验 说明:SM2 用于签名/协商,SM3 提供摘要,SM4 加密数据。三者组合起来构成完整的国密密码套件。

三剑客对比总结

属性SM2SM3SM4
密码类型非对称公钥哈希分组对称
密钥长度256 位—128 位
输出长度签名 512 位 (r,s)256 位摘要128 位密文块
主要场景签名、密钥交换、小数据加密完整性、消息摘要批量数据加密、传输加密
性能(软件)较慢(点乘运算多)中等(64轮迭代)较快(32轮Feistel)
常见使用模式C1C3C2(加密)/ SM2SignSM3WithSM2(签名中)ECB/CBC/CTR/GCM

核心要点:很多人问“我能不能只用 SM4 搞定一切”?答案是 no。非对称、哈希、对称三大类各司其职。你想想看,签名需要私钥验证公钥,哈希需要不可逆,加密需要可解密——缺一个就构不成完整的安全链路。做 KMS 对接时,我通常这样组合:SM2 签名协商会话密钥 → SM3 校验握手消息 → SM4-GCM 加密业务数据,这才是一个国密齐套的合格系统。

嗯,这一章信息量不小,但你只要记住一句话:SM2 管信任、SM3 管指纹、SM4 管内容。后面实战章节里,我会带你一步步把这些算法塞进 KMS 的钥匙洞里。