一、国密算法概述:SM2/SM3/SM4/SM9 算法介绍
各位同学,咱们今天正式开讲《国密算法与 TEE 接口适配实战》的第一章。说实话,每次讲国密,我都会想起几年前第一次在项目中对接国密算法的场景——那时候文档不全,标准刚出,踩了不少坑。今天我把这些经验揉碎了讲给你听,希望能帮你少走弯路。
1.1 国密算法家族:SM2、SM3、SM4、SM9
国密算法,说白了就是国家密码管理局发布的一套商用密码标准。目前最核心的是这四个:SM2、SM3、SM4、SM9。我习惯把它们分成两类:对称与非对称,再加一个哈希。
| 算法 | 类型 | 密钥长度 | 典型用途 |
|---|---|---|---|
| SM2 | 非对称(椭圆曲线) | 256 位 | 数字签名、密钥交换、加密 |
| SM3 | 密码杂凑(哈希) | 256 位输出 | 完整性校验、数字签名辅助 |
| SM4 | 对称(分组密码) | 128 位 | 数据加密、通信加密 |
| SM9 | 非对称(基于标识) | 256 位 | 无证书的签名与加密 |
SM2 是我用得最多的。它基于椭圆曲线,256 位密钥就能达到 RSA 2048 位的安全强度。我在做 TEE 适配时发现,SM2 的签名验签流程跟 ECDSA 很像,但细节上有差异——比如哈希预处理和签名输出的格式。嗯,这里要注意,千万别直接用国际算法的库去套。
SM3 呢,输出 256 位哈希值。我记得第一次跑 SM3 的测试向量,发现它跟 SHA-256 的结构确实有相似之处,但消息扩展和压缩函数完全不同。你想想看,如果混用,验签肯定过不了。
SM4 是对称加密,128 位密钥,分组大小也是 128 位。它的轮函数结构跟 AES 不一样,但加密速度很快。我在项目中用它加密 TEE 内部存储的敏感数据,性能完全够用。
SM9 比较特殊,它基于双线性对,不需要证书。用户直接用标识(比如邮箱、手机号)就能加解密。说实话,SM9 在 TEE 里适配起来稍微麻烦一点,因为双线性对运算比较重,但好处是省掉了证书管理。
核心要点: 国密算法不是简单地把国际算法改个名。SM2、SM3、SM4、SM9 各有各的数学基础和实现细节。在 TEE 里做适配时,必须严格按照国密标准来,不能偷懒复用国际算法的代码。
1.2 国密标准体系
国密的标准体系,我把它分成三层:基础算法、安全协议、应用规范。咱们做 TEE 适配,主要关注基础算法层和协议层。
- 基础算法标准: GM/T 0003(SM2)、GM/T 0004(SM3)、GM/T 0002(SM4)、GM/T 0044(SM9)。这些是算法的数学定义和接口规范。
- 安全协议标准: GM/T 0009(SM2 密码算法使用规范)、GM/T 0010(SM2 密码算法加密签名消息语法)。这些规定了算法怎么用在协议里。
- 应用规范: GM/T 0028(密码模块安全要求)、GM/T 0054(信息系统密码应用基本要求)。这些是合规性检查的依据。
我个人习惯把 GM/T 0003 和 GM/T 0004 打印出来放在手边。因为 TEE 的接口适配,最常查的就是这两个文档。比如 SM2 的签名输出格式是 r || s 还是 DER 编码,标准里写得清清楚楚。
避坑指南: 我曾经在项目中直接用了 OpenSSL 的 SM2 实现,结果发现它跟国标 GM/T 0003 的签名输出格式不一致。OpenSSL 默认输出 DER 编码,但国标要求的是原始 r || s 格式。后来我不得不加了一层格式转换。所以,建议你直接用国密标准的参考实现,或者仔细核对接口文档。
1.3 国密与国际算法对比
很多同学问我:国密跟国际算法到底差在哪?我一般从三个维度来对比:安全性、性能、合规性。
| 对比维度 | 国密算法 | 国际算法 |
|---|---|---|
| 非对称 | SM2(256 位 ECC) | RSA(2048 位)、ECDSA(256 位) |
| 哈希 | SM3(256 位) | SHA-256 |
| 对称 | SM4(128 位) | AES(128/256 位) |
| 安全强度 | SM2 ≈ ECDSA 256 位 | RSA 2048 位 ≈ ECC 224 位 |
| 性能 | SM2 签名快,SM4 加密快 | ECDSA 签名快,AES 加密快 |
| 合规性 | 国内商用密码必选 | 部分行业受限 |
你想想看,为什么国密要用 SM2 而不是 RSA?因为椭圆曲线在同等安全强度下,密钥更短、计算更快。SM2 的 256 位密钥,安全强度跟 RSA 2048 位差不多,但签名速度能快好几倍。我在 TEE 里做签名时,SM2 的延迟明显比 RSA 低。
SM3 跟 SHA-256 比,输出长度一样,但 SM3 的压缩函数设计更保守一些。我记得有篇论文分析过,SM3 的抗碰撞能力跟 SHA-256 在同一量级。不过在实际项目中,我更关心的是:TEE 的硬件加速单元是否支持 SM3?如果不支持,纯软件跑 SM3 会比 SHA-256 慢一点。
SM4 跟 AES 比,结构上都是 SPN 网络,但 SM4 的轮数更多(32 轮 vs AES 的 10/12/14 轮)。不过 SM4 的轮函数更简单,所以整体性能跟 AES-128 差不多。我在项目中用 SM4 加密 4KB 的数据块,延迟在微秒级,完全能满足 TEE 的性能要求。
注意事项: 国密算法虽然跟国际算法在数学上有相似之处,但绝不能直接替换。比如 SM2 的签名验签流程中,哈希算法必须用 SM3,不能用 SHA-256。否则验签会失败。这是合规性检查的重点,也是 TEE 适配中容易踩的坑。
1.4 国密算法知识体系总览
下面这张图是我自己整理的国密算法知识体系。你可以把它当作本章的思维导图,后面讲到 TEE 适配时,会反复用到这些概念。
这张图把国密算法的核心脉络串起来了。从 SM2/SM3/SM4/SM9 四个基础算法,到它们的典型应用场景,再到标准体系,最后落到咱们这门课的核心——TEE 接口适配。后面的章节,我们会一步步深入每个算法在 TEE 里的具体实现。
1.5 小结
这一章我们快速过了一遍国密算法的全貌。SM2、SM3、SM4、SM9 各有各的定位,标准体系也相对完善。跟国际算法比,国密在安全强度上不输,在合规性上更是必选项。下一章开始,我们会深入 SM2 的数学原理和 TEE 适配细节。到时候我会拿实际代码出来,咱们一起跑一遍。
嗯,今天就到这儿。有什么问题,咱们课后交流。