加速国密SM2算法的优化实现系统及方法与流程

文档序号:18938777发布日期:2019-10-23 00:58阅读:2433来源:国知局
加速国密SM2算法的优化实现系统及方法与流程
本发明涉及的是一种信息安全领域的技术,具体是一种加速国密sm2算法的优化实现系统及方法。
背景技术
:sm2椭圆曲线密码算法包括sm2加密/解密密码算法和sm2签名/验签密码算法,该算法目前所使用的椭圆曲线参数是国家密码局推荐的256位椭圆曲线参数,椭圆曲线上的标量乘法(包括固定点的点乘和不定点的点乘)是计算一个256位的标量k与一个椭圆曲线上的点p的乘积r=[k]p,而标量乘的快慢直接决定了国密sm2算法的快慢。在目前已有的sm2实现方案中,算法的性能相对较低,因此,提高sm2算法的性能,不但可以减少签名和验签的时间,还可以节约大量的计算资源,特别是在服务器端需要进行大量的签名和验签运算的时候,节约计算资源就相当于节约能源。技术实现要素:本发明针对现有技术存在的上述不足,提出一种加速国密sm2算法的优化实现系统及方法,通过对算法中的标量乘法(包括固定点的点乘算法和不定点的点乘算法)以及底层实现进行优化,使得国密sm2算法的运算速度有大幅度的提升。本发明是通过以下技术方案实现的:本发明涉及一种加速国密sm2算法的优化实现系统,包括:由摘要信息生成单元、签名生成单元构成的签名模块和由验证点生成单元、签名验证单元构成的验签模块,其中:签名模块通过摘要信息生成单元生成摘要值并输出至签名生成单元,签名生成单元通过预制表及点加运算得到椭圆曲线基点g的k倍点[k]g的点乘结果并快速生成签名数据(r,s);验签模块中的验证点生成单元根据签名数据(r,s)得到中间参数并通过预计算表得到验证点坐标后输出至签名验证单元,签名验证单元根据验证点坐标得到验证信息用于核对签名数据实现验签。所述的摘要信息生成单元对待签名消息m、本次签名所使用的公钥p以及椭圆曲线参数a和b、椭圆曲线基点g以及sm2椭圆曲线默认使用的id生成摘要值e。所述的签名生成单元通过:随机数生成器得到的倍率参数k、私钥d、通过查表及点加得到的椭圆曲线基点g的k倍点[k]g的点乘结果以及摘要值e,计算得到签名数据(r,s)。所述的验证点生成单元根据签名数据(r,s)得到中间参数t,然后再由一次固定点乘运算和一次不定点乘运算所得结果相加得到验证点坐标。所述的签名验证单元根据验证点坐标和本地计算得到的摘要值e得到验证信息r用于核对签名数据r并实现验签。本发明涉及一种加速国密sm2算法的优化实现方法,包括签名过程和验签过程,其中:签名过程是指:根据输入信息生成摘要值,根据摘要值、随机数和私钥计算得到签名数据;验签过程是指:根据输入信息重新生成摘要值,根据摘要值和签名数据得到验证信息,经与原签名数据比对实现验签。技术效果与现有技术相比,本发明通过使用本方法提出的固定点点乘方案,并结合算法底层的优化技术,可以大幅提升国密sm2算法的签名和验签性能,在相同的i76700处理器测试平台上可以使得国密sm2算法的签名速度达到94600次每秒,验签速度达到18528次每秒,签名性能相比于目前最快实现提升了约107.0%,验签性能相比于目前最快实现提升了约19.1%。附图说明图1为sm2椭圆曲线签名和验签的总体流程示意图;图2为实施例消息摘要计算流程图;图3为实施例签名数据生成流程图;图4为实施例签名数据验证流程图。具体实施方式如图1所示,为sm2椭圆曲线签名和验签的总体流程。如图1(a)所示,为sm2的签名生成过程,具体为:根据待签名消息m、本次签名所使用的公钥p以及椭圆曲线参数a和b、椭圆曲线基点g以及sm2椭圆曲线默认使用的id生成消息的摘要值e,并计算得到待签名消息m的签名数据(r,s)。所述的摘要值e,具体通过以下方式得到:如图2所示,待签名消息m、公钥p、椭圆曲线系统参数(a、b、g、p)、id和id长度idlen,按顺序拼接idlen、id、a、b、g、p,并采用sm3哈希算法计算其哈希值za=h256(idlen||id|a|b||g|p),其中:||表示字节拼接符号,h256()为sm3哈希函数;按顺序拼接za和消息m,并计算其哈希值,即摘要值e=h256(za||m)。所述的摘要值e中,默认使用的id是16字节的字符串“1234567812345678”,id长度idlen为数值16,并以两个字节保存。所述的签名数据(r,s),具体通过以下方式得到:如图3所示,根据摘要值e、私钥d以及通过随机数生成器生成的256位1到n-1之间的随机数k,此处的n为基点g的阶,由k与椭圆曲线上基点g点乘得到[k]g,即椭圆曲线上的另一个点(x1,y1);进而得到签名中的r=(e+x1)modn,然后判断①r为零或②r+k等于n,当任一条件满足时则返回随机数生成过程,仅当两个条件均不满足时计算s=(1+d)^(-1)·(k-r·d)modn,然后判断s为零时则返回随机数生成过程重新进行计算,仅当s不为零时输出签名结果(r,s)。所述的基点g的k倍点[k]g,即椭圆曲线固定点的点乘算法在签名中占据重要的比重,在签名过程中,超过50%的计算量都落在固定点的点乘当中,因此,固定点的点乘快慢,直接决定了签名的快慢。本方法通过优化256位固定点的点乘方法,可以有效加速整个签名的运算过程,并且使得固定点的点乘复杂度降到最低,只需要31次的点加操作就能完成256位固定点的点乘过程。所述的256位固定点的点乘方法是指:把256位的标量值k进行拆分,拆分的最小单位是字节,即:把256位的标量k拆分为32个小标量值,每一个小标量值是一个字节大小,最后使得基点g和256位的标量k的乘法变成32次的小标量乘法和32个点相加,而这32次标量乘法中的每一次乘法只涉及到某个椭圆曲线上的固定点和一个8位的标量相乘,在本方法中,把32个固定点的每一个固定点和8位标量乘的所有结果都预计算出来,保存到预制表中,使用到的时候直接查表即可,因此,基点g和标量k的乘法操作转换成32个点相加,而无需任何的倍点操作。本方法中所提出的固定点的点乘方案,不仅适用于国密sm2密码算法,同样适用于其它的基于椭圆曲线的公钥密码算法,例如,ecdsa等。此外,该方案也不仅适用于基于256位的椭圆曲线算法,同样也适用于其它位数的其它椭圆曲线算法,例如,符合nist标准的曲线、符合sec标准的曲线和符合brainpool标准的曲线等。所述的256位固定点的点乘方法具体步骤包括:步骤1)将256位的标量k拆分成4个64位的值,即:k=(k3,k2,k1,k0),其中:k3表示k的最高64位,k0表示k的最低64位,对于每个64位的值ki,其中:i=0,1,2,3,进一步拆分为8个8位的值:步骤2)固定点的点乘:其中:gi=2256*i·g。特别地,由于sm2算法中的参数g为固定值,因此gi也为固定值,可以预先计算并保存备用。步骤3)对步骤2拆分为更细粒度的值:其中:特别地,由于sm2算法中的参数g为固定值,因此也为固定值,可以预先计算并保存备用。步骤4)预先计算每个的所有可能值,整个256位的固定点的点乘算法为其中:每个均为8位,每个均为预先计算得到的已知值且总共有4*8=32种,即每个与一个8位的的乘积。所述的所有可能值,由于每个与一个8位的标量相乘时只可能会出现256种结果,即计算所有可能值并存储于预制表中,该预制表的大小为:4*8*256*sizeof(g)字节,sizeof(g)表示基点g的字节大小。当曲线上的点使用仿射坐标表示,一个点需要占用64字节,则该预制表的大小即为4*8*256*64=512kb。通过步骤4将整个固定点的点乘过程中去除倍点运算环节且替换为4*8-1=31次的点加运算(x个点相加只需要x-1次加法),然后再加上32次的查表运算,而查边运算的耗时几乎可以忽略不计,因此,该方法的复杂度相当于31次的点加运算,相比于之前的方法,性能将有大幅提升。本方法适用于不同位数的不同曲线,下表列出了一些常用曲线位数所对应的固定点的点乘复杂度和存储消耗(存储消耗使用曲线点的数量来表示):曲线位宽固定点乘复杂度存储消耗160位20-1=19次点加20*256=5120个曲线点192位24-1=23次点加24*256=6144个曲线点224位28-1=27次点加28*256=7168个曲线点256位32-1=31次点加32*256=8192个曲线点384位48-1=47次点加48*256=12288个曲线点512位64-1=63次点加64*256=16384个曲线点如图1(b)所示,为sm2对签名的验证过程,具体为:判断签名数据(r,s)中签名数据r和s是否在1到n-1这个范围之内,当至少存在一者不在这个范围之内,则直接判定该签名为非法签名,并结束本次验签过程;当二者都在1到n-1这个范围之内,则采用与签名生成过程相同的方式生成消息的摘要值,并根据摘要值验证签名的合法性,具体步骤包括:步骤i)如图4所示,根据签名数据(r,s)计算中间参数t=(r+s)modn,仅当t不为0时计算出椭圆曲线上的验证点p2(x2,y2)=s·g+t·p,其中:s·g为签名数据s与固定点g的点乘,t·p是中间参数t和公钥p的不定点点乘,把二者乘出来的结果再进行相加,即可得到椭圆曲线上的验证点坐标(x2,y2)。所述的固定点g的点乘采用与签名过程相同的方法以最大限度的节省固定点点乘的性能开销。所述的不定点的点乘t·p,同样采用预计算的方式生成一张小规模预制表,但是这个表格会随着公钥p的不同而不同,因此,每次计算t·p的时候都需要重新计算该预制表后再将其用于不定点点乘的简化运算。步骤ii)将本地计算得到的摘要值e’和x2进行加法运算得到验证信息r=(e’+x2)modn,并判断当r与r相等时,签名(r,s)合法。所述的本地计算是指:每次验签时按与签名生成过程相同的方式重新计算摘要值。现有国密sm2算法的签名速度最快到达4.5万次每秒,验签速度最快到达1.5万次每秒,签名与验签的比率最高到达3倍左右。相比之下本方法在一台搭载i76700处理器的机器上能够使得国密sm2算法的签名速度超过9.4万次每秒,验签速度超过1.8万次每秒,签名速度与验签速度的比率超过5倍(这个比率在传统方案中,最高达到3倍左右)。而这里所采用的核心技术是所提出的一种快速固定点的点乘方案,对于256比特的国密sm2算法,固定点的点乘仅只需要消耗31次的点加运算就可以完成,因此,大幅提高了固定点的点乘速度,使得签名速度也有大幅度的提升。上述具体实施可由本领域技术人员在不背离本发明原理和宗旨的前提下以不同的方式对其进行局部调整,本发明的保护范围以权利要求书为准且不由上述具体实施所限,在其范围内的各个实现方案均受本发明之约束。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1