Sm2数字签名生成算法的实现方法及装置制造方法
【专利摘要】一种SM2数字签名生成算法的实现方法及装置,本发明采用CPU和GPU协作方式进行SM2数字签名生成算法计算,将SM2数字签名生成算法中的计算椭圆曲线点步骤在GPU中进行预先计算得到结果并存储在设置的存储器中,将对用户私钥增1求逆计算在CPU中进行预先计算得到结果并存储在设置的存储器中,然后由CPU根据SM2数字签名生成算法计算步骤对待签名消息顺序计算时,调用存储器存储的预先计算得到的结果,从而节省了对待签名消息进行数字签名的计算时间,提高了SM2数字签名生成算法的计算效率。更进一步,在CPU中可以同时对多个不同用户私钥分别进行用户私钥增1后求逆并存储在存储器中,进一步提高计算效率。
【专利说明】SM2数字签名生成算法的实现方法及装置
【技术领域】
[0001]本发明涉及公钥密码算法技术,特别涉及一种结合中央处理器(CPU)和图形处理器(GPU, Graphics Processing Unit)的SM2数字签名生成算法的实现方法及装置。
【背景技术】
[0002]采用多核并行计算是提升处理器性能的重要方式,因此出现了包括海量并行结构运算单元的GPU,GPU已经发展成为了并行度高、多线程、计算快捷及内存带宽大的高性能通用处理器。GPU体系结构在组成上分为三层:第一层由若干个线程处理器簇(TPC,ThreadPreocessing Cluster)组成,第二层由多个流多处理器(SM, Streaming Multiprocessor)组成,第三层为构成SM的流处理器(SP, Stream Processor),也可以称为线程处理器。SM作为GPU的一个任务执行和调度单元,主要负责执行GPU分发的线程指令,而SP是GPU中最基本的指令执行单元,其执行的操作由所属的SM控制。
[0003]2006 年 NVIDIA 公司推出了计算机一体设备结构(CUDA, Compute Unified DeviceArchitecture)可编程平台,可以实现GPU线程的调度。在CUDA可编程平台架构下,GPU执行的最小单位是线程(thread),数个线程(thread)可以组成一个线程块(block)。一个block中的thread可以存取同一共享内存且同步。执行相同程序的thread,组成栅格(grid),不同的grid可以执行不同的程序。
[0004]相对于中央处理器(CPU),GPU具有强大的数据处理能力,在浮点运算及并行计算等方面,提高几十倍甚至数百倍于CPU的性能。GPU具有几千个核,有很高的并行性,但是每个SM相比CPU处理能力比较弱。CPU计算能力强,但是核数比较少。因此,采用何种CPU和GTO协作方式进行构架,完成各种计算,以提高系统整体计算能力,是一个亟待解决的问题。
[0005]椭圆曲线公钥密码算法(SM2),是中国国家密码管理局发布的密码算法。SM2明确规定了 SM2算法的数字签名算法、公钥加密算法及密钥交换协议。其中,SM2算法的数字签名算法包括生成算法和验证算法,应用在消息传输过程中可靠性的消息传输及使用消息的合法者验证。在SM2的数字签名算法中,包括一一对应的公钥和私钥,其中,私钥用于待签名消息生成数字签名,公钥用于对数字签名进行验证。签名者采用私钥进行待签名消息M的数字签名生成算法计算,得到待签名消息M的数字签名;验证者采用公钥对接收的待签名消息M进行数字签名验证计算,验证待签名消息M的数字签名是否匹配,如果匹配,确认接收的待签名消息M是正确的。
[0006]SM2算法的数字签名生成算法具体过程如下。
[0007]设待签名消息为M,为了取得待签名消息M的数字签名(r,S),作为签名者的用户A应实现以下运算步骤:
[0008]Al:置G=Za Il M, Za Il M 表示 Za 与 M 的拼接;
[0009]A2:计算e的数据类型转换为整数;
[0010]A3:产生随机数 k e [I, n-ι];[0011]A4:计算椭圆曲线点(X,y) =[k]G ;
[0012]A5:计算 r=(e+x)mod η,若 r=0 或 r+k=n 则返回 A3 ;
[0013]A6:计算 S= ((l+dA).(k~r.dA))mod η,若 s=0 则返回 A3 ;
[0014]A7:将r、s的数据类型转换为字节串,待签名消息M的签名为(r,s)。
[0015]其中:ZA:关于用户A的可辨别标识、部分椭圆曲线系统参数和用户公钥A的杂凑值;HV():消息摘要长度为V比特的密码杂凑函数;G:椭圆曲线上的一个基点,其阶为素数;η:基点G的阶;dA:用户A的私钥;[k]G:椭圆曲线上点G的k倍点,即,[k]G=G+G…+G,表示k个G在椭圆曲线域上相加。 [0016]目前,在实现SM2数字签名生成算法时,是由CPU按照上述步骤顺序计算,最终得到待签名消息M的数字签名,由于在计算过程中计算量比较大,比较费时,得到数字签名的效率比较低。
【发明内容】
[0017]有鉴于此,本发明提供一种结合CPU和GPU的SM2数字签名生成算法的实现方法,该方法能够提高SM2数字签名生成算法的计算效率。
[0018]本发明还提供一种结合CPU和GPU的SM2数字签名生成算法实现装置,该装置能够提高SM2数字签名生成算法的计算效率。
[0019]为达到上述目的,本发明实施的技术方案具体是这样实现的:
[0020]一种SM2数字签名生成算法的实现方法,该方法包括:
[0021]将SM2数字签名生成算法中的计算椭圆曲线点步骤由图形处理器GPU预先计算,得到椭圆曲线点及对应的随机数,并存储在设置的存储器中;
[0022]将SM2数字签名生成算法中的对用户私钥增I求逆计算步骤由中央处理器CPU预先计算,得到用户私钥的增I逆值存储在设置的存储器中;
[0023]CPU根据SM2数字签名生成算法计算步骤对待签名消息顺序计算时,调用存储器存储的椭圆曲线点及对应的随机数,以及用户私钥的增I逆值,完成对待签名消息的数字签名。
[0024]所述SM2数字签名生成算法中的对用户私钥增I求逆计算的CPU线程与所述根据SM2数字签名生成算法计算步骤对待签名消息顺序计算的CPU线程相同或不同。
[0025]所述将SM2数字签名生成算法中的对用户私钥增I求逆计算步骤在CPU预先计算为:
[0026]对于预先存储了用户私钥的签名请求,在接收SM2数字签名生成请求之前,预先进行用户私钥增I求逆计算,用户私钥表示为dA,用户私钥增I求逆表示为(l+cg-1mod η,其中η为椭圆曲线基点G的阶。
[0027]所述将SM2数字签名生成算法中的对用户私钥增I求逆计算步骤在CPU预先计算为:
[0028]对于未预先存储用户私钥的签名请求,在CPU接收到SM2数字签名生成请求之后,CPU根据SM2数字签名生成算法计算步骤对待签名消息顺序计算之前,获取到用户私钥后进行增I求逆计算;
[0029]所述求逆计算的CPU线程与根据SM2数字签名生成算法计算步骤对待签名消息顺序计算的CPU线程不同。
[0030]所述获取到用户私钥进行增I求逆计算为:
[0031]设定同时求逆计算的用户私钥门限数或者设定间隔时刻,当到达同时求逆计算的用户私钥门限数或者设定的间隔时刻时,将所获取的多个不同用户私钥同时进行增I求逆操作后得到的不同用户私钥的增I逆值。
[0032]所述将所获取的多个不同用户私钥同时进行增I求逆操作后得到的不同用户私钥增I逆值为:
[0033]计算d1=^cIai,d2=l+dA2,…,φ=1+(1Μ ;
[0034]计算d1’=Cl1, d2,=Cl1^d2,…,Cli,=C^d2*...;
[0035]计算H= (Cli,) _1mod η ;
[0036]计算…(d2)H=I^dfd3*...*di,...,(Cli) H=J^dfd2*...*(1η ;
[0037]其中,dAi为用户私钥,(Cli)-1为用户私钥的逆,η为椭圆曲线基点G的阶。
[0038]所述SM2数字签名生成算法中的计算椭圆曲线点步骤的计算由一个GPU线程顺序完成,或多个GPU线程针对不同的随机数同时计算完成。
[0039]一种SM2数字签名生成算法的实现装置,该装置包括:GPU计算单元、CPU计算单元及存储器,其中,
[0040]GPU计算单元,用于执行SM2数字签名生成算法中的计算椭圆曲线点步骤,并将计算得到的椭圆曲线点及对应的随机数存储在存储器中;
[0041]CPU计算单元,用于执行SM2数字签名生成算法中的对用户私钥增I求逆计算步骤,得到用户私钥的增I逆值存储在存储器中;根据SM2数字签名生成算法计算步骤对待签名消息顺序计算时,调用存储器存储的预先存储的椭圆曲线点及对应的随机数,以及用户私钥的增I逆值,完成对待签名消息的数字签名。
[0042]存储器,用于存储椭圆曲线点及对应的随机数,以及用户私钥的增I逆值。
[0043]所述CPU计算单元,还用于在接收到SM2数字签名生成请求之前,存储有用户私钥,预先进行用户私钥增I求逆计算并存储在存储器中。
[0044]所述CPU计算单元包括多个CPU计算单元,其中,
[0045]一个CPU计算单元,还用于在CPU接收到SM2数字签名生成请求之后,CPU根据SM2数字签名生成算法步骤对待签名消息顺序计算之前,获取到用户私钥增I进行求逆计算并存储在存储器中;
[0046]其他CPU计算单元,还用于根据SM2数字签名生成算法步骤对待签名消息顺序计算时,调用存储器存储的预先存储的椭圆曲线点及对应的随机数,以及用户私钥的增I逆值,完成对待签名消息的数字签名。
[0047]所述GPU计算单元为一个或一个以上,用于顺序执行SM2数字签名生成算法中的计算椭圆曲线点步骤,或者针对不同的随机数同时执行SM2数字签名生成算法中的计算椭圆曲线点步骤。
[0048]由上述方案可以看出,本发明采用CPU和GPU协作方式进行SM2数字签名生成算法计算,将SM2数字签名生成算法中的计算椭圆曲线点步骤在GPU中进行预先计算得到结果并存储在设置的存储器中,将对用户私钥增I求逆计算在CPU中进行预先计算得到结果并存储在设置的存储器中,然后由CPU根据SM2数字签名生成算法计算步骤对待签名消息顺序计算时,调用存储器存储的预先计算得到的结果,从而节省了对待签名消息进行数字签名的计算时间,提高了 SM2数字签名生成算法的计算效率。更进一步,在CPU中可以同时对多个不同用户私钥分别进行用户私钥增I求逆并存储在存储器中,进一步提高计算效率。
【专利附图】
【附图说明】
[0049]图1为本发明实施例实施例提供的结合CPU和GPU的SM2数字签名生成算法的实现方法流程图;
[0050]图2为本发明实施例提供的结合CPU和GPU的SM2数字签名生成算法实现装置结构示意图;
[0051]图3为本发明实施例提供的椭圆曲线点及对应的随机数预计算及存取的示意图;
[0052]图4为本发明实施例提供的一个CPU计算单元对不同用户私钥dA的增I求逆计算流程图。
【具体实施方式】
[0053]为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明作进一步详细说明。
[0054]【背景技术】在实现SM2数字签名生成算法时计算效率不高的原因为:由CPU按照SM2数字签名生成算法计算步骤顺序执行,其中的增I求逆计算与椭圆曲线点计算的计算复杂性都比较高,比较耗时。为了克服这个问题,本发明采用CPU和GPU协作方式进行SM2数字签名生成算法计算,将SM2数字签名生成算法中的计算椭圆曲线点步骤在GPU中进行预先计算得到结果并存储在设置的存储器中,将对用户私钥增I求逆计算在CPU中进行预先计算得到结果并存储在设置的存储器中,然后由CPU根据SM2数字签名生成算法计算步骤对待签名消息顺序计算时,调用存储器存储的预先计算得到的结果,从而节省了对待签名消息进行数字签名的计算时间,提高了 SM2数字签名生成算法的计算效率。更进一步地,在CPU中可以同时对多个不同用户私钥分别进行用户私钥增I求逆计算并存储在存储器中,进一步提闻计算效率。
[0055]从【背景技术】的SM2数字签名生成算法中可以看出,步骤A3和步骤A4计算椭圆曲线点涉及的数据与待签名消息无关。因此,本发明采用在进行SM2数字签名生成算法之前,由GPU预先执行步骤A3和步骤A4,得到结果后存储在设置的存储器中,等到CPU根据SM2数字签名生成算法步骤对待签名消息按照步骤顺序计算时,要顺序执行步骤A3和步骤A4时,直接从设置的存储器中读取。
[0056]从【背景技术】的SM2数字签名生成算法中还可以看出,在步骤A6中进行的对用户私钥增I求逆操作(1+cg—1计算复杂度较大,本发明则由CPU预先计算该步骤A6中对用户私钥增I求逆过程并在存储器中存储结果,等到CPU根据SM2数字签名生成算法步骤对待签名消息按照步骤顺序计算时,要顺序执行步骤A6时,直接从设置的存储器中读取该用户私钥增I的求逆结果,然后再执行步骤A6中的其他计算。在由CPU预先计算该步骤A6中对用户私钥增I的求逆过程并在存储器中存储结果时,CPU可以通过执行一次求逆计算,获得多个不同用户私钥的增I逆,并存储在存储器中。[0057]图1为本发明实施例提供的一种基于GPU的SM2算法中的数字签名生成算法实现方法流程图,其具体步骤为:
[0058]步骤101、将SM2数字签名生成算法中的计算椭圆曲线点步骤由GPU预先计算得到结果并存储在设置的存储器中;
[0059]在该步骤中,结果为椭圆曲线点及对应的随机数;
[0060]步骤102、将SM2数字签名生成算法中的对用户私钥增I求逆计算步骤由CPU预先计算得到结果并存储在设置的存储器中;
[0061]在该步骤中,结果为用户私钥增I逆;
[0062]步骤103、CPU根据SM2数字签名生成算法计算步骤对待签名消息顺序计算时,调用存储器存储的椭圆曲线点及对应的随机数,以及用户私钥的增I逆值,完成对待签名消息的数字签名。
[0063]在图1中,步骤101和步骤102分别由GPU和CPU执行,执行上可以不是顺序执行。
[0064]在图1中,步骤102和步骤103都是由CPU线程完成的,可以是同一 CPU线程,也可以是不同的CPU线程。
[0065]在图1中,GPU执行SM2数字签名生成算法中的计算椭圆曲线点步骤时,可以由一个GPU线程完成,也可以由多个GPU线程针对不同的随机数同时计算完成。
[0066]在图1中的步骤102中,有两种方式进行:
[0067]第一种方式,如果已经预先存储了用户私钥,则在接收到SM2数字签名生成请求之前,就预先进行用户私钥增I求逆计算并存储;
[0068]第二种方式,如果没有存储用户私钥,则在CPU接收到SM2数字签名生成请求之后,CPU收集多个计算请求,在根据SM2数字签名生成算法步骤对待签名消息顺序计算之前,获取到用户私钥进行增I求逆计算并存储。在执行第二种方式时,可以同时对不同的SM2数字签名生成请求所需的不同用户私钥增I同时进行求逆计算,比如设定同时求逆计算的用户私钥门限数或者设定间隔时刻,当到达同时求逆计算的用户私钥门限数或者设定的间隔时刻时,将所获取的多个不同用户私钥同时进行不同用户私钥增I求逆操作后得到的不同用户私钥的逆存储,当调用时,选取对应的用户私钥的增I逆值调用。
[0069]从以上两种方式可以看出,根据签名的用户私钥已知还是未知,计算方法是不同的。
[0070]图2为本发明实施例提供的一通基于GPU的SM2算法中的数字签名生成算法实现装置结构示意图,包括GPU计算单元、CPU计算单元及存储器,其中,
[0071]GPU计算单元,用于执行SM2数字签名生成算法中的计算椭圆曲线点步骤,并将计算得到的椭圆曲线点及对应的随机数存储在存储器中;
[0072]CPU计算单元,用于执行SM2数字签名生成算法中的对用户私钥增I求逆计算步骤,得到用户私钥的增I逆值存储在存储器中;根据SM2数字签名生成算法计算步骤对待签名消息顺序计算时,调用存储器存储的预先存储的椭圆曲线点及对应的随机数,以及用户私钥的增I逆值,完成对待签名消息的数字签名。
[0073]存储器,用于存储椭圆曲线点及对应的随机数,以及用户私钥的增I逆值。
[0074]在本发明中,所述GPU计算单元可以包括多个,用于顺序执行SM2数字签名生成算法中的计算椭圆曲线点步骤,或者针对不同的随机数同时执行SM2数字签名生成算法中的计算椭圆曲线点步骤。
[0075]在本发明中,所述CPU计算单元,还用于在接收到SM2数字签名生成请求之前,存储有用户私钥,预先进行用户私钥增I求逆计算并存储在存储器中。
[0076]在本发明中,所述CPU计算单元包括多个CPU计算单元,其中,
[0077]一个CPU计算单元,还用于在CPU接收到SM2数字签名生成请求之后,CPU根据SM2数字签名生成算法步骤对待签名消息顺序计算之前,获取到用户私钥进行增I求逆计算并存储在存储器中;
[0078]CPU计算单元,该CPU计算单元可以为进行求逆计算的CPU计算单元也可以为其他计算单元,还用于根据SM2数字签名生成算法步骤对待签名消息顺序计算时,调用存储器存储的预先存储的椭圆曲线点及对应的随机数,以及用户私钥的增I逆值,完成对待签名消息的数字签名。
[0079]以下对结合CPU和GPU的SM2数字签名生成算法进行详细说明。
[0080]在未接收到SM2数字签名生成请求时,至少一个GPU计算单元,该GPU计算单元运行GPU线程,执行如下操作:获取随机数k e [l,n-l],计算椭圆曲线点(x,y)=[k]G,将k和计算结果[k]G对应地存储在存储器中。
[0081 ] 在该实施例中,可以有多个GPU计算单元同时计算椭圆曲线点(Xi, Yi) = [k]G(i=l,2,…,n),即有多个GPU计算单元执行指令相同,操作数不同的椭圆曲线点的计算,提高GPU的计算效率。
[0082]在GPU预计算椭圆曲线点[k]G的前提下,CPU计算单元直接从存储器中读取椭圆曲线点及对应的随机数,执行SM2数字签名生成算法。SM2数字签名生成算法执行过程中,CPU按照SM2数字签名生成算法的步骤顺序执行,需要计算S= ((1+4”.(k-r *dA))mod η,本发明实施例可以对其中的增I求逆运算(1+cg—1进行优化。
[0083]如果在接收SM2数字签名生成请求之前,已经存储了用户私钥dA,则至少一个CPU计算单元在接收SM2数字签名生成请求之前,计算S’ =(1+4)'将计算结果S’存储在存储器中。
[0084]在这种情况下,至少有一个CPU计算单元进行SM2数字签名生成算法的过程如下:
[0085]Al =Sm=Za Il Μ, Za Il M 表示 Za 与 M 的拼接;
[0086]Α2:计算e=Hv<ML将e的数据类型转换为整数;
[0087]A3:从存储器中读取GPU预计算存储的椭圆曲线点(X,y)=[k]G和k,如图3所示,图3为本发明实施例的椭圆曲线点及对应的随机数预计算及存取的示意图;
[0088]A4:计算r=(e+x)mod η,若r=0或r+k=n则重新从存储器中读取椭圆曲线点;
[0089]A5:从存储器中读取(Ι+ι1的计算结果S’,并计算s=(S’.(k_r.dA))mod η,若s=0则返回A3 ;
[0090]Α6:将r、s的数据类型转换为字节串,待签名消息M的签名为(r,s)。
[0091 ] 在上述SM2数字签名生成算法执行过程中,在接收SM2数字签名生成请求之前,预先计算了增I求逆运算(l+cg—1,因此,直接从存储器中读取(l+dj-1的运算结果,避免了耗时的求逆运算,提高了计算效率。[0092]如果在接收SM2数字签名生成请求之前,没有存储用户私钥dA,不能预先计算(1+cg—1,则可以通过接收多个不同用户私钥dA的SM2签名生成算法计算请求,实现同时对多个不同用户私钥4增I求逆操作的优化。
[0093]具体地,当收到多个dA不同的SM2签名生成算法计算请求时,一个CPU计算单元对不同用户私钥4增I求逆计算流程图如图4所示,其具体步骤为:
[0094]步骤401、接收i个不同的SM2数字签名生成请求,其用户私钥dA分别为dA1,
」Α2,…,c^Ai ;
[0095]在本步骤中,可以设定同时求逆计算的用户私钥门限数或者设定间隔时刻,当到达门限数或设定时间时,确认得到的用户私钥dA,执行步骤402 ;
[0096]步骤402、计算(I1=^cIai, d2=l+dA2,…,φ=1+(1Μ ;
[0097]步骤403、计算 d/ =Cl1, d2,=Cl1^d2,…,d/ =C^d2*…;
[0098]步骤404、计算 H= (d/ ) _1mod η ;
[0099]步骤405、计算…(Cl2K1=I^ddd3*...*di,...,(Cli)
*(1η ;并将(Cl1)-1, (d2r,…,(Cli)-1存储在存储器上。
[0100]在本步骤中,可以使用以下算法实现:
[0101]H’ — H
[0102]For k from i downto 2 do
[0103]1.df1 — H’ *4—/
[0104]2.H’—H’*dk
[0105]df1 —H,。
[0106]在图4中,步骤401和步骤402也可以用如下操作进行代替:
[0107]接收i个不同的SM2数字签名生成请求,其用户私钥dA分别为dA1,dA2,…,dAi ;每收到一个用户私钥dAm,就计算并存储相应的4=1+(^ (m=l, 2,…,i),直到m=i时,执行步骤 403。
[0108]在这种情况下,对于其他的CPU计算单元,进行SM2数字签名生成算法的过程如下:
[0109]Al =Sm=Za Il M, Za Il M 表示 Za 与 M 的拼接;
[0110]A2:计算,将e的数据类型转换为整数;
[0111]A3:从存储器中读取GPU预计算存储的椭圆曲线点(x,y)=[k]G和k ;
[0112]A4:计算r=(e+x)mod η,若r=0或r+k=n则重新从存储器中读取椭圆曲线点;
[0113]A5:从存储器中读取 dm' S= (dm_1.(k_r.dA))mod n,若 s=0 则返回 A3 ;
[0114]A6:将r、s的数据类型转换为字节串,待签名消息M的签名为(r,s)。
[0115]可以看出,如果对于i个SM2数字签名生成请求,如果对每个请求都计算一次求逆运算(l+cur1 (k=l, 2,…,i),则执行完i个SM2数字签名生成请求需要进行i次求逆运算。而本发明实施例在执行i个时,只需进行一次求逆操作H=(d’r,缩短了 i个SM2数字签名生成请求的平均实现时间,提高了计算效率。
[0116]举一个具体实施例对本发明进行详细说明
[0117]在该具体实施例中,选用了型号为E2 1230 v2的CPU与型号为GTX 680的GPU。[0118]在没有收到SM2数字签名生成请求时,启动100个GPU线程循环地执行如下操作:获取随机数k e [1,11-1],计算椭圆曲线点(1,7)=[106,并将{k, (x, y)}存储在存储器中。
[0119]在收到SM2数字签名生成请求之前,存储有用户私钥dA时,一个CPU线程进行增I求逆运算S’ =(1+4)'将S’保存在存储器中。
[0120]在收到SM2数字签名生成请求时,一个CPU线程,该CPU线程可以是对用户私钥dA增I求逆的CPU线程,也可以不是对用户私钥dA增I求逆的CPU线程。执行如下操作:
[0121]AI^G=ZaIIM, Za Il M 表示 Za 与 M 的拼接;
[0122]A2:计算e=HviM'卜将e的数据类型转换为整数;
[0123]A3:从存储器中读取GPU预计算存储的椭圆曲线点(x,y) = [k]G和k ;
[0124]A4:计算r=(e+x)mod η,若r=0或r+k=n则重新从存储器中读取椭圆曲线点;
[0125]A5:从存储器中读取(Ι+ι^1的计算结果S’,并计算s=(S’.(k_r.dA))mod η,若s=0则返回A3 ;
[0126]Α6:将r、s的数据类型转换为字节串,待签名消息M的签名为(r,s)。
[0127]如果在接收SM2数字签名生成请求之前,没有存储用户私钥dA,在接收多个不同SM2数字签名生成请求时,首先对对应的用户私钥dA收集,收集到1000个不同的用户私钥dA后,一个CPU线程执行如下算法:
[0128]输入:椭圆曲线基点的阶η,用户私钥dA1, dA2,...,dA1000O
[0129]输出:(l+dA1)-1, (l+dA2) \ …,(l+dA1_) 1
[0130]For i from I to 1000 do: ai — dAi+l.[0131]C1^a1.[0132]For i from 2 to 1000 do: Ci — CiJai mod n.[0133]u — c1000_1mod n.[0134]For i from 1000 downto 2 do
[0135]{af1 — ιι*(:ηΠιο(1 n.[0136]u — U^ai mod n.}
[0137]af1 —u.[0138]Return (a「\ a2_1,...,a1000_1).[0139]上述算法的输出结果保存在存储器中。
[0140]其它的CPU线程进行SM2数字签名生成算法的过程如下:
[0141]Al =Bm=Za Il Μ, Za Il M 表示 Za 与 M 的拼接;
[0142]A2:计算将e的数据类型转换为整数;
[0143]A3:从存储器中读取GPU预计算存储的椭圆曲线点(x,y) = [k]G和k ;
[0144]A4:计算r=(e+x)mod η,若r=0或r+k=n则重新从存储器中读取椭圆曲线点;
[0145]A5:从存储器中读取 a^1,s= (a^1.(k~r.dA))mod η,若 s=0 则返回 A3 ;
[0146]A6:将r、s的数据类型转换为字节串,待签名消息M的签名为(r,s)。
[0147]本发明提供的SM2数字签名生成算法可以应用在可靠性的消息传输领域中,保证无法对待签名消息的传输进行篡改,为待签名消息生成唯一的数字签名用于验证。[0148] 以上举较佳实施例,对本发明的目的、技术方案和优点进行了进一步详细说明,所应理解的是,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种SM2数字签名生成算法的实现方法,其特征在于,该方法包括: 将SM2数字签名生成算法中的计算椭圆曲线点步骤由图形处理器GPU预先计算,得到椭圆曲线点及对应的随机数,并存储在设置的存储器中; 将SM2数字签名生成算法中的对用户私钥增I求逆计算步骤由中央处理器CPU预先计算,得到用户私钥增I逆存储在设置的存储器中; CPU根据SM2数字签名生成算法计算步骤对待签名消息顺序计算时,调用存储器存储的椭圆曲线点及对应的随机数,以及用户私钥增I逆,完成对待签名消息的数字签名。
2.如权利要求1所述的实现方法,其特征在于,所述SM2数字签名生成算法中的对用户私钥增I求逆计算的CPU线程与所述根据SM2数字签名生成算法计算步骤对待签名消息顺序计算的CPU线程相同或不同。
3.如权利要求1所述的实现方法,其特征在于,所述将SM2数字签名生成算法中的对用户私钥增I求逆计算步骤在CPU预先计算为: 对于预先存储了用户私钥的签名请求,在接收SM2数字签名生成请求之前,预先进行用户私钥增I求逆计算,用户私钥表示为dA,用户私钥增I逆表示为(l+cg—imod n,其中η为椭圆曲线基点G的阶。
4.如权利要求1所述的实现方法,其特征在于,所述将SM2数字签名生成算法中的对用户私钥增I求逆计算步骤在CPU预先计算为: 对于未预先存储用户私钥的签名请求,在CPU接收到SM2数字签名生成请求之后,CPU根据SM2数字签名生成算法计算步骤对待签名消息顺序计算之前,获取到用户私钥进行增I求逆计算; 所述进行增I求逆计算的CP U线程与根据SM2数字签名生成算法计算步骤对待签名消息顺序计算的CPU线程不同。
5.如权利要求4所述的实现方法,其特征在于,所述获取到用户私钥进行增I求逆计算为: 设定同时增I求逆计算的用户私钥门限数或者设定间隔时刻,当到达同时增I求逆计算的用户私钥门限数或者设定的间隔时刻时,将所获取的多个不同用户私钥同时进行增I求逆操作后得到的不同用户私钥的增I逆。
6.如权利要求5所述的实现方法,其特征在于,所述将所获取的多个不同用户私钥同时进行增I求逆操作后得到的不同用户私钥增I逆为:
计算 Ci1=I+dA1,d2=l+dA2,…,Cli=I+dAi ; 计算(I1,=Cl1, d2,=Cl1^d2,…,d/ =C^d2*…;
计算 H= (Cli ’ ) _1mod η ; 计算(Cl1K1=I^d2*…*屯,(d2)H=J^dfd3*…*di,…,(Cli)H=J^dfd2*...*(1η ; 其中,dAi为用户私钥,(Cli)-1为用户私钥的增I逆,η为椭圆曲线基点G的阶。
7.如权利要求1所述的实现方法,其特征在于,所述SM2数字签名生成算法中的计算椭圆曲线点步骤的计算由一个GPU线程顺序完成,或多个GPU线程针对不同的随机数同时计算完成。
8.—种SM2数字签名生成算法的实现装置,其特征在于,该装置包括:GPU计算单元、CPU计算单元及存储器,其中,GPU计算单元,用于执行SM2数字签名生成算法中的计算椭圆曲线点步骤,并将计算得到的椭圆曲线点及对应的随机数存储在存储器中; CPU计算单元,用于执行SM2数字签名生成算法中的对用户私钥增I求逆计算步骤,得到用户私钥的增I逆值存储在存储器中;根据SM2数字签名生成算法计算步骤对待签名消息顺序计算时,调用存储器存储的预先存储的椭圆曲线点及对应的随机数,以及用户私钥增I逆值,完成对待签名消息的数字签名。 存储器,用于存储椭圆曲线点及对应的随机数,以及用户私钥的增I逆。
9.如权利要求8所述的实现装置,其特征在于,所述CPU计算单元,还用于在接收到SM2数字签名生成请求之前,存储有用户私钥,预先进行用户私钥增I求逆计算并存储在存储器中。
10.如权利要求8所述的实现装置,其特征在于,所述CPU计算单元包括多个CPU计算单元,其中, 一个CPU计算单元,还用于在CPU接收到SM2数字签名生成请求之后,CPU根据SM2数字签名生成算法步骤对待签名消息顺序计算之前,获取到用户私钥增I进行求逆计算并存储在存储器中; 其他CPU计算单元,还用 于根据SM2数字签名生成算法步骤对待签名消息顺序计算时,调用存储器存储的预先存储的椭圆曲线点及对应的随机数,以及用户私钥的增I逆值,完成对待签名消息的数字签名。
11.如权利要求8所述的实现装置,其特征在于,所述GPU计算单元为一个或一个以上,用于顺序执行SM2数字签名生成算法中的计算椭圆曲线点步骤,或者针对不同的随机数同时执行SM2数字签名生成算法中的计算椭圆曲线点步骤。
【文档编号】H04L9/30GK103546288SQ201310445395
【公开日】2014年1月29日 申请日期:2013年9月25日 优先权日:2013年9月25日
【发明者】林璟锵, 潘无穷, 余幸杰, 王琼霄, 荆继武 申请人:中国科学院数据与通信保护研究教育中心