一、国密算法概述:SM2 / SM3 / SM4 简介与背景
好,咱们正式开始。这门课的主题是《国密算法替换日志兼容性实战》。
第一讲,我先带大家把三个核心算法——SM2、SM3、SM4——的基本概念和背景理清楚。
你想想看,为什么这两年所有跟金融、政务、 央企相关的项目,都得把算法切过来?说白了,就是替换国外商用密码算法体系。
我从2018年就开始做国密改造了。那时候很多厂商连SM2的签名格式都没统一,调个接口能卡三天。现在虽然规范多了,但真要落地,还是得先把这些算法“掰开揉碎”了再动手。
1.1 为什么要有国密算法?
其实逻辑很简单。以前我们的电子签名、数据加密大量依赖RSA、AES、SHA-256这些国际标准算法。
如果哪天外部环境变了,这些算法被禁用或者出现后门,那底层的基础设施就直接瘫痪了。
国密算法的目的,就是建立一套我们自己可控、安全强度足够、并且公开透明的密码标准。
- 安全自主可控:不受国外专利或者出口管制条款限制。
- 合规必须:不做国密改造,很多行业的商用系统没办法通过等保测评。
- 性能与安全兼顾:比如SM2在同等安全强度下,密钥长度比RSA短很多。
1.2 SM2:非对称密码算法
SM2是基于椭圆曲线密码体制(ECC)的公钥密码算法。我先提个醒:它不是单纯的签名或加密,它是一整套体系,包含数字签名、密钥交换、数据加密三个子功能。
SM2 核心参数对比
| 对比项 | RSA-2048 | SM2 |
|---|---|---|
| 密钥生成速度 | 较慢 | 快(约10倍) |
| 签名长度 | 256字节 | 64字节(r,s各32) |
| 安全强度 | 112位左右 | 128位左右 |
| 公钥长度 | 256字节 | 65字节 |
可以看到,SM2的签名和公钥长度都比RSA短很多。这在日志传输、存储时的兼容性处理上,其实是优势。但我之前改过一套旧系统,它的日志字段硬编码了256字节的RSA签名长度,改成SM2反而要重新调格式。嗯,这里要注意。
1.3 SM3:密码杂凑算法
SM3对应的国际算法是SHA-256。它输出256位(32字节)的摘要值。
从算法结构上看,SM3扩展了消息字,压缩函数做了更多轮次的置换。所以它的抗碰撞性在理论上比SHA-256略高一点。
- 输出长度:固定32字节,这个在日志里最容易处理。不论输入多长,摘要都是32字节。
- 典型应用:数字签名中的消息摘要、完整性校验、HMAC。
- 性能:我实测过一次,在Intel Xeon上SM3的吞吐大概是SHA-256的70%左右。不算差,但要注意嵌入式设备上性能可能会有瓶颈。
1.4 SM4:对称分组密码算法
SM4是对称算法,密钥长度128位,分组长度也是128位。对应的国际算法是AES-128。
这里有个细节——SM4的密钥扩展算法和轮函数与AES完全不同。S盒、线性变换、轮数都是重新设计的。
在日志兼容性上,SM4有几个常见坑:
- 填充方式:SM4标准里默认使用PKCS7填充。但很多老系统用AES的PKCS5(其实是同一个东西),直接迁移没问题。但如果你遇到了自己实现填充的代码,那改起来就是噩梦。
- IV向量长度:SM4在CBC模式下,IV是16字节,和AES一样。改起来比较平滑。
- 加解密对象:SM4是分组加密,不能直接对无限长度流加密。如果你原来的日志加密方案是直接用AES硬扛,那换成SM4后,必须确认管道模式是否支持。
1.5 三者的体系关系
这三个算法不是孤立的,它们组合成一个完整的密码体系:
- 信道加密 / 敏感数据保护:SM4对称加密 + SM2密钥协商。
- 身份认证 / 签名验证:SM2签名 + SM3摘要。
- 完整性校验:SM3直接对日志内容做摘要。
下面的SVG图,就是我梳理出来的这个体系关系,方便大家记忆。
1.6 写在前面:日志兼容性的核心思路
这门课为什么叫“日志兼容性实战”?很简单。
你换算法不是换完就完了。日志系统里到处是算法痕迹:签名值、摘要值、加密密文、密钥标识、算法版本号。这些字段之前全部按照国际标准的长度和格式写的。
如果你直接替换成国密算法,日志解析逻辑肯定出问题。拼接、切分、字段长度硬编码、正则表达式全部要跟着动。
我个人习惯,做替换前先做一次全量日志字段的“算法映射审计”。
- SM2:65字节公钥 + 64字节签名,不是RSA的256字节。
- SM3:固定32字节摘要,能和SHA-256对齐长度。
- SM4:16字节分组,注意填充模式,优先走CBC。
把这三点刻在脑子里,后面的章节咱们再说具体怎么在日志系统里调格式、改代码、跑回归。