1. SM4算法概述与国密标准归纳
这一章我想先跟你聊聊SM4算法的来龙去脉。很多人觉得SM4就是个中国的AES,这么理解不算错,但有点粗糙。SM4从设计定位到实现细节,都有自己的一套逻辑。我在多个国密改造项目中转过一圈之后,对这一点体会特别深。
1.1 SM4是什么
SM4分组密码算法,以前叫SMS4,是国密标准里最早商用的对称算法之一。2016年正式成为国标GB/T 32907-2016。说白了一个分组密码,加密和解密用的是一套密钥,密钥长度128位,分组长度也是128位。
为什么不是192位或256位?我个人习惯把原因归结为两点:一是128位在可预见的未来足够安全,二是国密体系设计时讲究计算效率的均衡。你想想看,物联网设备或者智能卡芯片,运算资源有限,128位刚好能塞进硬件里,不卡脖子。
- 算法类型:分组对称密码
- 密钥长度:128 bit(16字节)
- 分组长度:128 bit(16字节)
- 轮数:32轮非线性迭代
- 标准文号:GB/T 32907-2016
1.2 国密标准家族
国密算法不是一个孤立的算法,而是一套完整的密码工具箱。SM4属于那套箱子里最常用的对称加密工具。我看过不少项目在国密改造时只盯着SM4看,结果跟SM2、SM3的衔接处出了问题——嗯,这里要特别提醒你,注意整个体系。
| 算法 | 类型 | 用途 |
|---|---|---|
| SM2 | 椭圆曲线公钥密码 | 数字签名、密钥交换、加密 |
| SM3 | 密码杂凑算法 | 消息摘要、完整性校验 |
| SM4 | 分组对称密码 | 数据加密、密钥保护 |
| SM9 | 标识密码算法 | 无需证书的密码体制 |
我参与过一个金融核心系统的国密替换项目,原来跑的是AES-128,替换目标是SM4。很多人以为把AES的调用改成SM4就行,其实远没那么简单。SM4的S盒实现、密钥扩展方式跟AES差别不小,移植时稍不留神就会出兼容问题。
1.3 SM4算法核心结构
SM4采用了典型的Feistel结构,32轮迭代。每一轮都很规整,对软硬件实现都很友好。但有一点跟DES不一样——它的F函数里有一个合成置换T,T又包含非线性变换τ和线性变换L。这个设计思路其实很有意思,我们慢慢拆开看。
说实话,我第一次看SM4的算法文档时,觉得它结构简洁得有点“平淡”。但后来在项目中实际优化实现时才发现,这种设计的容错性和可验证性非常好。尤其在密钥边界场景下,很小的设计偏差点都能被Feistel结构有效的扩散。
1.4 与AES的对比
做安全评估的时候,总有人问我:SM4跟AES比,到底差在哪?从安全强度上看,128位密钥的SM4并没有明显的短板。但从工程实现角度,有几个差异点值得你注意。
- S盒不同——SM4的S盒是8×8固定查找表,AES的S盒基于有限域GF(2⁸)的乘法逆元+仿射变换。SM4的S盒在硬件实现时面积更小。
- 密钥扩展——SM4密钥扩展也用到了轮函数F,跟加解密一模一样的逻辑。AES的密钥扩展更复杂,支持128/192/256位动态长度。
- 轮数——SM4固定32轮,AES-128只10轮。你可能会问,那SM4不是更慢吗?其实轮函数F的每轮计算量比AES小,综合下来速度相当。
我曾经见过一个项目中,有人直接把AES的密钥扩展算法抄过来用在SM4上,结果加解密全乱了。SM4的密钥扩展有一个细节:它跟加解密走的是一样的S盒和线性变换,你这是改一个就得都改,别偷懒。
1.5 在密钥边界中的位置
这门课的主题是“密钥边界应用”,简单说就是密钥在生成、分发、存储、使用、销毁这个生命周期里,跟SM4相关的安全边界设计。我自己的经验是,SM4最容易被忽视的两个边界点,一个是密钥随机性来源,另一个是算法实现的侧信道防护。
你可能要问:算法本身安全,为什么还要考虑“边界”?原因很现实——密码被攻破往往不是算法的问题,而是密钥管理或者实现细节出了漏洞。SM4的轮函数结构对硬件实现很友好,但如果在芯片上不做掩码防护,能量分析攻击就能直接把密钥捞出来。嗯,这个坑我踩过,后面章节会专门讲。
好了,SM4的基础和标准脉络先梳理到这儿。记住两个核心:128位、32轮Feistel结构。后面的章节,我们就会围绕这两个核心,在密钥边界实战场景里一步步展开。