1. SM2 算法概述:国密标准背景、算法特点与对比分析

各位同学,咱们今天聊聊 SM2。说实话,我刚接触国密那会儿,第一反应是“又一套标准要学”。但真正用起来之后,我发现 SM2 的设计思路其实挺有意思的。它不像某些算法那样“为了不同而不同”,而是真的在安全性和性能上做了不少优化。

1.1 国密标准背景:为什么要有自己的密码算法?

先说说背景。你想想看,密码学这东西,本质上就是国家网络安全的“地基”。如果地基用的全是别人的砖,那风险可想而知。

2010 年,国家密码管理局正式发布了 SM2 椭圆曲线公钥密码算法标准(GM/T 0003-2012)。我记得当时圈内不少人都在讨论:终于有一套完整的、自主可控的非对称密码体系了。

这套标准包含四个核心部分:

  • 数字签名算法 — 用于身份认证和完整性校验
  • 密钥交换协议 — 用于双方安全地协商会话密钥
  • 公钥加密算法 — 用于数据加密传输
  • 椭圆曲线参数 — 定义了具体的曲线方程和基点

核心要点:SM2 不是凭空造出来的轮子。它基于国际公认的 ECC 椭圆曲线密码体系,但在曲线参数、签名流程、密钥派生等方面做了中国自己的优化。说白了,底层数学原理和 ECC 一致,但具体实现是“中国配方”。

1.2 SM2 算法特点:它到底强在哪?

我个人习惯把 SM2 的特点总结为三个关键词:安全、高效、合规。

1.2.1 安全性:256 位曲线,等效 RSA 3072

SM2 使用一条 256 位的素域椭圆曲线。你可能要问:256 位够用吗?

我直接给你一个对比数据:

算法 密钥长度 安全强度(等效对称密钥)
SM2 256 位 128 位
RSA 3072 位 128 位
ECC(secp256k1) 256 位 128 位

看到了吗?SM2 用 256 位密钥就达到了 RSA 3072 位的安全等级。这在存储空间和传输带宽上优势非常明显。我在做嵌入式安全存储项目时,SM2 的公钥只占 64 字节(未压缩),而 RSA 2048 的公钥要 256 字节。对于 IoT 设备来说,这差距就是能不能跑得动的区别。

1.2.2 性能:签名快,加密稍慢

SM2 的签名速度比 RSA 快很多,但加密速度略慢于 RSA。不过在实际项目中,加密操作通常只针对对称密钥(比如 SM4 的密钥),数据量很小,所以这个差异基本可以忽略。

实战经验:我曾经在一个金融数据交换项目中,用 SM2 做签名验签。单次签名耗时约 0.8ms(基于 OpenSSL 1.1.1 的国密版),验签约 1.2ms。而同等安全强度的 RSA 3072,签名要 3-5ms。对于高频交易场景,这个差距就是能不能上线的关键。

1.2.3 合规性:等保 2.0 和密评的硬门槛

这一点不用我多说。等保 2.0 和商用密码应用安全性评估(密评)明确要求:涉及国家秘密和关键信息基础设施的系统,必须使用国密算法。SM2 是其中最重要的非对称算法。

注意:很多项目在等保测评时被卡,就是因为还在用 RSA 或国际 ECC。我建议你在系统设计阶段就把 SM2 加进去,不然后期改造的成本非常高。我曾经见过一个项目,因为前期用了 RSA,后期改 SM2 导致整个证书体系重做,光测试就多花了两个月。

1.3 SM2 vs RSA vs ECC:一张表看懂区别

很多同学会问:SM2 和 ECC 到底是不是一回事?和 RSA 比又怎么样?

我直接给你一个对比表,这样最清楚:

对比维度 SM2 RSA ECC(国际标准)
数学基础 椭圆曲线离散对数 大整数分解 椭圆曲线离散对数
密钥长度(等效 128 位安全) 256 位 3072 位 256 位
签名速度 快 慢 快
加密速度 中等 快 中等
密钥生成速度 极快 慢 极快
标准归属 中国国密标准 国际标准 国际标准
合规要求 等保/密评强制 部分场景受限 部分场景受限
生态成熟度 中等(近年快速完善) 极高 高

从这张表你能看出来:SM2 在安全强度和性能上与国际 ECC 基本持平,但多了合规这个“必选项”。而 RSA 虽然生态最成熟,但密钥太长、签名太慢,在移动端和 IoT 场景下越来越吃力。

1.4 SM2 的核心知识体系

为了让你对 SM2 有一个整体的认知,我画了一张结构图。它展示了 SM2 在整个国密体系中的位置,以及它内部包含的四个子协议。

SM2 核心知识体系 国密标准体系(SM 系列) SM2 椭圆曲线公钥密码算法 数字签名 SM2-1 密钥交换 SM2-2 公钥加密 SM2-3 曲线参数 SM2-4 身份认证 / 完整性校验 会话密钥协商 数据加密传输 密钥生成基础 安全存储实战(本课程核心) SM2 是国密体系的核心非对称算法,覆盖签名、密钥交换、加密三大功能

从这张图你能看到,SM2 不是单一算法,而是一套完整的密码协议族。我们这门课的核心,就是把这些协议落地到安全存储场景中。

1.5 避坑指南:SM2 使用中的常见误区

最后,我分享几个我在项目中踩过的坑,希望能帮你少走弯路。

  1. 不要混淆 SM2 和 SM3 — SM2 是非对称算法,SM3 是哈希算法。我见过有人把 SM2 的签名结果当哈希值用,结果验签怎么都过不了。
  2. 注意密钥格式 — SM2 的公钥有压缩和未压缩两种格式。未压缩格式是 65 字节(04 + x + y),压缩格式是 33 字节(02/03 + x)。不同库的默认格式可能不同,对接时一定要确认。
  3. 曲线参数必须用国标 — SM2 的曲线参数是固定的(p、a、b、G、n、h)。不要自己随便改,也不要用国际 ECC 的曲线参数冒充 SM2。我曾经在一个项目中看到有人用了 secp256r1 的曲线,然后告诉客户“这就是 SM2”,结果密评直接不通过。
  4. 签名结果编码 — SM2 签名结果通常是 DER 编码的 ASN.1 结构(r || s),长度不固定。有些库输出的是纯字节拼接(r || s),长度固定 64 字节。对接前一定要确认编码方式。

我的建议:如果你刚开始接触 SM2,建议先用成熟的密码库(比如 GmSSL、OpenSSL 国密版、腾讯的 TencentSM)做原型验证。等流程跑通了,再考虑性能优化和定制开发。不要一上来就自己实现椭圆曲线运算,那是个深坑。