一、SM2算法概述:国密标准背景、算法体系与对比

各位好,我是这次课程的主讲。做密码学工程落地这些年,我接触最多的就是SM2。说实话,刚接触国密那会儿,我也觉得它跟ECDSA差不多,后来踩了几个坑才明白——细节里全是魔鬼。

这一章我们先搭个框架。把SM2的背景、体系结构、以及跟RSA/ECDSA的差异理清楚。后面30章的所有实战,都建立在这个认知基础上。

1.1 国密标准背景

SM2是国家密码管理局在2010年发布的椭圆曲线公钥密码算法标准,标准号GM/T 0003-2012。说白了,这就是咱们中国自己的非对称密码体系。

为什么要搞一套自己的?我个人的理解是:

  • 自主可控:RSA、ECDSA都是国外标准,万一哪天被卡脖子,整个金融、政务系统都得瘫痪。这不是杞人忧天,我在某政务云项目里就遇到过FIPS模块突然不让进口的情况。
  • 安全强度更高:SM2使用256位素域椭圆曲线,安全强度相当于RSA-3072。同样的安全等级,SM2的密钥更短、计算更快。
  • 法律合规:等保2.0、密评、金融行业标准都明确要求使用国密算法。不做?过不了密评,项目直接黄。

核心要点:SM2不是简单的“中国版ECDSA”。它在曲线参数、签名流程、密钥派生上都有独立设计。后面我们会逐项拆解。

1.2 SM2椭圆曲线密码算法体系

SM2不是一个算法,是一整套方案。它包含三个核心部分:

组件 功能 对应国际算法
SM2-1 数字签名 签名生成与验签 ECDSA
SM2-2 密钥交换 双方协商会话密钥 ECDH
SM2-3 公钥加密 数据加密与解密 ECIES

嗯,这里要注意:SM2的签名算法跟ECDSA有个关键区别——它使用了SM3哈希,而且签名过程中引入了用户标识。什么意思?就是签名的时候会把你的ID也揉进去,防止签名被挪用到别的场景。我在做电子签章系统时,就因为这个特性,避免了用户A的签名被复制到用户B的合同上。

SM2的曲线参数是固定的,标准里直接写死了。包括:

  • 素域p:0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
  • 系数a、b:固定值
  • 基点G:标准点坐标
  • 阶n:略小于p的大素数

为什么固定?因为曲线参数如果由用户自己生成,很容易埋后门。我记得2018年有个项目,客户非要自己生成曲线参数,我坚决反对——你想想看,如果参数生成器里藏了陷门,整个系统的安全性就是纸糊的。

我的建议:生产环境中永远使用标准曲线参数。不要自己造轮子,除非你是密码学博士且经过独立审计。

1.3 与RSA/ECDSA的对比

很多同学问我:SM2比RSA强在哪?跟ECDSA比又有什么不同?

我直接上对比表,这样最清楚:

维度 SM2 RSA ECDSA
基础数学 椭圆曲线离散对数 大整数分解 椭圆曲线离散对数
密钥长度 256位 2048~4096位 256位
签名速度 快 慢(私钥操作) 快
验签速度 快 快(公钥操作) 快
加密速度 中等 慢 不直接支持
哈希绑定 SM3(强制) SHA系列 SHA系列
用户标识 签名中嵌入 无 无
标准成熟度 国内成熟,国际一般 全球成熟 全球成熟

从表里能看出几个关键点:

  • 密钥长度优势明显:SM2用256位就能达到RSA 3072位的安全等级。这意味着存储、传输、计算开销都小得多。我在物联网项目里,SM2证书只有几十字节,RSA证书动不动就上千字节,差距巨大。
  • 签名流程不同:SM2签名时会把用户标识Z值算进去。这个Z值由用户ID、曲线参数、公钥共同计算。我曾经遇到过一个问题:两个系统用的用户ID格式不一致,导致签名验证失败。排查了一整天,最后发现是ID末尾多了个换行符。
  • 加密机制独立:SM2的公钥加密不是简单的“ECIES套壳”,它有自己的密钥派生函数KDF,而且输出格式跟国际标准不一样。做跨平台对接时,这块最容易出兼容性问题。

避坑指南:我曾经在对接某银行系统时,对方把SM2密文直接按ASN.1编码,而我这边按原始字节流解析。结果就是——解密出来的数据全是乱码。后来统一了编码格式才解决。记住:SM2密文格式标准里写得很清楚,但实现方经常自己“发挥”。

1.4 SM2算法体系结构图

下面这张图是我自己整理的SM2算法体系结构。画了这么多年架构图,我觉得这张最能说清楚SM2的全貌:

SM2算法体系结构图 SM2算法体系结构 国密标准 GM/T 0003-2012 SM2-1 数字签名 SM2-2 密钥交换 SM2-3 公钥加密 签名生成 (Sign) 验签验证 (Verify) 发起方密钥对 响应方密钥对 → 共享密钥 加密 (Encrypt) 解密 (Decrypt) 底层依赖:SM3哈希算法 + 椭圆曲线运算 (点加/倍点/标量乘) 标准曲线参数:素域p / 系数a,b / 基点G / 阶n 输出:签名值 / 共享密钥 / 密文 用户标识Z值参与签名

这张图我建议你保存下来。后面每一章都会对应到图中的某个模块。比如第5章讲签名实现,你就回到图里看SM2-1那块;第12章讲密钥交换,就看SM2-2那块。这样学起来不会迷路。

1.5 小结

这一章我们做了三件事:

  • 搞清楚了SM2的国密背景——为什么要有它,它解决了什么问题。
  • 梳理了SM2的算法体系——签名、密钥交换、加密,三个组件各司其职。
  • 对比了SM2与RSA/ECDSA的差异——密钥更短、安全更高、流程更复杂。