第一章:国密算法概述

1.1 什么是国密算法?

国密算法,全称是国家商用密码算法。说白了,就是咱们国家自己定的一套密码标准。我在刚接触信息安全那几年,总觉得用国际算法就够了,直到参与一个政务系统项目,客户明确要求必须采用国密——这才意识到,国密不是可选项,而是合规的硬门槛。

目前最核心的四个算法是:SM2、SM3、SM4、SM9。它们分别对标国际上的RSA/ECDSA、SHA-256、AES、基于身份的密码体系。但你别简单理解为“换了个名字”,实现细节和密钥管理上差别挺大。

我的习惯:刚上手国密时,先别急着怼代码。把每个算法的密钥长度、算法模式、标准文档下载下来,跟国际算法对照着看一遍。避坑最有效的方式,就是“先理解,再动手”。

1.2 国密算法体系:一张图看懂

先给你一张整体的结构图,把四个算法的定位和关系理清楚。我每次带团队做国密适配,第一件事就是画这个图。

国密算法体系结构 国密标准体系 (SM系列) SM2 非对称加密/签名 SM3 密码杂凑 (256位) SM4 对称加密 (128位) SM9 标识密码 (IBC) 对标 RSA/ECDSA 对标 SHA-256 对标 AES-128 对标 IBE (BF) 说明 SM2/SM3/SM4/SM9 是国密标准的核心算法 各自对应国际算法体系中的成熟方案,但密钥生成、签名、加密流程有差异 适配时务必同时参考国密标准(GB/T 32918、GB/T 32905、GB/T 32907、GB/T 38636)

1.3 SM2:非对称密码的国标

SM2 是基于椭圆曲线密码(ECC)的非对称算法,支持加密、数字签名和密钥协商。它的曲线参数是国密局专门设计的,不是直接拿 NIST 曲线改个名字。

技术要点:

  • 密钥长度 256 位,安全强度等同于 RSA-3072 位。
  • 签名算法采用 SM3 杂凑值作为消息摘要。
  • 加密算法输出密文长度比原文多 97 字节(含辅助数据)。
注意:SM2 的公钥格式与 X.509 标准不兼容。我接手过一个项目,直接用 Java 的 KeyFactory 导入 SM2 公钥,结果一直报错。原因是国标公钥的 OID 和编码方式跟国际算法不一样。解决方案是用 BouncyCastle 的国密 provider 或者自己写解析器。

1.4 SM3:密码杂凑算法

SM3 输出 256 位杂凑值,设计上吸收了 SHA-256 的思想,但做了改进。它的压缩函数轮数 64 轮,跟 SHA-256 一样,但消息扩展和置换运算不同。

我个人的实际感受:SM3 的软件实现速度跟 SHA-256 差不多,但在硬件加速上还没有像 Intel SHA 扩展那样的指令集支持,所以嵌入式场景下要留意性能。

我曾经踩过的坑:在 TLS 握手过程中,把 SM3 当成 SHA-256 直接塞进去,结果证书签名验证失败。因为 SM3 输出的杂凑值虽然也是 256 位,但 HMAC-SM3 的结构参数与 HMAC-SHA256 不一样,不能混用。

1.5 SM4:对称加密算法

SM4 是 128 位分组密码,密钥长度也是 128 位。结构上属于 Feistel 网络,轮数 32 轮。我喜欢把它比作“国标 AES”,但它的 S 盒和密钥扩展算法完全是自主设计的。

SM4 支持的工作模式跟 AES 一样:ECB、CBC、CFB、OFB、CTR、GCM(SM4-GCM 有独立标准)。适配时注意:很多硬件加密芯片只实现了 SM4-ECB 和 SM4-CBC,要用 GCM 模式得看芯片是否支持。

特性 SM4 AES-128
分组大小 128 bit 128 bit
密钥长度 128 bit 128 bit
轮数 32 10
结构 Feistel 网络 SPN
软件速度 约 1.2 Gbps (现代CPU) 约 2.5 Gbps (带AES-NI)

你想想看,SM4 轮数 32 轮,AES 才 10 轮,所以 SM4 的软件实现通常比 AES 慢一些。但是国密芯片一般有 SM4 硬件加速,实测性能跟 AES-NI 不相上下。所以做产品选型时,要确认是否用硬件加速。

1.6 SM9:标识密码算法

SM9 是基于椭圆曲线双线性对(配对)的标识密码(IBC)。它的特点是:不需要数字证书,直接用用户标识(比如邮箱、手机号)作为公钥。私钥则交给密钥生成中心(KGC)生成并分发。

这个算法在物联网和电子邮件加密场景很有优势——不用维护 CA 和证书吊销列表(CRL)。但代价是:用户必须信任 KGC,因为 KGC 掌握所有用户的私钥。这就是所谓的“密钥托管”问题。

适用场景提醒:我见过一个金融机构的项目,用 SM9 做内部邮件加密,因为 KGC 部署在内部网络,密钥托管反而是安全控制的加分项。但要是做互联网面向用户的产品,SM9 的托管特性就可能成为合规风险。

1.7 国密标准体系与国际算法对比

国密标准不是简单“换皮”,每个算法都有独立的数学基础和实现细节。下面这张表是适配时的核心对照,建议你保存下来。

国密算法 国际对应 主要差异 适配关注点
SM2 ECDSA / ECIES 曲线参数不同,签名计算顺序不同(先 r 后 s? 实际上顺序一致但计算过程不同) 密钥格式 OID、签名值编码、加密输出长度
SM3 SHA-256 消息扩展算法不同,初始化向量不同 HMAC-SM3 的 ipad/opad 与 HMAC 标准一致,但杂凑函数本身需替换
SM4 AES-128 算法结构不同,轮数32,S盒不同 工作模式兼容性,硬件加速支持,密钥扩展API差异
SM9 BF-IBE / Boneh-Franklin 使用不同的配对参数和哈希到曲线方法 KGC部署、密钥封装方式、用户标识编码

1.8 为什么你需要了解这些差异?

直接说结论:如果你只是把国际算法的调用换成国密算法的调用,大概率会出 bug。因为密钥管理的流程变了——SM2 的密钥生成需要随机数质量保证;SM9 需要跟 KGC 交互获取私钥;SM4 的硬件加速接口可能跟 OpenSSL 不一样。

我记得第一次做国密适配的时候,照着文档把 SM2 签名算法代码敲完,结果验签总是失败。查了两天才发现:签名值的 ASN.1 编码方式跟 ECDSA 有一点细微差别——SM2 的 r 和 s 是大端序,但有些国际实现用 DER 编码时要求最小长度表示法。最后我直接用国密标准里定义的明文编码方式才通过。

所以后面我在团队里定了个规矩:每次算法替换,至少花一天时间对比标准文档中的测试向量。宁可慢一点,别让线上出合规事故。

1.9 你需要准备什么?

如果你跟我一样是偏工程落地的,那这几种资料建议提前备好:

  1. 国密标准原文:GB/T 32918(SM2)、GB/T 32905(SM3)、GB/T 32907(SM4)、GB/T 38636(SM9)。读标准要花时间,但很多细节(比如密钥长度、填充方式)只有原文最准。
  2. 开源实现参考:推荐 BouncyCastle 的国密支持,或者 GmSSL 项目。跑一遍测试向量,用结果验证自己的理解。
  3. 硬件设备手册:如果你用国密加密卡或安全芯片,拿到它的 API 文档,看它支持哪些模式、密钥导入方式、随机数来源。
我的一个小习惯:建一个“国密适配检查清单”,把算法参数、密钥格式、编码规则一条条列出来。每适配一个模块,就打勾验证。这个清单后来变成了团队的标准操作流程。

1.10 本章小结

国密算法不是简单翻译,它有自己的灵魂。四个核心算法(SM2/SM3/SM4/SM9)覆盖了非对称、杂凑、对称、标识密码四个领域。和国际算法相比,它们在数学基础、密钥管理、编码方式上都有差异。这些差异既是障碍,也是考验我们工程能力的机会。