第1章 SM4算法概述:起源、标准与落地

1.1 为什么我总在接口设计中遇到SM4?

很多刚接触国产密码的同学会问我:“SM4跟AES到底差在哪?能不能直接替换?”

说实话,我刚开始做接口设计时也有这疑问。直到有一次在政务系统的数据交换项目中,对方硬性要求“必须使用国密算法”,我才好好翻了翻SM4的文档。

SM4是中国国家密码管理局发布的对称分组密码标准。说白了,它跟AES的工作模式非常像——加密和解密都用同一把密钥。但它完全是由中国自主研发的,不是哪个国际算法的“魔改版”。

一句话理解SM4: 它是一种32轮迭代的Feistel结构分组密码,密钥长度128位,分组长度也是128位。每次处理16字节数据。

1.2 发展历史:从军用走向商用

SM4的前身是SMS4算法,最早用于无线局域网的WAPI标准。我记得2006年它刚公开时,国内密码圈还很兴奋——终于有自己的对称算法了。

  • 2006年:SM4密码算法发布,成为无线局域网国家标准
  • 2016年:正式成为国家标准 GB/T 32907-2016
  • 2017年:被国际标准化组织ISO采纳
  • 2020年后:金融、政务、物联网大规模落地

嗯,这里有个关键时间点:2016年。从那以后,几乎所有涉及“等保三级”和“商用密码”评级的系统,都绕不开SM4。

一个小规律: 在实际项目中,只要甲方有“国产化”或者“信创”要求,SM4基本上就是默认选项。在我对接过的三十多个系统里,90%的对称加密需求最终都落在SM4上。

1.3 国家标准:不是“让你选”,而是“必须用”

SM4目前有两份核心国标,接口设计时你得仔细看:

标准编号 名称 侧重点
GB/T 32907-2016 SM4分组密码算法 算法核心规范、密钥扩展、加密流程
GB/T 35275-2017 SM4密码算法应用接口规范 API定义、参数传递、结果返回

我个人习惯先读GB/T 35275。为什么?因为它直接决定了你代码里函数怎么传参、密钥从哪取、异常怎么报。

你想想看,很多开发同学只盯着32907理解算法流程,结果调接口时才发现——哦,原来密钥还需要带上密钥索引和密钥用途标志。

避坑提醒: 我曾经在对接一个省级政务平台时,对方要求SM4加密参数必须包含"key_usage=0x01"这个字段。我翻遍32907都没找到这个要求,后来才发现那是35275里定义的接口扩展字段。所以——接口参数设计,别只看算法规范,接口规范也要一起看。

1.4 应用场景:它到底用在哪儿?

我归纳了四个最常见的落地场景,你在接口设计中基本都会碰到:

  1. 网络层加密:SSL VPN、IPSec VPN的国密改造,替换AES
  2. 数据库加密:敏感字段(身份证、手机号、银行卡)的列级加密
  3. 物联网通信:窄带物联网、智能门锁、车载T-Box的数据上行加密
  4. 金融支付:POS终端密文PIN、用户交易敏感数据保护

这四个场景对接口参数的要求完全不同。比如物联网场景,密钥更新频率可能以小时计;金融场景则要求密钥必须硬件安全模块(HSM)生成。这些差异,都会直接反映到接口参数设计上——是传密钥ID还是直接传输密钥?是要求密文base64还是hex?

一个核心认知: SM4算法本身只有128位密钥、128位分组、32轮计算。它的复杂性不在算法内部,而在外部——密钥管理体系、填充模式选择、工作模式组合、接口参数标准化。这些,才是接口设计的真正难点。

1.5 知识体系总览:一张图看懂SM4

下面的SVG结构图帮助你快速把握SM4的全局:从历史脉络到标准层级,再到应用落地。

SM4算法三大知识模块 发展历史 ◦ 2006年:SMS4公开 ◦ 2016年:国标发布 ◦ 2017年:ISO采纳 ◦ 2020年:大规模落地 国家标准 ◦ GB/T 32907-2016 算法核心规范 ◦ GB/T 35275-2017 应用接口规范 应用场景 ◦ 网络层加密 ◦ 数据库加密 ◦ 物联网通信 ◦ 金融支付 接口参数设计 密钥体系 | 填充模式 | 工作模式 | 传输格式 算法的复杂性不在算法内部,而在外部接口参数设计 本章重点:理解SM4的“前世今生”与标准体系,为接口参数设计打下认知基础

从上面的结构图可以看得很清楚:历史、标准、场景三个维度最终都指向一个核心问题——接口参数怎么设计。这也是为什么我把这门课命名为《SM4加密接口参数设计教程》,而不是单纯的“SM4算法原理”。

1.6 本章小结

  • SM4是128位分组、128位密钥的32轮Feistel结构对称密码
  • 2006年公开,2016年成为国标,已大规模商用
  • 接口参数设计必须同时参考GB/T 32907和GB/T 35275
  • 应用场景决定接口参数的具体形式(密钥索引、填充模式、传输编码等)