SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,国家密码管理局公告(第 21 号)

SM2算法和RSA算法都是公钥密码算法SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。

SM2 算法密钥位长为 m(m=256)。SM2 算法包涵:系统参数、密钥对生成、数字签名算法(SM2-1)、密钥交换协议(SM2-2)
和加密算法(SM2-3)共五个部分。


算法说明:

算法 说明 用途
SM2-1 椭圆曲线数字签名算法 数字签名
SM2-2 椭圆曲线密钥交换协议 密钥协商
SM2-3 椭圆曲线公钥加密算法 数据加密

对象标识符:

对象标识符 名称 OID
ECC ECC算法标识 1.2.840.10045.2.1
SM2 SM2算法标识 1.2.156.10197.1.301
SM3withSM2 SM3的SM2签名 1.2.156.10197.1.501
SHA1withSM2 SHA1的SM2签名 1.2.156.10197.1.502
SHA256withSM2 SHA256的SM2签名 1.2.156.10197.1.503

椭圆曲线算法是什么原理?

上图为方程:$$$y^2=x^3–x$$$的曲线。

  1. P点为基点;
  2. 通过P点做切线,交与点 2P点,在2P’点做竖线,交与2P点,2P点即为P点的2倍点;
  3. 进一步,P点和2P点之间做直线,交与3P’点,在3P’点做竖线,交与3P点,3P点即为P点的3倍点;
  4. 同理,可以计算出P点的4、5、6、… 倍点;
  5. 如果给定图上Q点是P的一个倍点,请问Q是P的几倍点呢?
  6. 直观上理解,正向计算一个倍点是容易的,反向计算一个点是P的几倍点则困难的多。

在椭圆曲线算法中,将倍数d做为私钥,将Q做为公钥。当然,椭圆曲线算法还有更严格的计算过程,相对图示要复杂的多。


SM2算法采用的椭圆曲线方程为:

$$$y^2=x^3+ax+b$$$

在SM2算法标准中,通过指定a、b系数,确定了唯一的标准曲线。同时,为了将曲线映射为加密算法,SM2标准中还确定了其它参数,供算法程序使用。

SM2 算法使用固定的$$$F_p$$$域,系统参数如下:

  • $$$F_p$$$域的特征p,p是m比特长度的素数;
  • $$$F_p$$$中的两个元素a和b,它们定义曲线E的方程:$$$y^2=x^3+ax+b$$$,a、b满足$$$4a^3+27b^2≠0$$$
  • 基点$$$G=(x_G, y_G) ∈ E(F_p)$$$$$$G≠O$$$(O为无穷远点)。
  • 基点G的阶n,n是m比特长度的素数。

说明:

  1. $$$p$$$$$$a$$$$$$b$$$$$$x_G$$$$$$y_G$$$$$$n$$$均为$$$m$$$比特长度的大整数,也可以看作m/8字节长度的字符串。
  2. G可以看作一个有序整数对,也可以看作一个m/4+1字节长度的字符串。
  3. 无穷远点O是一个理想点,不能用有序整数对(x, y)即仿射坐标表示。

SM2 系统参数作为公共参数,可以在所有的平台和系统之间公开共享。

推荐使用素数域256位椭圆曲线。
椭圆曲线方程:y ^ 2 = x ^ 3 + ax + b。
曲线参数:
p  = FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
a  = FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
b  = 28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93
n  = FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
Gx = 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
Gy = BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0

SM2的密钥对包括私钥(记为$$$d$$$)和公钥(记为$$$Q$$$),其中$$$d$$$为小于$$$n-1$$$的一个随机的正整数,$$$Q$$$为曲线$$$E(F_p)$$$上的一个非无穷远点且满足$$$Q=dG$$$(即连续$$$d$$$$$$G$$$点“相加”,简称为“点乘”)。

输入参数:
      无
输出参数:
      $$$d$$$:私钥
      $$$Q$$$:公钥$$$Q=dG$$$

说明:

  1. $$$E(F_p)$$$上的两个点“相加”是一个较复杂的运算过程(与普通的整数加法不同),$$$O$$$$$$E(F_p)$$$上的任意点P“相加”结果仍为P,“相加”是一个可结合、可交换的运算。
  2. $$$Q=(x_Q, y_Q) \in E(F_p), Q≠O$$$,可以看作一个有序整数对。

SM2 系统参数作为公共参数,可以在所有的平台和系统之间公开共享。


SM2加密算法

SM2加密同样使用接收方公钥加密,公钥由一个曲线坐标点组成,在X.509证书中的公钥表示为04标记开始的2个32byte的BigInteger,即曲线点P(x,y)。SM2公钥加密算法比RSA相对复杂,加密结果由3个部分组成,SM2加密过程中使用了随机数,因此同样的明文数据每一次加密结果都不一样。SM2加密算法流程如下图所示。

根据国密推荐的SM2椭圆曲线公钥密码算法,首先产生随机数计算出曲线点C1,2个32byte的BigInteger大数,即为SM2加密结果的第1部分。第2部分则是真正的密文,是对明文的加密结果,长度和明文一样。第3部分是杂凑值,用来效验数据。按国密推荐的256位椭圆曲线,明文加密结果比原长度会大96byte。


SM2解密算法

SM2解密算法是加密逆运算。首先需要从密文中取出加密结果的3部分值,然后通过私钥计算出 M'明文值,最后效验数据。SM2解密算法流程如下图所示。

  1. http://baike.baidu.com/subview/187999/14970299.htm - SM2 (国密的一种算法)
  2. http://www.cashwaytech.com/news/info.asp?id=861 - 金融领域国产密码算法应用介绍
  3. http://www.jonllen.com/jonllen/work/164.aspx - SM2非对称算法加解密
  4. http://www.jonllen.com/jonllen/work/174.aspx - SM2国密算法证书解析
  5. http://www.oscca.gov.cn/UpFile/File64.PDF - 可信计算密码支撑平台功能与接口规范
  6. http://www.wosign.com/SM2/SM2.htm - SM2椭圆曲线公钥密码算法
  7. http://www.secg.org/ - Standards for Efficient Cryptography Group
  8. https://github.com/ThreeZhiWang/openssl_1.0.0n_ExSM2 Github Repo Stars: ThreeZhiWang/openssl_1.0.0n_ExSM2 - openssl_1.0.0n_ExSM2