国密算法概述

聊国密之前,我先说说自己的经历。几年前给一个政务项目做密码改造,客户要求必须用国密算法,我当时对SM2/SM3/SM4的了解还停留在“听过名字”的阶段。结果测性能时发现SM2签名比RSA慢了一大截,差点被客户投诉。事后复盘才发现——不是算法不行,是我没选对曲线参数。从那以后,我养成了一个习惯:拿到国密需求先看算法细节,再谈性能优化。

国密标准简介

国密(国家商用密码算法)是中国密码行业标准,由密码管理局发布。目前最核心的三个算法是:

  • SM2 —— 非对称密码(公钥密码),基于椭圆曲线
  • SM3 —— 密码杂凑(哈希)算法
  • SM4 —— 对称分组密码

此外还有SM9(标识密码)和ZUC(序列密码),但咱们这堂课主要围绕前三者。你想想看,一个完整的安全通信场景,通常需要这三者搭配使用:SM2做密钥交换和签名,SM3做完整性校验,SM4做数据加密。

算法 类型 密钥长度(位) 输出长度(位) 核心操作
SM2 非对称 256(私钥) 签名/密文不定 椭圆曲线点乘
SM3 哈希 — 256 消息扩展+压缩
SM4 对称 128 128(分组) Feistel 网络

SM2 算法原理

SM2 本质上就是椭圆曲线密码学(ECC)的国标实现。它使用的曲线是 sm2p256v1,一条256位的素域曲线。说白了,它跟 ECDSA 和 ECDH 有点像,但具体参数和运算细节有差异。

SM2 支持三个功能:

  • 数字签名:发送方用自己的私钥签名,接收方用公钥验签。
  • 公钥加密:用接收方公钥加密数据,接收方用私钥解密(混合加密模式,对称密钥用SM4)。
  • 密钥交换:双方通过各自的私钥和对方的公钥,协商出共享密钥。

我在项目中遇到过一个问题:SM2 签名时如果随机数(k)生成不够随机,私钥会泄露。这可不是危言耸听,当年 Android 上的比特币钱包就因为随机数问题被攻击过。所以国密 SDK 里一定要用带参数的 SM2 签名接口,比如带上 userID,别图省事用默认的空字符串。

小提示: SM2 签名结果格式是 DER 编码的 (r, s),长度通常为 70~72 字节。验签时注意不要漏掉这个固定前缀设计。

SM3 算法原理

SM3 是一个 256 位的密码杂凑算法,设计上参考了 SHA-256,但做了若干改进(比如消息扩展轮数更多)。它的结构比较清晰:对输入消息做填充、分块,然后经过 64 轮压缩函数,最终得到 256 位摘要。

我个人觉得 SM3 的代码实现比 SM2 简单多了。很多开源库(比如 OpenSSL 1.1.1+)已经内置了 SM3,直接调 EVP_sm3() 就行。如果你需要自己实现,注意消息填充规则:先补一个 0x80,再补零,最后附加 64 位长度值(小端还是大端?SM3 是大端,跟 SHA-256 一样)。

对了,有个坑:SM3 的初始向量(IV)是固定的 8 个 32 位字:0x7380166f, 0x4914b2b9, ...,别写错了。我曾经在移植时抄错了一个 IV 值,导致摘要完全对不上,调试了整整一天——嗯,后来写了单元测试,再也没出过这种低级错误。

SM4 算法原理

SM4 是一种分组密码,分组长度 128 位,密钥长度也是 128 位。它采用的是 Feistel 网络结构,也就是每轮把数据分成左右两半,右半经过轮函数 F 后与左半异或,再交换。SM4 共有 32 轮,轮密钥由主密钥通过密钥扩展算法生成。

其实 SM4 在结构上跟 AES 完全不同(AES 是 SPN 结构),所以性能对比时不能简单套 AES 的优化思路。SM4 的 S 盒是固定的,轮函数里包含非线性变换 τ 和线性变换 L。我个人习惯用查表法实现 S 盒,速度比布尔表达式快很多。

// SM4 轮函数伪代码(C 风格)
uint32_t sm4_f(uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3, uint32_t rk) {
    uint32_t tmp = sm4_linear_transform(sm4_sbox_transform(x1 ^ x2 ^ x3 ^ rk));
    return x0 ^ tmp;
}
注意: SM4 有五个工作模式:ECB、CBC、CFB、OFB、CTR。商用场景下强烈建议用 CBC 或 CTR,不要直接用 ECB,否则相同明文块会产生相同密文,容易泄漏模式。

应用场景

说到应用场景,我把它分成三大类:

  • 金融支付:银行、第三方支付都用国密 SM2/SM3/SM4 做交易签名、数据加密。比如银联的 POS 机终端,据说已经全面切换国密了。
  • 政务系统:电子政务、电子证照、公文流转,必须用国密。我去年做过一个政府 OA 的密码改造,SM2 证书替换 RSA 证书,SM3 替换 SHA-256,SM4 替换 AES。
  • 物联网:设备间通信轻量级加密,SM4 在低功耗芯片上表现不错,SM2 做设备身份认证。

当然,也有不那么紧急的场景,比如个人云盘加密——虽然没强制要求国密,但如果你做的是国产化产品,最好也支持一下。

国密算法知识体系 国密标准体系 SM2 非对称 SM3 杂凑 SM4 对称 签名 加密 密钥交换 校验/摘要 加密 解密 模式扩展 应用场景 金融支付 · 政务系统 · 物联网 · 国产化改造

核心要点

  • 国密算法 ≠ 单纯算法替代,需要理解曲线参数、填充、模式等工程细节。
  • 实际项目中,SM2 性能瓶颈在曲线点乘,SM3 和 SM4 软件实现通常足够快。
  • 合规性是前提,但性能优化也重要——我在一个 IoT 网关项目中,把 SM4 从 ECB 改成 CTR 模式后,吞吐量翻了一倍。

好了,这一章先帮你搭起国密的骨架。后面我们会一步步深入到每个算法的 SDK 适配细节和性能瓶颈。记住:看懂原理只是第一步,能上手调优才是真本事。