1. SM2算法概述:国密标准背景、算法家族、与其他公钥算法对比

做密码开发这些年,我经常被问到:「SM2到底是什么?」嗯,这个问题其实挺基础的,但真要讲透还真得花点功夫。今天我们就从国密标准背景、算法家族和横向对比这三个角度,把SM2的来龙去脉理清楚。

1.1 国密标准背景

中国为什么要搞自己的密码标准?说白了,信息安全是国家的命门。早年国内广泛使用RSA、ECC等国际算法,核心专利和技术都握在别人手里。一旦出现贸易封锁或地缘政治纠纷,卡脖子风险极高。

2010年,国家密码管理局正式发布了SM2椭圆曲线公钥密码算法标准(GM/T 0003-2012)。我记得当时刚入行,看到这个标准的第一反应是:终于有自家的算法可以用了。SM2基于椭圆曲线密码学(ECC),安全性等价于RSA-2048,但密钥长度更短、计算效率更高。

国密标准是一个体系,SM2只是其中的公钥密码部分。它和SM3(哈希)、SM4(对称加密)共同构成了国家商用密码的基础设施。目前,金融、政务、电力、交通等关键领域都已强制要求使用国密算法。

一个小经验:我在对接某银行系统时,对方明确要求所有接口必须使用SM2签名,国际算法直接不给过。所以现在做国产化项目,SM2几乎是标配。

1.2 SM2算法家族

SM2不只是「一个」算法,它是一族公钥密码算法的统称,主要包含三个子功能:加密、数字签名、密钥交换。我们一个一个来看。

1.2.1 加密 / 解密

加密是为了保证数据的机密性。SM2采用了椭圆曲线集成加密方案(ECIES)的变体,具体来说是基于椭圆曲线上的离散对数难题。加密时使用接收方的公钥,解密时使用私钥。

我刚开始实现SM2加密时踩过一个坑:SM2加密结果不是单纯的密文,它还包含了椭圆曲线上的一个点(C1)、对称加密的密文(C2)以及校验码(C3)。所以封装接口时千万要注意数据格式,不能直接当字节数组拼起来。

避坑指南:我曾经在解析SM2加密数据时,把C1、C2、C3的顺序弄反了,导致解密一直失败。标准规定了具体的数据组织方式——ASN.1 DER编码格式,别自己发明格式。

1.2.2 数字签名 / 验签

签名用于保证数据的完整性和不可否认性。SM2签名算法基于椭圆曲线上的离散对数问题,类似于ECDSA但有自己的参数和哈希处理方式。签名时使用私钥,验签时使用公钥。

SM2签名有一个独特的地方:它内部使用了SM3哈希算法。也就是说,签名前先对消息算SM3摘要,再对摘要进行签名运算。这和ECDSA使用SHA-256不同。

1.2.3 密钥交换

密钥交换允许两方在不安全的信道上协商出一个对称密钥。SM2的密钥交换协议类似ECDH(椭圆曲线Diffie-Hellman),但增加了身份认证和密钥确认步骤。

我在做端到端加密通信时就用过SM2密钥交换。双方各自生成临时密钥对,交换公钥后计算出共享的秘密点,再通过密钥派生函数得到最终的对称密钥。整个过程不需要传输私钥,安全性很高。

1.3 与其他公钥算法的对比

为了让你更直观地理解SM2的位置,我整理了一个对比表格。表格主要从安全性、性能、密钥长度、签名长度和标准化程度五个维度出发。

算法安全级别 (比特)密钥长度 (位)签名长度 (字节)加密速度标准化
SM2128256~64较快国标GM/T 0003
RSA-20481122048256慢 (解密)PKCS#1
ECDSA (secp256k1)128256~64快ANSI X9.62
Ed2551912825664非常快RFC 8032
  • 安全性:SM2提供128比特安全级别,与256位密钥的ECDSA相当,高于RSA-2048的112比特。你想想看,用更短的密钥获得更高的安全性,这是椭圆曲线算法的核心优势。
  • 性能:SM2的加密和签名速度都优于RSA。我在一次压测中对比过,SM2签名一次大约0.5ms,而RSA-2048签名约2ms。解密场景下差距更大,SM2解密比RSA快接近一个数量级。
  • 密钥长度:SM2私钥只有32字节,公钥64字节(未压缩)。RSA的私钥动辄上千字节,存储和传输成本高很多。
  • 签名长度:SM2签名结果约64字节,和ECDSA、Ed25519相当。但RSA签名固定256字节,带宽开销大。
  • 标准化:SM2是中国国家标准,在国内必须使用;ECDSA是国际标准,国际互认度高;Ed25519是新兴算法,速度极快但尚未进入国标体系。
核心观点:SM2在安全性与性能上不输任何国际主流算法,且完全自主可控。如果你做的是国内项目,尤其是政务、金融、关键基础设施,SM2几乎是唯一选择。

1.4 知识框架总览

下面这张流程图展示了SM2算法家族的整体结构以及它们之间的依赖关系。你可以看到,SM3哈希作为底层基础设施,被签名和密钥交换复用;而加密、签名、密钥交换共同构成了SM2公钥密码体系。

SM2算法家族知识结构 国密标准 (GM/T 0003) 加密 / 解密 机密性保护 数字签名 完整性与不可否认 密钥交换 安全协商密钥 SM3 哈希算法 对比关键结论 • 安全性:SM2 (128-bit) ≈ ECDSA (secp256k1) > RSA-2048 (112-bit) • 密钥长度:SM2 32B vs RSA 256B,带宽优势明显 • 性能:SM2签名/加密速度约为RSA的3~10倍 • 标准化:国标要求,国内项目首选;国际互认度低于ECDSA

我个人觉得,理解SM2的关键在于把握「椭圆曲线密码学」这条主线。无论是加密、签名还是密钥交换,本质上都是在椭圆曲线群上做标量乘法。只要把这一点想通,后面学习接口封装时就会轻松很多。

1.5 本章小结

我们快速回顾一下:

  • SM2是为了实现自主可控而诞生的国标公钥密码算法,对标国际ECC算法。
  • 算法家族包含加密、签名、密钥交换三大功能,它们共享同一个椭圆曲线参数。
  • 与RSA、ECDSA等国际算法相比,SM2在安全等级、密钥长度、性能方面都有明显优势。
  • 国内做商用密码应用,SM2是绕不开的基石。
一个小建议:如果你刚开始接触SM2,建议先不要死磕数学原理,把精力放在理解算法如何工作、输入输出是什么、标准如何定义格式上。等封装完接口再回头补数学,会更容易上手。