第一章:国密算法概述
1.1 什么是国密算法?
国密算法,全称是国家商用密码算法。说白了,就是咱们国家自己定的一套密码标准。我在刚接触信息安全那几年,总觉得用国际算法就够了,直到参与一个政务系统项目,客户明确要求必须采用国密——这才意识到,国密不是可选项,而是合规的硬门槛。
目前最核心的四个算法是:SM2、SM3、SM4、SM9。它们分别对标国际上的RSA/ECDSA、SHA-256、AES、基于身份的密码体系。但你别简单理解为“换了个名字”,实现细节和密钥管理上差别挺大。
1.2 国密算法体系:一张图看懂
先给你一张整体的结构图,把四个算法的定位和关系理清楚。我每次带团队做国密适配,第一件事就是画这个图。
1.3 SM2:非对称密码的国标
SM2 是基于椭圆曲线密码(ECC)的非对称算法,支持加密、数字签名和密钥协商。它的曲线参数是国密局专门设计的,不是直接拿 NIST 曲线改个名字。
技术要点:
- 密钥长度 256 位,安全强度等同于 RSA-3072 位。
- 签名算法采用 SM3 杂凑值作为消息摘要。
- 加密算法输出密文长度比原文多 97 字节(含辅助数据)。
1.4 SM3:密码杂凑算法
SM3 输出 256 位杂凑值,设计上吸收了 SHA-256 的思想,但做了改进。它的压缩函数轮数 64 轮,跟 SHA-256 一样,但消息扩展和置换运算不同。
我个人的实际感受:SM3 的软件实现速度跟 SHA-256 差不多,但在硬件加速上还没有像 Intel SHA 扩展那样的指令集支持,所以嵌入式场景下要留意性能。
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 你需要准备什么?
如果你跟我一样是偏工程落地的,那这几种资料建议提前备好:
- 国密标准原文:GB/T 32918(SM2)、GB/T 32905(SM3)、GB/T 32907(SM4)、GB/T 38636(SM9)。读标准要花时间,但很多细节(比如密钥长度、填充方式)只有原文最准。
- 开源实现参考:推荐 BouncyCastle 的国密支持,或者 GmSSL 项目。跑一遍测试向量,用结果验证自己的理解。
- 硬件设备手册:如果你用国密加密卡或安全芯片,拿到它的 API 文档,看它支持哪些模式、密钥导入方式、随机数来源。
1.10 本章小结
国密算法不是简单翻译,它有自己的灵魂。四个核心算法(SM2/SM3/SM4/SM9)覆盖了非对称、杂凑、对称、标识密码四个领域。和国际算法相比,它们在数学基础、密钥管理、编码方式上都有差异。这些差异既是障碍,也是考验我们工程能力的机会。