一、国密算法概述:SM2 / SM3 / SM4 简介与背景

好,咱们正式开始。这门课的主题是《国密算法替换日志兼容性实战》。

第一讲,我先带大家把三个核心算法——SM2、SM3、SM4——的基本概念和背景理清楚。

你想想看,为什么这两年所有跟金融、政务、 央企相关的项目,都得把算法切过来?说白了,就是替换国外商用密码算法体系。

我从2018年就开始做国密改造了。那时候很多厂商连SM2的签名格式都没统一,调个接口能卡三天。现在虽然规范多了,但真要落地,还是得先把这些算法“掰开揉碎”了再动手。

1.1 为什么要有国密算法?

其实逻辑很简单。以前我们的电子签名、数据加密大量依赖RSA、AES、SHA-256这些国际标准算法。

如果哪天外部环境变了,这些算法被禁用或者出现后门,那底层的基础设施就直接瘫痪了。

国密算法的目的,就是建立一套我们自己可控、安全强度足够、并且公开透明的密码标准。

核心背景: 2017年之后,等保2.0和《密码法》相继落地,金融、医疗、政务等行业被明确要求“应改尽改”。说白了,这不是选项,是硬性合规指标。
  • 安全自主可控:不受国外专利或者出口管制条款限制。
  • 合规必须:不做国密改造,很多行业的商用系统没办法通过等保测评。
  • 性能与安全兼顾:比如SM2在同等安全强度下,密钥长度比RSA短很多。

1.2 SM2:非对称密码算法

SM2是基于椭圆曲线密码体制(ECC)的公钥密码算法。我先提个醒:它不是单纯的签名或加密,它是一整套体系,包含数字签名、密钥交换、数据加密三个子功能。

个人经验: 我在项目中遇到过一个问题——很多开发者以为SM2公钥就是32字节。不对。SM2公钥包括04前缀 + 32字节x坐标 + 32字节y坐标,一共65字节。这个长度差异,是日志兼容性最容易踩的坑。

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%左右。不算差,但要注意嵌入式设备上性能可能会有瓶颈。
建议: 日志系统里如果需要做完整性校验,我个人建议直接用SM3。我曾经见过有团队直接用MD5的配置参数套SM3,结果日志摘要格式乱掉。SM3和MD5的输出长度差了整整一倍,不能直接替换。

1.4 SM4:对称分组密码算法

SM4是对称算法,密钥长度128位,分组长度也是128位。对应的国际算法是AES-128。

这里有个细节——SM4的密钥扩展算法和轮函数与AES完全不同。S盒、线性变换、轮数都是重新设计的。

在日志兼容性上,SM4有几个常见坑:

  1. 填充方式:SM4标准里默认使用PKCS7填充。但很多老系统用AES的PKCS5(其实是同一个东西),直接迁移没问题。但如果你遇到了自己实现填充的代码,那改起来就是噩梦。
  2. IV向量长度:SM4在CBC模式下,IV是16字节,和AES一样。改起来比较平滑。
  3. 加解密对象:SM4是分组加密,不能直接对无限长度流加密。如果你原来的日志加密方案是直接用AES硬扛,那换成SM4后,必须确认管道模式是否支持。
避坑指南: 我曾经见过一个项目,日志模块用SM4-ECB模式加密敏感数据字段。结果发现ECB模式下相同明文会得到相同密文,违反了合规审计的反推论要求。后来全部改成了CBC模式。你记得,SM4也支持CBC,咱们尽量用CBC。

1.5 三者的体系关系

这三个算法不是孤立的,它们组合成一个完整的密码体系:

  • 信道加密 / 敏感数据保护:SM4对称加密 + SM2密钥协商。
  • 身份认证 / 签名验证:SM2签名 + SM3摘要。
  • 完整性校验:SM3直接对日志内容做摘要。

下面的SVG图,就是我梳理出来的这个体系关系,方便大家记忆。

国密算法体系关系图(SM2 / SM3 / SM4) SM2 非对称算法 签名 / 验签 / 密钥交换 SM3 密码杂凑 摘要输出 / 完整性校验 SM4 对称分组密码 加密 / 解密 / 数据保护 签名前摘要 加密前校验 典型应用场景 1. 信道加密:SM4(对称) + SM2(密钥协商) + SM3(握手验证) 2. 数字签名:SM2(私钥签名) + SM3(消息摘要) 3. 日志完整性:SM3(逐条/批量摘要) + SM4(可选加密)

1.6 写在前面:日志兼容性的核心思路

这门课为什么叫“日志兼容性实战”?很简单。

你换算法不是换完就完了。日志系统里到处是算法痕迹:签名值、摘要值、加密密文、密钥标识、算法版本号。这些字段之前全部按照国际标准的长度和格式写的。

如果你直接替换成国密算法,日志解析逻辑肯定出问题。拼接、切分、字段长度硬编码、正则表达式全部要跟着动。

我个人习惯,做替换前先做一次全量日志字段的“算法映射审计”。

本章要点(记住这三个):
  • SM2:65字节公钥 + 64字节签名,不是RSA的256字节。
  • SM3:固定32字节摘要,能和SHA-256对齐长度。
  • SM4:16字节分组,注意填充模式,优先走CBC。

把这三点刻在脑子里,后面的章节咱们再说具体怎么在日志系统里调格式、改代码、跑回归。