SM4 算法概述

说到国密算法,SM4 是我在实际项目中最常打交道的一个。它不像 RSA 或 ECC 那样做公钥加密,也不像 SM3 那样做哈希校验——它就是一个纯粹的对称分组密码,用在数据加解密场景里。我最早接触 SM4 是在一个政务云项目里,当时客户要求所有云端存储的敏感数据必须使用国密标准加密,那会儿我才认真把 SM4 的规范从头到尾过了一遍。

其实 SM4 之前叫 SMS4,2006 年就作为中国无线局域网标准的一部分发布了。后来 2016 年正式成为国家标准,编号 GB/T 32907-2016。嗯,这里要注意——GB/T 是推荐性标准,不是强制性的,但很多政府项目、金融系统里明确要求必须用国密,实际上就成了强制约束。

1.1 国家标准背景

SM4 由中国国家密码管理局主导制定。它的全称是“SM4分组密码算法”,属于对称密码体制。2016 年 8 月正式发布为国家标准。我记得那一年我刚入职一家安全公司,我们团队正好在做一个国产密码改造项目,标准一出来,供应商纷纷开始做 SM4 的硬件加速芯片。

简单列一下它的标准身份:

属性 内容
标准编号 GB/T 32907-2016
算法类型 对称分组密码
分组长度 128 比特(16 字节)
密钥长度 128 比特(16 字节)
轮数 32 轮
结构 非平衡 Feistel 结构(广义 Feistel)
加解密方式 加密和解密使用相同算法,仅轮密钥顺序相反

核心要点:SM4 的分组和密钥都是 128 位,和 AES-128 一样长度。但轮数是 32 轮,比 AES 的 10 轮(AES-128)多不少,所以轮函数的设计反而更轻量。

1.2 算法特点

SM4 最让我觉得巧妙的地方,就是它的加解密结构完全对称。你想想看,加密的时候用哪些轮密钥顺序,解密的时候倒过来用就行,轮函数本身一模一样。这在硬件实现上能省不少逻辑门。我在做嵌入式 SM4 协处理器的时候,就因为这个特性,把加解密模块合成了一个,面积减少了将近 40%。

具体来说,它有几个比较突出的特点:

  • Feistel 变体:不是经典的两分支 Feistel,它用了四分支,每轮只有 32 比特进入轮函数,另外三个分支直接移位。这种设计让扩散速度更快。
  • 轮函数简单高效:包含 S 盒、线性变换 L 和 T 函数。S 盒是固定的 8×8 替换表,查表就能完成;线性变换用移位加异或实现,没有大数乘法。
  • 密钥扩展和加密共用轮函数:生成轮密钥时也用了同样的 S 盒和线性变换,只是常数不同。好处是固件/硬件可以复用逻辑,坏处是密钥扩展容易受到侧信道攻击——这个我在后面会专门讲。
  • 没用到查表侧信道的“标准”防御:SM4 原始的 S 盒查表实现,其实有计时和缓存泄露风险。我曾经帮一个智能电表厂商做过掩码保护,把 S 盒拆成了两个随机掩码的组合,加解密程序慢了 3 倍但换来了安全合规。

个人习惯:做 SM4 软件优化时,我通常先把 S 盒展开成常量数组,然后手动展开 32 轮循环(或者用循环展开 8 轮一组),速度能提升 1.5~2 倍。但注意不要破坏常量时间的抗侧信道属性。

1.3 应用领域

SM4 的应用范围非常广,说白了只要是国家要求的数据加密场景,几乎都有它的身影。我在工业物联网、电子政务、金融支付三个领域都踩过坑,可以给你列一下典型场景:

  1. 金融 IC 卡 / 社保卡:卡片芯片内部的密钥管理、交易数据加密。SM4 在这里经常搭配 SM2 做数字信封。
  2. 安全通信协议:比如 IPSec VPN、SSL/TLS 国密套件、VPN 网关。我记得有个客户做 U 盘加密,USB 传输时就用 SM4-CBC 模式。
  3. 数据库加密:针对敏感列做 SM4 加密存储,配合 SM3 做完整性校验。我曾经踩过坑:直接拿 SM4-ECB 加密身份证号,结果因为相同明文得到相同密文,被审计记了整改项。
  4. 物联网(IoT):低功耗传感器、智能水表、车联网终端。SM4 的软件实现开销比 AES 稍高一点,但很多国产 MCU 都集成了 SM4 硬件单元,跑起来完全没问题。
  5. 云存储加密:对象存储的客户端加密、密钥管理服务器的数据保护层。
领域 典型应用 常用工作模式
金融 交易报文加密、POS 机密钥下发 ECB / CBC / CTR
政务 电子公文加密、审批系统数据安全 CBC / GCM(GM/T 系列)
通信 IPSec VPN、国密 SSL 网关 CBC / XTS
物联网 智能电表数据上报、NB-IoT 指令加密 ECB / CTR(少用 XTS)

避坑指南:我曾经在一个智慧水务项目里,用 SM4-ECB 模式加密传感器采样数据,结果发现多个传感器在同一气象条件下产生相同的明文采样值,ECB 模式直接泄露了分组之间的相等关系。后来全部改成 SM4-CTR 模式加随机 nonce,才通过了密文等测试。

为什么 SM4 能占领这么多领域?说白了,政策推动是一方面,但算法本身的设计确实够用。128 位密钥和 32 轮迭代,目前没有公开的有效攻击能威胁到它。而且它跟国际标准的 AES 比起来,硬件实现面积更小、功耗更低,适合国产芯片。

SM4 算法核心要素 SM4 分组密码 国家标准 32轮Feistel 128位密钥 多领域应用 GB/T 32907-2016 国家密码管理局发布 S盒 + 线性变换 L 加解密结构对称 轮密钥复用轮函数 金融 / 政务 / 物联网 注:SM4 与 AES 分组大小相同,但轮数多 20+ 轮,轮函数更轻量。 实际工程中需关注侧信道防护与合规模式选择。

这张图把 SM4 的四个核心要素串起来了。你看,从国家标准出发,到算法结构、密钥长度,最后落到应用领域。中间那些小分支是我觉得最值得关注的细节:国标号、对称加解密特性、轮密钥复用,以及三个最火的应用方向。

我个人在做课程设计时,喜欢先让大家把这张图印在脑子里,然后再去抠每个环节的数学细节。因为 SM4 真的不难,难的是在实际项目里怎么用好它、避开那些隐藏的坑。