GMSSL :SM2椭圆曲线公钥密码算法——数字签名算法2

2021SC@SDUSC

一、相关数学基础

SM2是椭圆曲线算法,所以要先学习相关基础数学知识

N.Koblitz和V.Miller在1985年各自独立地提出将椭圆曲线应用于公钥密码系统。椭圆曲线公钥密码 所基于的曲线性质如下:

──有限域上椭圆曲线在点加运算下构成有限交换群,且其阶与基域规模相近;

──类似于有限域乘法群中的乘幂运算,椭圆曲线多倍点运算构成一个单向函数。

1.参数

p:大于3的素数。

q:有限域Fq中元素的数目。

m:二元扩域F2 m关于F2的扩张次数。

2.基础概念

由于

1.实数域上的椭圆曲线是连续的,有无限个点,密码学要求有限点。
2.实数域上的椭圆曲线的运算有误差,不精确。密码学要求精确。

所以需要引入有限域内的圆锥曲线

有限域:Fq的描述及其元素的表示,q是一个奇素数或者是2的方幂。当q是奇素数p时,要 求p > 2 191;当q是2的方幂2 m时,要求m > 192且为素数。

素域Fp: 当q是奇素数p时,素域Fp中的元素用整数0,1,2,··· , p−1表示。

a) 加法单位元是整数0;

b) 乘法单位元是整数1;

c) 域元素的加法是整数的模p加法,即若a,b\in F_{p},则a+b =(a+b)\bmod p

d) 域元素的乘法是整数的模p乘法,即若a,b\in F_{p},则a\cdot b =(a\cdot b)\bmod p

二元扩域:

        当q是2的方幂2^{m}时,二元扩域F_{2^{m}}可以看成F_{2}上的m维向量空间,其元素可用长度为m的比特串表 示。

        F_{2^{m}}中的元素有多种表示方法,其中最常用的两种方法是多项式基(PB)表示和正 规基(NB)表示。 基的选择原则是使得F_{2^{m}}中的运算效率尽可能高。下面以多项式基表示为例说明二元扩域F_{2^{m}}。 设F_{2}上m次不可约多项式f(x)=x^{m}+f_{m-1}x^{m-1}+\cdot \cdot \cdot +f_{2}x^{2}+f_{1}x+f_{0}(其中f_{i}\in F_{2}, i = 0,1,··· ,m−1)是 二元扩域F_{2^{m}}的约化多项式。F_{2^{m}}F_{2}上所有次数低于m的多项式构成。多项式集合{x^{m-1},x^{m-1},\cdot \cdot \cdot,x,1 }是 F2 m 在F2上的一组基,称为多项式基F_{2^{m}}中的任意一个元素a(x)=a_{m-1}x^{m-1}+a_{m-2}x^{m-2}+\cdot \cdot \cdot +a_{1}x+a_{0}F_{2}上的系数恰好构成了长度为m的比特串,用a=(a_{m-1},a_{m-2},\cdot \cdot \cdot ,a_{1},a_{0})表示。

 a) 零元0用全0比特串表示;

b) 乘法单位元1用比特串(00···001)表示;

c) 两个域元素的加法为比特串的按比特异或运算;

d) 域元素a和b的乘法定义如下:设a和b对应的F2上多项式为a(x)和b(x),则a\cdot b定义为多项 式(a(x)b(x)) \bmod f(x) 对应的比特串。

椭圆曲线上点的加法

如上图所示,椭圆曲线的方程是y^{2}=x^{3}-5x+5 

在椭圆曲线上取一点P(x_{P},y_{P}),再取一点Q(x_{Q},y_{Q}),连接P、Q两点作一条直线,这条直线将在椭圆曲线上交于第三点,过这个点作垂直于x轴的直线,将过椭圆曲线另一点R(一般是关于x轴对称的点),R点则被定义为P+Q的结果,即R=P+Q

代数计算R的过程:

直线PQ斜率 k=\frac{y_{P}-y_{Q}}{x_{P}-x_{Q}}

x_{R}=m^{2}-x_{P}-x_{Q}

y_{R}=k(x_{P}-x_{R})-y_{P}

存在一种特殊情况,即P,Q是一点,如下图,此时过Q点的线是椭圆曲线的一条切线

 此时,斜率k=\frac{3x_{P}^{2}+a}{2y_{P}}

点R的横纵坐标计算仍然是x_{R}=m^{2}-x_{P}-x_{Q}y_{R}=k(x_{P}-x_{R})-y_{P}

二、查看数字签名算法的源码

打开文件可以看到一些注释,主要是一些声明

 几乎是每个.c文件前面都有的,简单翻译了一下

打开文件可以看到头文件。

 定义的全局变量

该文件中的全部函数

 第一个函数sm2_sign_free

无签名的情况

猜你喜欢

转载自blog.csdn.net/vincy_yeha/article/details/121069243
今日推荐