基于SM2算法标量乘法编码的抗侧信道攻击方法及系统与流程

文档序号:19729518发布日期:2020-01-18 03:47阅读:368来源:国知局
本公开涉及抗侧信道攻击
技术领域
:,特别是涉及基于sm2算法标量乘法编码的抗侧信道攻击方法及系统。
背景技术
::本部分的陈述仅仅是提到了与本公开相关的
背景技术
:,并不必然构成现有技术。随着密码破译技术的快速发展,侧信道攻击对智能卡、物联网终端等嵌入式设备构成严重的威胁。侧信道攻击通过统计学方法,在有限次的密码运算内,可以恢复出智能卡的私钥信息。由于椭圆曲线公钥密码算法计算速度快、安全强度高,使得该算法在物联网终端等嵌入式设备的实现更有吸引力,因此研究能够有效对抗侧信道攻击的椭圆曲线公钥密码算法对提高物联网芯片及设备的安全性具有重要意义。在实现本公开的过程中,发明人发现现有技术中存在以下技术问题:椭圆曲线(ecc)是一种新兴的公钥密码算法,椭圆曲线公钥密码算法中的核心问题是计算标量乘法,同时该运算也是最耗时的。在椭圆曲线公钥密码体系中的算法中均涉及到固定点乘法。在签名算法只需要计算一个固定点的标量乘法kg,其中g为椭圆曲线的基点,其坐标表示为(gx,gy);k为256比特无符号数,满足k∈[1,n-1];n为曲线的阶,sm2中,n=0xfffffffeffffffffffffffffffffffff7203df6b21c6052b53bbf40939d54123。gx=0x32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7;gy=0xbc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0。验签算法中需要计算两个点的标量乘法kg+lq,其中g为椭圆曲线的基点,q为椭圆曲线上的点,k,l∈[1,n-1]。在公钥加密和密钥协商协议中也有类似操作。对于已知点g,我们可以通过预先计算得到一个参数表,在计算中通过查表得到kg计算所需的数据来减少运算量。对于固定点标量乘法方面已经有相当多的研究,如二进制naf法、w-naf法,滑动窗口法、固定基comb方法等。其中w-naf法应用最为广泛,如gmssl和openssl中的nistp256和sm2实现均采用了w-naf方法。但是由于w-naf方法在实现过程中需要点加操作add和倍点操作dbl交替进行,而这两种操作执行时间具有明显差异,容易被侧信道攻击。同时预计算参数表排列规律,如二进制文件泄露通过反汇编就可以较容易的猜测和定位算法。技术实现要素:为了解决现有技术的不足,本公开提供了基于sm2算法标量乘法编码的抗侧信道攻击方法及系统;第一方面,本公开提供了基于sm2算法标量乘法编码的抗侧信道攻击方法;基于sm2算法标量乘法编码的抗侧信道攻击方法,包括:生成基准坐标表,生成预编码坐标参数表partable;获取输入的椭圆曲线公钥密码算法的参数k;基于基准坐标表、预编码坐标参数表partable和椭圆曲线公钥密码算法的参数k,实时生成编码表;基于实时生成的编码表,完成椭圆曲线公钥密码算法中的固定点标量乘法kg的运算,在椭圆曲线公钥密码的数字签名生成过程、数字签名验证过程、加密过程或密钥交换协商过程中使用运算获取的kg,抵御侧信道攻击。第二方面,本公开还提供了基于sm2算法标量乘法编码的抗侧信道攻击系统;基于sm2算法标量乘法编码的抗侧信道攻击系统,包括:生成模块,其被配置为:生成基准坐标表,生成预编码坐标参数表partable;获取模块,其被配置为:获取输入的椭圆曲线公钥密码算法的参数k;编码表生成模块,其被配置为:基于基准坐标表、预编码坐标参数表partable和椭圆曲线公钥密码算法的参数k,实时生成编码表;抵御模块,其被配置为:基于实时生成的编码表,完成椭圆曲线公钥密码算法中的固定点标量乘法kg的运算,在椭圆曲线公钥密码的数字签名生成过程、数字签名验证过程、加密过程或密钥交换协商过程中使用运算获取的kg,抵御侧信道攻击。第三方面,本公开还提供了一种电子设备,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,所述计算机指令被处理器运行时,完成第一方面所述方法的步骤。第四方面,本公开还提供了一种计算机可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成第一方面所述方法的步骤。与现有技术相比,本公开的有益效果是:本公开的椭圆曲线固定点标量乘法编码方法避免了广泛应用的窗口大小w非相邻型(w-naf)方法参数表排列规律的缺点,可以有效避免源码分析攻击,同时安全性与算法效率与w-naf方法相当。此外,通过调整编码参数即可便捷的生成新的参数表,在实际的公钥密码应用中安全性更高。我们还对窗口大小w为8的编码方法进行了优化,进一步提高了标量乘法效率。本公开提出了一种全新的椭圆曲线固定点标量乘法编码方法,以及按照该编码规则生成参数表的方法;本公开的计算固定点标量乘法的高效解码和计算方法,整个计算过程中只有add操作,运算高效且不易被侧信道攻击。本公开对窗口大小w为8的编码方法进行优化,减少了一次add操作,进一步提高了算法效率。本公开的编码及快速实现方法主要针对256位的shortweierstrass曲线如nistp256及sm2在雅可比加重射影坐标系下标量乘法编码及快速实现,但是该方法同样适用于其他长度和曲线类型在其他坐标系下的标量乘法编码及快速实现方法。附图说明构成本申请的一部分的说明书附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。图1为第一个实施例的方法流程图。具体实施方式应该指出,以下详细说明都是示例性的,旨在对本申请提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本申请所属
技术领域
:的普通技术人员通常理解的相同含义。需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。实施例一,本实施例提供了基于sm2算法标量乘法编码的抗侧信道攻击方法;如图1所示,基于sm2算法标量乘法编码的抗侧信道攻击方法,包括:s1:生成基准坐标表,生成预编码坐标参数表partable;s2:获取椭圆曲线公钥密码算法的参数k;s3:基于基准坐标表、预编码坐标参数表partable和椭圆曲线公钥密码算法的参数k,实时生成编码表;s4:基于实时生成的编码表,完成椭圆曲线公钥密码算法中的固定点标量乘法kg的运算,在椭圆曲线公钥密码的数字签名生成过程、数字签名验证过程、加密过程或密钥交换协商过程中使用运算获取的kg,抵御侧信道攻击。所述数字签名生成过程、数字签名验证过程、加密过程和密钥交换协商过程为国家标准gb_t32918.1-2016信息安全技术sm2椭圆曲线公钥密码算法中的公知流程,此处不再赘述。在椭圆曲线公钥密码的数字签名生成过程、数字签名验证过程、加密过程和密钥交换协商过程应用中,kg的运算均为核心操作,其中k为秘钥或随机数,如果在运算过程中发生泄露,则无法保证ecc公钥密码算法的安全性,利用本发明的可抵御基于时间和功耗的侧信道攻击的安全实现方法,可以高效安全的完成标量乘法kg的运算,保护秘密信息不泄露。首先kg的运算时间与k无关,因此无法通过测量程序执行时间来推算k;同时只有add运算,因此无法利用检测double和add操作时间和功耗来分析k的特点。作为一个或多个实施例,所述生成基准坐标表,生成预编码坐标参数表;具体步骤包括:s11:设定宽度w,对w个连续的比特进行naf编码,得到naf编码列表;s12:基于naf编码列表,生成序列特征码表;s13:生成基准坐标表;s14:基于序列特征码表和基准坐标表中的基准数据,生成预编码坐标参数表。作为一个或多个实施例,所述s11的设定宽度w,对w个连续的比特进行naf编码,得到naf编码列表;,具体步骤包括:s111:生成三个宽度为w的naf编码列表mnaflist[3][n];n为naf编码元素数,设置第一个naf编码列表的第一个元素为0;设置第二个naf编码列表的第一个元素为1;设置第三个naf编码列表的第一个元素为-1;每个naf编码列表的列数量ccnt=3;naf编码列表的元素编号均从1开始;s112:设置临时序列数量newccnt=ccnt;临时变量i=0,用于存储和计算序列编号;序列编号均从0开始;s113:为序列i生成编号为n的元素:设置编号为n的元素值为0mfaflist[i][n]=0;如果mfaflist[i][n-1]不等于0则进行序列扩展;增加两个序列到naf编码列表mnaflist最后,得到mfaflist[newccnt][n]和mfaflist[newccnt+1][n],新增的两个序列的编号为newccnt和newccnt+1,将序列i的前n个元素分别复制到新的序列中;将mfaflist[i][0]至mfaflist[i][n-1]共n个元素依次复制到mfaflist[newccnt][0]至mfaflist[newccnt][n-1];将mfaflist[i][0]至mfaflist[i][n-1]共n个元素依次复制到mfaflist[newccnt+1][0]至mfaflist[newccnt+1][n-1];序列newccnt的编号为n的元素设为1,mfaflist[newccnt][n]=1,序列newccnt+1的编号为n的元素设为-1,mfaflist[newccnt+1][n]=-1;s114:newccnt=newccn+2;s115:i=i+1,判断i是否等于ccnt,如果i等于ccnt,转s115,否则转s116;s116:ccnt=newccnt;n=n+1;s117:判断n是否等于n,如果不等于n,则跳转到s112,否则跳转到s117;s118:删除第一个全0序列,ccn=ccn-1;编码结束,即得到naf编码列表mfaflist[ccnt][n]。作为一个或多个实施例,所述s12的基于naf编码列表,生成序列特征码表;具体步骤包括:s121:生成各序列特征码,并将各个序列特征码保存至特征信息数组mgnafcntnon[ccnt];s122:初始化编码信息结构体数组mgnafinfon[lcnt],编码信息结构体数量为lcnt;s123:在特征码信息数组mgnafcntnon[ccnt]中,遍历所有的特征码,计算表索引参数pos和元素数量count,得到序列特征码表。进一步地,所述步骤s121的具体步骤包括:s1211:设临时变量j=0,用于存储和计算序号;s1212:设临时变量n=0;设置临时特征码tno为0;tno为数据宽度sw的无符号数。应理解的,数据宽度sw与宽度w和操作系统有关;一般32位操作系统下sw=32,64位操作系统下sw=64;s1213:提取序列j中的编号为nn的元素mnaflist[j][nn],如果第nn个元素为-1,则执行:tno=tno+2(w-1-nn)×bin_shift_a;如果第nn个元素为1,则执行:tno=tno+2(w-1-nn)×bin_shift_a+2(w-1-nn)×bin_shift_b;其中,bin_shist_a,bin_shift_b为常数,且bin_shist_a=bin_shist_b+1。给出如下宽度的bin_shift_a和bin_shift_b值:当w为7或8,sw为32或64时,bin_shift_b为3,bin_shift_a为4;等w小于7,sw为16,32或64时,bin_shift_b为2,bin_shift_a为3;s1214:nn=nn+1,如果nn小于w,转s1213,否则转s1215;s1215:将特征码tno保存到特征码信息数组:mgnafcntnon[j]=tno;s1216:j=j+1,如果j小于ccnt,转s1212,否则转s1217;s1217:将mgnafcntnon[ccnt]中的元素复制到一个相同类型的临时数组tmpg[ccnt],然后将mgnafcntnon[ccnt]中保存的特征码按照从小到大排序;s1218:利用tmpg和mgnafcntnon将mnaflist[ccnt][w]按照特征码重新排序。s12181:令临时变量j=0;s12182:令临时变量jj=j,s12182a:判断tmpg[jj]是否等于mgnafcntnon[j],如相等则交换mnaflist[jj]和mnaflist[j]的元素;转s12184;如果不相等;jj=jj+1,转s12183;s12183:判断jj是否等于ccnt,如是,报错,退出;否则转s12182a;s12184:j++,如果j等于ccnt,结束,否则转s12182。进一步地,所述s122的具体步骤包括:编码信息结构体数组mgnafinfon[lcnt]有三个元素:特征值flag,特征值flag是常量,特征值flag的数据长度为sw,设置原则和参考初始值如下:lcnt为常数,且lcnt=2n,如8、16、32,lcnt与flag协同计算,保证各段内元素数量基本相同。段内元素数量count,用于记录本段内的元素数量。数据类型为无符号整型,初始值为0;表索引pos,用于编码坐标表的定位和查找数据类型为无符号整型,初始值为0。以宽度w=8,编码信息结构体数量lcnt=16为例:设置标志位mgnafinfon[i].flagi=0~15初始值:0x000000,0x010000,0x100000,0x108000,0x1000000,0x1010000,0x1040000,0x1050000,0x10000000,0x10010000,0x10100000,0x10108000,0x10200000,0x10210000,0x10300000,0x103080000x表示16进制数,flag值设置与序列特征码bin_shift_a,bin_shift_b有关,设置原则为使各段内元素数量count一致。进一步地,所述s123的具体步骤包括:s1231:设临时变量iii=lcnt-1;s1232:设临时变量jjj=ccnt-1;s1233:判断mgnafcntnon[iii]是否不小于mgnafinfon[jjj].flag,如满足条件则设置mgnafinfon[j].count=mgnafinfon[j].count+1,并将mgnafinfon[j].pos设置为i,转,否则转s1234;s1234:jjj=jjj-1;判断jjj是否等于0,如等于0转s1235;否则转s1233;s1235:iii=iii-1;判断iii是否等于0,如果等于0,转s1236;否则转s1232;s1236:结束。应理解的,例如:对于w=8,lcnt=16,bin_shift_a=4,bin_shift_b=3得到如下序列特征码表mgnafinfon[16]={{0x00000000,0,20},{0x00010000,20,22},{0x00100000,42,21},{0x00108000,63,21},{0x01000000,84,21},{0x01010000,105,22},{0x01040000,127,21},{0x01050000,148,22},{0x10000000,170,21},{0x10010000,191,22},{0x10100000,213,21},{0x10108000,234,21},{0x10200000,255,21},{0x10210000,276,22},{0x10300000,298,21},{0x10308000,319,21},}。作为一个或多个实施例,所述s13的生成基准坐标表;具体步骤包括:预先计算标准射影坐标系下的基准坐标表trefcord,基准坐标表trefcord中共有257组基准坐标:±rp,其中r为2t,t=0~256,因为+rp与-rp值只有y坐标不同,因此共用一个x值,存储顺序为x,y,-y,每个值256位,这三个值称为一组基准值,一组基准值的存储空间t为768位。trefcord总存储空间大小基准坐标表用于辅助计算预编码坐标参数表partable。作为一个或多个实施例,所述s14的基于序列特征码表和基准坐标表中的基准数据,生成预编码坐标参数表partable;具体步骤包括:s141:设置序号iiii=0,创建一个临时存储空间basedata,存储空间临时basedata大小为w×t;已生成参数数量gencnt=0;创建三个宽度为256比特的坐标内存空间qx,qy,qz;创建三个宽度为256比特的坐标内存空间ox,oy,oz;创建两个宽度为256比特的坐标内存空间sx,sy;s142:设基偏移量base=i×w;如果base+w<257,则设置待复制数据宽度dataneedcpy=w;否则,设置待复制数据宽度dataneedcpy=257-base;s143:将预计算的基准数据第base个数据开始的dataneedcpy组基准值从基准坐标表trefcord复制到临时存储空间basedata;s1430:设置naf编码列表mnaflist编号jjjj=0;s1431:设置全零标志allzero=1,mnaflist元素序号m=0;s14311:如果mnaflist[jjjj][m]为0,转到s14313;否则设置x坐标偏移量offsetx为basedata中第m组基准值的x坐标序号,设置y坐标偏移量offsety为basedata中第m组基准值的y坐标序号;如果mnaflist[jjjj][m]<0,设置y坐标偏移量offsety为basedata中第m组基准值的-y坐标序号;转s14312;s14312:如果全零标志allzero=1,将临时存储空间basedata中x坐标偏移量offsetx对应的x坐标值复制到宽度为256比特的坐标内存空间qx,将y坐标偏移量offsety对应的y坐标值复制到宽度为256比特的坐标内存空间qy,令宽度为256比特的坐标内存空间qz=1,allzero=0。否则执行点加运算:(ox,oy,oz)=add(qx,qy,qz,basedata(offsetx),basedata<offsety>);点加运算函数为雅可比加重射影坐标系下的加法运算,第一个点为(qx,qy,qz),qx,qy,qz分别对应椭圆曲线上的x,y,z坐标;第二个点为(basedata<offsetx>,basedata<offsety>,1)。s14313:m=m+1,如果m<dataneedcpy,则转到s14311;否则,将雅可比坐标系下的点(qx,qy,qz)转到标准射影坐标系下的点(sx,sy),将点(sx,sy)保存至参数表partable第gencnt组坐标,保存顺序为sx,sy;每组坐标数据宽度为wg=512比特/sw,x和y坐标数据宽度为wg=256比特/sw;gencnt=gencnt+1;转到步骤s1432;s1432:jjjj=jjjj+1,判断jjjj<lcnt则跳转到s1431;否则,转s144;s144:iiii=iiii+1,判断iiii是否等于n-1同时w=8;如满足,则转s145;如果不满足,则判断iiii是否小于n;如小于n,则转s142,如不小于n,则转s146;s145:取出预编码坐标参数表partable中的最后w组坐标;对每组参数执行点加运算:(ox,oy,oz)=add(qx,qy,1,p2e256_x,p2e256_y),其中,第一个点为(qx,qy,1),第二个点为(p2e256_x,p2e256_y,1),第二个点为2256g在标准射影坐标系下的坐标。每次执行完毕后将雅可比坐标系下的点(qx,qy,qz)转到标准射影坐标系下的点(sx,sy),将点(sx,sy)保存至参数表partable第gencnt组坐标,保存顺序为sx,sy,gencnt=gencnt+1,w组数据处理完成后转s146;s146:将点(p2e256_x,p2e256_y)保存至参数表partable第gencnt组坐标。gencnt=gencnt+1;转s147;s147:结束,最终得到预编码坐标参数表。作为一个或多个实施例,所述s2的获取椭圆曲线公钥密码算法的参数k;具体步骤包括:将标量乘法系数转换为256比特的无符号整数k。作为一个或多个实施例,所述s3的基于基准坐标表、预编码坐标参数表和椭圆曲线公钥密码算法的参数k,实时生成编码表;具体步骤包括:s31:生成k的naf序列tnaf[ccnt],得到序列长度ic,将0填充序列中编号为ic后的元素,填充数量为ccnt–ic;s32:开始解码以获取偏移地址:设置临时序号i=0;s320:设置偏移量offset=i×w,元素数量cnt=0;s321:设置临时序号jj=0;s322:如果tnaf[offset+jj]大于0,则cnt=cnt+2(w-1-jj)×bin_shift_a如果tnaf[offset+jj]小于0,则cnt=cnt+2(w-1-jj)×bin_shift_a+2(w-1-jj)×bin_shift_b;s323:jj=jj+1,如果jj<n,转s322;否则转s324;s324:如果cnt不等于0,则令naf[i]=nafn×i+gotnafpos(cnt);否则令naf[i]=-1;s325:i++,如果i<n,转s321,否则转s326a;s326a:判断w是否等于8,如不等于8转s326;否则进一步进行处理:a.首先判断n,如果n等于33,转b,否则转e;b.判断naf[32],如果naf[32]不大于0转d,否则转c;c.判断naf[31],如果naf[31]大于0则设置naf[31]=naf[31]+8×wg。否则设置naf[31]=(gencnt-1)×wg;转d;d.n=32;转e;e.w=8处理结束。s326:输出n,结束。其中,s324的gotnafpos(cnt)为获取偏移量的函数,实现如下:s3241:设置临时变量i=lcnt-1;s3242:如果cnt不小于mgnafinfon[i].flag执行:设置临时变量1posx=mgnafinfon[i].pos;临时变量2t2=mgnafinfon[i].count;判断cnt是否小于mgnafcntnon[t2/2+posx],如条件成立转s3245,否则执行:设置临时变量j=t2/2;s3243:判断mgnafcntnon[j+posx]是否等于cnt;如果相等,输出posx+j,结束。否则转s3244;s3244:j=j+1;判断j是否小于t2;如满足,转s3243;否则转s3248;s3245:设置临时变量j=0;s3246:判断mgnafcntnon[j+posx]是否等于cnt;如果相等,输出posx+j,结束。否则转s3247;s3247:j=j+1;判断j是否小于t2/2;如满足,转s3246;否则转s3248;s3248:i=i-1;判断i是否等于0,如果等于0则跳转至s3249,否则跳转至s3242;s3249:输出-1,结束。作为一个或多个实施例,所述s4的基于实时生成的编码表,完成椭圆曲线公钥密码算法中的固定点标量乘法kg的运算;具体步骤包括:设置序号i=0;全零标志allzero=1,创建数组存储坐标内存空间qx、qy、qz、px、py和pz,每个坐标长度为256比特,初始化为:qx=1,qy=1,qz=0,px=1,py=1,pz=0s41:如果naf[i]不小于0,则转s42,否则转s43;s42:计算偏移地址设x坐标的partable表偏移地址offsetx为:offsetx=naf[i]×wg;设y坐标的partable表偏移地址offsety为:offsety=offsetx+wg;如果allzero=0,则执行点加操作:(qx,qy,qz)=add(qx,qy,qz,partable<offsetx>,partable<offsety>)否则,将数据复制到(qx,qy),qz=1,设置allzero=0;转s44;s43:对于验签或无须固定计算时间追求运算速度的情况则直接跳转到s44;否则执行以下步骤:设x坐标的partable表偏移地址为:offsetx=i×wg;设y坐标的partable表偏移地址为:offsety=offsetx+wg;如果allzero=0,则执行点加操作:(px,py,pz)=add(px,py,pz,partable<offsetx>,partable<offsety>)否则,将数据复制到(px,py),pz=1;s44:i=i+1,如果i<n,跳转到s41,否则跳转到s45;s45:将雅可比坐标系下的点(qx,qy,qz)转到标准射影坐标系下的点(sx,sy),计算结束。本发明参数生成函数只需要运行一次,用于生成静态参数表和引导表。此外,为了抵抗源码分析攻击可不保存静态的参数表,可以在程序启动时预先生成参数表和引导表,同时在程序运行过程中动态更新参数生成新的参数表。参数表的更新不会影响算法正确性和实现安全性。本发明中的固定点标量乘法虽然以基点g为例,但该方法同样适用于任意的固定点标量乘法。实施例二,本实施例还提供了基于sm2算法标量乘法编码的抗侧信道攻击系统;基于sm2算法标量乘法编码的抗侧信道攻击系统,包括:生成模块,其被配置为:生成基准坐标表,生成预编码坐标参数表partable;获取模块,其被配置为:获取输入的椭圆曲线公钥密码算法的参数k;编码表生成模块,其被配置为:基于基准坐标表、预编码坐标参数表partable和椭圆曲线公钥密码算法的参数k,实时生成编码表;抵御模块,其被配置为:基于实时生成的编码表,完成椭圆曲线公钥密码算法中的固定点标量乘法kg的运算,在椭圆曲线公钥密码的数字签名生成过程、数字签名验证过程、加密过程或密钥交换协商过程中使用运算获取的kg,抵御侧信道攻击。实施例三,本实施例还提供了一种电子设备,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,所述计算机指令被处理器运行时,完成实施例一所述方法的步骤。实施例四,本实施例还提供了一种计算机可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成实施例一所述方法的步骤。以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1