SM2
SM2是中国国家密码管理局组织制定的椭圆曲线公钥密码算法,属于商用密码体系中的非对称算法,用于数字签名、密钥交换与公钥加密。该算法以256位素数域椭圆曲线为基础,在国家商用密码标准中以GM/T 0003-2012发布,2016年升为国家标准GB/T 32918,并被采纳进ISO/IEC 14888系列,在我国被用于替代RSA等公钥算法。
定义
SM2是一套建立在椭圆曲线数学之上的公钥密码算法,由国家密码管理局归口管理并组织制定,其完整名称是《SM2椭圆曲线公钥密码算法》[1][2]。它并不是单一的运算,而是由总则、数字签名算法、密钥交换协议、公钥加密算法和参数定义5个部分共同构成的一族机制,各部分各自规定了一类密码功能及其示例流程[1]。
在国家标准体系中,该算法以GB/T 32918系列的形式给出,第1至4部分于2016年8月29日发布、2017年3月1日实施,参数定义部分为GB/T 32918.5-2017;行业标准版本则是2012年3月21日发布的GM/T 0003系列[3][1][4]。算法属于非对称体制,在我国商用密码体系中承担替换RSA的定位,主要用于电子政务、移动办公、电子商务、移动支付和电子证书等领域[5]。
原理
算法运行在一条定义于256位素数域上的椭圆曲线上,曲线方程为 $y^2 = x^3 + ax + b$,并规定了一组推荐参数(基点 $G$、曲线阶 $n$ 等)[6][7]。其安全性依赖于椭圆曲线离散对数问题:由私钥 $d$ 与基点计算公钥 $P=[d]G$ 容易,反向由 $P$ 求 $d$ 在计算上不可行;与整数分解类体制相比,达到同等安全强度所需的密钥更短[8]。
数字签名的做法是先计算用户杂凑值 $Z_A = H(ENTL_A \Vert ID_A \Vert a \Vert b \Vert x_G \Vert y_G \Vert x_A \Vert y_A)$,再对 $Z_A$ 与消息 $M$ 的拼接取杂凑得到待签摘要 $e$,其中杂凑运算使用SM3;随后取随机数 $k$,计算 $r=(e+x_1) \bmod n$ 与 $s=(1+d_A)^{-1}(k-r d_A) \bmod n$,输出签名 $(r,s)$[9]。验证方重新算出 $e$,再由 $s$ 与 $r+s$ 分别与基点和公钥作多倍点运算得到一点,用其横坐标与 $e$ 相加后同 $r$ 比较,一致即可确认签名有效[10]。
密钥交换部分面向通信双方,通过2次或可选的3次信息传递,使两端各自算出同一个由双方共同决定的共享密钥(会话密钥);公钥加密部分则由发送方用接收方公钥加密消息,接收方以对应私钥解密,密文由 $C_1$、$C_2$、$C_3$ 3个分量组成[1][11]。签名与加密都以密码杂凑函数和符合管理要求的随机数发生器为配套前提。
发展历程
2012年3月21日,国家密码管理局以第23号公告批准《祖冲之序列密码算法》等6项密码行业标准,其中包含GM/T 0003-2012《SM2椭圆曲线公钥密码算法》,与SM4分组密码算法、SM3密码杂凑算法等同期公布并自公布之日起实施[4][12]。该系列标准由北京华大信安科技有限公司、中国人民解放军信息工程大学、中国科学院数据与通信保护研究教育中心等单位起草,归口国家密码管理局,起草人包括陈建华、祝跃飞、叶顶峰、胡磊、裴定一、彭国华、张亚娟、张振峰等[2][13]。
2016年8月29日,SM2的前4个部分以推荐性国家标准GB/T 32918系列发布,2017年3月1日起实施,参数定义部分随后以GB/T 32918.5-2017发布[3][14]。同一时期算法被纳入国际标准化组织的ISO/IEC 14888系列签名标准,实现了从行业标准到国家标准、再到国际标准的衔接[15]。
2021年前后,互联网工程任务组发布RFC 8998,把国密算法引入TLS 1.3,其中定义了2个国密加密套件、1个SM2椭圆曲线标识和1个SM2与SM3组合的签名方法,SM2在通用网络安全协议中的互操作方式由此明确[16][17]。此后主流密码库陆续提供对该算法的支持,OpenSSL自3.0版本起可用SM2生成与加载密钥,4.0版本加入了sm2sig_sm3这一TLS签名方案[15]。
应用
在商用密码应用层面,SM2被用于电子政务、移动办公、电子商务、移动支付和电子证书等基础设施与云服务,支持该算法的产品数量已达1000余款[5]。数字签名机制对应身份鉴别以及数据完整性、真实性的需求,加密机制对应消息保密传输的需求,密钥交换机制则用于通信双方协商会话密钥[1]。
在协议与产品实现中,SM2既可作为数字签名算法与SM3搭配使用,也可作为密钥交换曲线承担ECDH运算;RFC 8998规定的TLS 1.3国密套件以SM4承担对称加密、SM3承担杂凑、SM2承担签名与密钥交换,铜锁等开源实现提供了对应的命令行与接口开关[17][18][15]。数字证书体系也对该算法作出配套规定,相关国标规范了基于SM2与SM3的证书与消息语法[19]。
局限
SM2是通用公钥密码机制,自身只解决密钥分发、签名认证与加解密问题,并不提供对称加密的批量数据吞吐能力,实际协议中通常由SM4一类的分组密码承担主体数据的加密,SM2负责签名和密钥协商[20]。其签名还依赖带用户标识的杂凑值 $Z_A$,签名方与验证方必须使用一致的标识值,否则验签失败;在TLS 1.3等场景中该标识被规定为固定常量,在证书签名等场景中则使用约定的默认值[15][21]。
协议层面的适配并不彻底:TLS 1.3的中国商用密码套件以配置方案的形式给出,部分实现出于兼容考虑并未强制服务端使用SM2签名,而是提供开关由使用者决定,说明国密证书的部署普及程度仍是制约因素[17]。国际规范文件也明确表示,其目的只是说明如何在TLS 1.3中实现互通,并不构成对该类算法在TLS 1.3中使用的认可[22]。
此外,椭圆曲线体制的安全性建立在离散对数难解这一假设之上,其密钥与曲线参数一旦被弱化或实现中存在随机数、标量运算方面的缺陷,整体安全性即受影响;相关国际标准文本亦指出,SM2密钥交换协议存在遭受未知密钥共享攻击的可能[8][23]。算法本身属于公开的密码机制,其可信性取决于是否按标准实现并通过相应检测,而非算法以外的因素[10]。
参见
参考资料
- 标准列表_中国标准在线服务网 [引用日期2026-10-29]
- 【行业标准】 SM2椭圆曲线公钥密码算法 第5部分:参数定义 [引用日期2026-10-29]
- 标准号:GB/T 32918.2-2016 [引用日期2026-10-29]
- 国家密码管理局关于发布《祖冲之序列密码算法》等6项密码行业标准公告 [引用日期2026-10-29]
- 2023年国家网络安全宣传周:商用密码 算法简介 [引用日期2026-10-29]
- sm2 package - github.com/paul-lee-attorney/gm/sm2 [引用日期2026-10-29]
- Diff - ea7ecb66440b37c035e899c60ceaf7a03d364930^! [引用日期2026-10-29]
- 第 1 部分描述了 SM2 算法的数学原理,包括椭圆曲线及椭圆曲线上有限域的概念、椭圆曲线涉及的参数、数据类型及其转换等 [引用日期2026-10-29]
- 专属云(计算独享型)_专属云(计算独享型)文档介绍内容-天翼云 - 进行SM2签名时,如何计算SM3摘要 [引用日期2026-10-29]
- 【密码学(3)】-国密系列1-SM2 [引用日期2026-10-29]
- google.com 上的网页 [引用日期2026-10-29]
- 国家密码管理局公告(第23号) [引用日期2026-10-29]
- 【行业标准】 SM2椭圆曲线公钥密码算法 第2部分:数字签名算法 [引用日期2026-10-29]
- GB/T 32918.1-2016-信息安全技术 SM2椭圆曲线公钥密码算法 第1部分:总则-国家标准馆·国家数字标准馆 [引用日期2026-10-29]
- EVP_PKEY-SM2¶ [引用日期2026-10-29]
- 协会动态 [引用日期2026-10-29]
- 在 TLS1.3 中使用商用密码算法 | OpenAtom 铜锁/Tongsuo [引用日期2026-10-29]
- TLS 1.3 使用商密套件 [引用日期2026-10-29]
- GB/T 35275-2017-信息安全技术 SM2密码算法加密签名消息语法规范-国家标准馆·国家数字标准馆 [引用日期2026-10-29]
- tls package - github.com/iuboy/pollux-go/tls [引用日期2026-10-29]