1 前言
比原链的智能合约支持国密算法的函数。SM2是国密标准的椭圆曲线加密算法,遵循以下SM2国家标准:
- GB/T 32918.1-2016
- GB/T 32918.2-2016
- GB/T 32918.3-2016
- GB/T 32918.4-2016
- GB/T 32918.5-2017
- GB/T 35275-2017
- GB/T 35276-2017
椭圆曲线算法那公钥密码所基于的曲线性质:椭圆曲线多倍点运算构成一个单向函数。在多倍点运算中,已知多倍点与基点,求解倍数的问题称为椭圆曲线离散对数问题。对于一般椭圆曲线的离散对数问题,目前只存在指数级计算复杂度的求解方法。与大数分解问题及有限域上离散对数问题相比,椭圆曲线离散对数问题的求解难度要大得多。因此,在相同安全程度要求下,椭圆曲线密码较其他公钥密码所需的秘钥规模要小得多。
数字签名算法由一个签名者对数据产生数字签名,并由一个验证者验证签名的可靠性。每个签名者都有一个公钥和一个私钥,其中私钥用于产生签名,验证者用签名者的公钥验证签名。在签名的生成过程之前,要用密码杂凑算法对 Z A Z_A ZA 和待签消息 M M M 进行压缩;在验证过程之前,要用密码杂凑算法对 Z A Z_A ZA 和待签消息 M M M 进行同样的压缩。
2 基础参数
SM2的曲线方程为 y 2 = x 3 + a x + b \displaystyle y^2 = x^3 + ax + b y2=x3+ax+b ,其中:
- a a a:
0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
- b b b:
0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
- p p p:
0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
私钥长度:32字节。
公钥长度:SM2非压缩公钥格式字节串长度为65字节,压缩格式长度为33字节,若公钥y坐标最后一位为0,则首字节为0x02
,否则为0x03
。非压缩格式公钥首字节为0x04
。
签名长度:64字节。
3 密钥对生成
SM2密钥生成是指生成SM2算法的密钥对的过程,该密钥对包括私钥和与之对应的公钥。
- 输入:无
- 输出:
- k:SM2PrivateKey,SM2私钥
- Q:SM2PublicKey,SM2公钥
- 用随机数发生器产生整数 d ∈ [ 1 , n − 2 ] \displaystyle d\in[1,n-2] d∈[1,n−2] ;
- G G G 为基点,计算点 P = ( x P , y P ) = [ d ] G \displaystyle P=(x_P,y_P)=[d]G P=(xP,yP)=[d]G 。
则私钥是 d d d,公钥为 P P P。
4 签名算法
4.1 预处理1
预处理1是指使用签名方的用户身份标识和签名方公钥,通过运算得到Z值的过程。Z值用于预处理2。
- 输入:
- ID:字符串,用户身份标识
- Q:SM2PublicKey,用户的公钥
- 输出:
- Z:字节串,预处理1的输出
- 计算公式: Z = S M 3 ( E N T L ∣ ∣ I D ∣ ∣ a ∣ ∣ b ∣ ∣ x G ∣ ∣ y G ∣ ∣ x A ∣ ∣ y A ) Z=SM3(ENTL||ID||a||b||x_G||y_G||x_A||y_A) Z=SM3(ENTL∣∣ID∣∣a∣∣b∣∣xG∣∣yG∣∣xA∣∣yA)
- 参数说明:
- E N T L ENTL E