国密算法简介:SM2/SM3/SM4/SM9 标准体系与合规要求
做安全相关开发的朋友,肯定都知道国密算法。但说实话,真正把它用明白,尤其是在硬件安全模块里搞落地,这里面的坑还挺多的。我个人习惯先把标准体系理清楚,再动手。今天我们就聊聊这四大金刚:SM2、SM3、SM4、SM9。
国密算法不是一堆孤立的算法,而是一套完整的密码套件。你想想看,搞安全不能只靠一把锁,得有钥匙、有验证、有传输加密,还得有身份认证。国密就是把这套东西全包了。
SM2:椭圆曲线公钥密码算法
SM2 是国密里的公钥算法,对标的是国际上的 ECC(椭圆曲线密码)。我最初接触 SM2 时,第一反应是:这不就是 ECC 套个壳吗?其实还真不是。SM2 的曲线参数是自己定义的,用的是一条 256 位的素数域椭圆曲线。
核心要点: SM2 支持密钥交换、数字签名和公钥加密。在 HSM 里,最常用的场景是生成密钥对和做签名运算。
我记得有一次在项目中做密钥迁移,把 RSA 2048 的密钥对换成 SM2。一开始觉得性能应该差不多,结果一测,SM2 签名快了将近一倍。为什么?因为椭圆曲线的密钥长度短,计算量小。说白了,同样的安全强度,SM2 用 256 位密钥就能达到 RSA 2048 的效果。
SM2 的签名算法叫 SM2-DSA,验证过程会用到公钥和杂凑值。这里有个容易踩的坑——
避坑指南: 我曾经在对接某个国密网关时,发现签名一直验证不过。查了半天,原来是 SM2 用的用户 ID 默认值不对。标准规定默认用户 ID 是 "1234567812345678",但有些实现用了空字符串。这种事情,一定要按标准来,别想当然。
SM2 的密钥长度、签名长度和推荐曲线参数,我整理了个表:
| 参数项 | 数值/说明 |
|---|---|
| 密钥长度 | 256 位(公钥压缩格式可短一些) |
| 签名长度 | 512 位(r 和 s 各 256 位) |
| 推荐曲线 | sm2p256v1 |
| 数字信封 | 支持,常与 SM4 配合使用 |
SM3:密码杂凑算法
SM3 就是国密的哈希算法。输出长度 256 位,和 SHA-256 对标。说实话,搞底层硬件的人对 SM3 应该很熟悉,因为在 HSM 里,哈希运算是签名之前的必备步骤。
SM3 的一个特点是消息分组处理。它会先把输入消息填充到 512 位的整数倍,然后每 512 位一顿压缩。压缩函数里有 64 轮迭代,每一轮都用上一些布尔函数和移位操作。
我习惯把 SM3 分成三步看:
- 消息填充:在消息末尾加一个比特 1,然后加 0,直到长度模 512 等于 448。
- 长度追加:加上 64 位的原始消息长度。
- 迭代压缩:对每个 512 位分组做 64 轮计算。
小技巧: 在硬件实现 SM3 时,你可以把 64 轮展开成流水线,这样吞吐量能翻倍。我在某款金融密码机里就用过这个思路,效果不错。
SM3 的一个冷知识是:它和 SM2 的关系很紧密。SM2 签名时,先要对消息做 SM3 杂凑,再对杂凑值签名。这两个算法经常被绑在一起,叫做“SM2+SM3 签名套件”。
SM4:分组密码算法
SM4 是国密里的对称加密算法,分组长度 128 位,密钥长度也是 128 位。对标的是 AES-128。SM4 的结构是个典型的 Feistel 网络,32 轮迭代。
我在项目中遇到过 SM4 和 AES 混用的情况。客户要求既能加密 SM4 数据,又能解密 AES 数据。HSM 里需要同时支持两套 S 盒和密钥扩展逻辑。这其实不难,但要注意密钥存储的隔离。
SM4 的工作模式也值得聊几句:
- ECB 模式:简单但不安全,我从来不用。同一密钥加密相同明文会得到相同密文。
- CBC 模式:需要 IV,适合文件加密。大量数据传输时注意密钥更换频率。
- CTR 模式:可并行,适合硬件加速。我在高速加密卡里常用这个模式。
- GCM 模式:支持认证加密,国密标准也有定义,推荐在通信场景使用。
避坑指南: 曾经有一个项目,SM4-CBC 加密后对齐问题没处理好。你知道的,CBC 模式要求明文长度是 16 字节的整数倍。如果最后一块不够,需要 PKCS#7 填充。那段代码里忘了填充,结果解密时直接报错。对称加密的填充处理,一定要写明确。
SM4 在 HSM 里的典型用途是本地数据加密和会话密钥加密。比如,你给智能门锁下发一个临时密钥,先用 SM4 加密再通过安全通道传过去。
SM9:标识密码算法
最后说 SM9。这个算法很有意思,它不需要数字证书,直接用用户的身份标识(比如邮箱、手机号)作为公钥。说白了,你不需要去 CA 机构申请证书,私钥由密钥生成中心(KGC)算出来。
SM9 有点像 IBE(标识加密),但做了国密化改造。它的数学基础是双线性对,说白了就是椭圆曲线上的一种特殊运算。这个算法在物联网场景特别合适,因为设备数量多,管理证书太麻烦了。
我在一个智慧城市项目中用过 SM9。几万个传感器,每个发一个数字证书不可能。我们让每个传感器的 IMEI 号直接作为 SM9 公钥,KGC 生成对应的私钥烧录进去。上线的效率提升了很多。
SM9 有三种主要功能:
- 加密:用接收方的标识加密数据。
- 签名:用私钥签名,用标识验证签名。
- 密钥交换:双方基于各自标识协商一个会话密钥。
国密合规要求
讲完算法,咱们聊聊合规。你可能以为用了国密算法就合规,其实不是。合规重点在于:
- 标准版本对齐:必须遵循最新版 GB/T 标准。SM2 是 GM/T 0003,SM3 是 GM/T 0004,SM4 是 GM/T 0002,SM9 是 GM/T 0031。
- 芯片级实现:很多合规要求强调算法要在安全芯片或 HSM 内实现,不能纯软件跑。
- 密钥生命周期管理:从生成、存储、使用到销毁,每一步都要有审计日志。
- 检测认证:商用密码产品需获得国家密码管理局的型号证书。
举个实际例子。某银行核心系统要过等保三级,要求用国密。他们采购了支持 SM2/SM3/SM4 的 HSM,但忘了检查合规证明。后来被检查出来,补了三个月的认证流程。所以,选硬件时一定要求厂家提供商用密码产品认证证书。
本章知识体系
把这四个算法的关系画出来,就清楚了:
这张图把 SM2、SM3、SM4、SM9 以及合规和 HSM 实现串起来了。可以看到,SM2 和 SM9 解决公钥问题,SM3 提供完整性校验,SM4 负责数据加密。最后都落到 HSM 里去实现。合规要求是个横切面,每个算法都要过认证。
嗯,国密算法这块儿就说到这儿。你想想看,这四个算法各有各的定位,但在 HSM 里它们其实是协作关系。SM2 做签名握手,SM4 做数据传输加密,SM3 在中间做摘要验证。SM9 是在特定场景下的补充。搞明白这个体系,后面做硬件设计心里就有谱了。