SM2属于非对称加密方式,其实现方式有素域和二元扩域两种方式,我们只介绍素域的情况,二元扩域涉及到多项式运算,理解更困难。
有限域上的椭圆曲线在点加运算下构成一个有限交换群,且其多倍点运算构成一个单项函数。
椭圆曲线并不是椭圆,之所以成为椭圆曲线,是因为它们与计算椭圆周长的方程相似,也使用三次方程来表示的,一般椭圆曲线的三次方程如下:
y ² + axy + by = x ³+ cx ² + dx + e
其中a, b, c, d和e是实数,x和y是在实数集上取值,不是所有的椭圆曲线都能用于加密算法,一般情况下,椭圆曲线加密算法取如下方程用于实际应用:
y ² = x ³+ ax + b
元素个数为素数的有限域称为有限素域,记做F(q),其中q为素数。我们取整数素域F(q),元素包括{0,1,2…p-1,p}。
假设a mod n ==b mode n, 则成a和b模n同余。
连续的椭圆曲线并不能用于加密,为了将椭圆曲线变成离散的点,我们将椭圆曲线的系数以及变元(即x,y)取值限制在有限域上,执行模p操作,则成此曲线为有限域上的曲线,记做Ep(a,b),根据a和b的取值不同,曲线也就不同,所以Ep(a,b)是一个曲线集合,曲线公式如下:
y ² mod p = (x ³+ ax + b) mod p
例如,有整数有限素域为F(23),取a=1,b=1,x=9,y=7,计算结果如下:
y ² mod p = (x ³+ x + 1) mod p
49 mod 23 = (729 + 9+ 1) mod 23
3 = 3
其中系数和变元均取自有限素域。
下图是在F(23)上取值a=1和b=1,即y² mod 23 = (x ³ + x + 1) mod 23的点的坐标,记做E23(1,1):
如下表,是曲线中所有的点坐标:
阿贝尔群,即交换群。
假设椭圆曲线上有三个点P,Q,R在同一直线上,椭圆曲线的加法定义为P+Q+R=O(O是加法中的单位元,类似于实数加法中的0),其几何描述为一条直线上的三个点的和为O,即 P + Q = O - R。
椭圆曲线多倍点记做P =[k]Q,表示k个Q点相加的结果为P。
多倍点记做P=[k]Q,则使用k作为私钥,P作为公钥,对于多倍点运算而言,反向取K得值是数学难题。
相比较其他公钥算法,椭圆曲线使用更短的密钥串就能实现比较牢固的加密强度,同时由于密钥串相对较短,加密速度也就相对较快。
SM2算法规定了三个应用场景,分别是数字签名,密钥交换和加密解密。
数字签名还需要SM3杂凑算法的辅助实现,SM3算法是一种摘要算法。
大致描述如下:
主要采用的方式是签名方对A用户的身份信息和需要进行签名的信息做哈希算法,将生成的hash串与私钥关联。
验证方则通过公钥信息对签名串进行验证。
密钥交换实际上是利用公钥和私钥的属性,双方协商密钥的过程,具体参照国密局文档。
加密解密的过程实际上是在密钥交换的基础上进行的(虽然方式不同),最终两方协商可以得到同一个加密密钥,后续进行的实际上是对称加解密的内容,具体请参照国密局文档。