本发明涉及信息安全技术领域,特别是涉及一种基于余数系统的SM2白盒数字签名实现方法。
背景技术:
现有软件加密算法,密钥均是直接出现在计算平台的内存之中,攻击者可通过恶意软件等实现密钥的窃取,不能应对已有的白盒攻击手段;现有的硬件加密算法,能较好的保证密钥计算的安全性,但相对使用成本较高,通用性较差,对于部分安全性要求相对较低的应用场景无法使用;同时还有部分研究机构提出了基于云加端部分密钥和密钥分散存储策略的软件加密算法,但云加端的策略无法抵抗本地私钥的泄露,还存储云端与终端的鉴权问题,密钥分散存储策略在进行密钥运算时必须合成密钥,内存中同样存在密钥完整明文。
技术实现要素:
为解决上述问题,本发明提供了一种基于余数系统的SM2白盒数字签名实现方法,所述方法适用的系统包括客户端和服务器,所述系统的系统模数为n,辅助模数为mr所选取椭圆曲线的基点为G,签名消息为M其特征在于,包括如下步骤:
步骤一:客户端选取公钥d、私钥P。选定一个余数系统,素数基为β=(p1,p2,...,pt),基β的动态范围满足ω=p1p2p3…pt≥2768。
步骤二:客户端生成第一私钥查找表、第二私钥查找表。具体方法为:
步骤2.1:随机选取两个非线性密钥置换表,分别记为Sbox1、Sbox2,并通过服务器的公钥将自己的客户端ID和Sbox1发送给服务器进行保存。
步骤2.2:使用余数系统将公钥P转化为Pi,其中i=1,…,t,r,并生成第一私钥查找表Table1,i(i=1,...,t,r),生成方法为:随机遍历产生两个随机数N1和N2,其中N2,N1∈[1,n-1],通过余数系统将其分别转化为N1i和N2i,计算ui=sbox2(N1,i×sbox1-1(sbox1(N2,i))modpi),将遍历产生的所有ui作为表Table1,i(i=1,...,t,r)的元素。
步骤2.3:使用私钥d和余数系统生成第二私钥查找表Table2,i(i=1,...,t,r),生成方法为:随机遍历产生两个随机数L1和L2,其中L2,L1∈[1,n-1],通过余数系统将其分别转化为L1i和L2i,同时将私钥d转换为di,计算si=di×(sbox2-1(L1i)-L2i×di)mod pi,将遍历产生的所有si作为表Table2,i(i=1,...,t,r)的元素;
步骤三:客户端进行签名,具体方法为:
步骤3.1:客户端计算M’=M||ZA;其中,M为签名消息,ZA为客户端的身份标识。
步骤3.2:客户端用杂凑函数计算消息摘要e=Hv(M’)。
步骤3.3:客户端产生第一随机数k1∈[1,n-1];
步骤3.4:客户端计算椭圆曲线点Q1=[k1]*G,并将e和Q1发送给服务器;其中,
步骤3.5:服务器产生第二随机数k2∈[1,n-1];
步骤3.6:服务器计算椭圆曲线点(x1,y1)=[k2]*Q1;
步骤3.7:服务器计算第一部分签名r=(x1+e)mod n,将第二随机数k2基于基{β|pr}用余数系统表示为k2=(k2,1,...,k2,t|k2,r),通过Sbox1进行混淆,然后将r和Sbox1(k2)=[sbox1(k2,1),sbox1(k2,2),...,sbox1(k2,t)|sbox1(k2,r)]发送给客户端。
步骤3.8:客户端将第一随机数K1和r基于基{β|pr}用余数系统表示为k1=(k1,1,k1,2,...,k1,t|k1,r)和r=(r1,r2,...,rt|rr);
步骤3.9:客户端使用第一私钥查找表Table1,i(i=1,...,t,r)计算中间值ui=sbox2(k1,i×sbox1-1(sbox1(k2,i))modpi)。
步骤4.0:客户端使用第二私钥查找表Table2,i(i=1,...,t,r)计算si=di×(sbox2-1(ui)-ri×dA,i)mod pi,其中私钥dA隐藏在第二私钥查找表Table2,i中。
步骤4.1:客户端利用中国剩余定理恢复出s。
步骤4.3:客户端计算s′=s mod n,s′即为第二部分签名值。
步骤五:输出消息M和签名。
进一步的,各个随机数是利用随机数发生器产生。
本发明的有益效果为:
(1)客户端在进行签名运算过程中,内存等硬件设备中不会出现私钥的完整明文,确保密码算法运行的白盒攻击安全。
(2)实现本方法仅需要207.5MB的内层大小,存储空间要求较小。
(3)本实现方法和原SM2算法的签名效率基本一致,实用性较高。
(4)通过使用白盒软件实现可降低商用密码算法的使用成本,扩大商用密码算法的使用范围。
(5)使用白盒软件算法在确保加解密安全的同时,通用性较强,对运行平台硬件没有任何特殊需求。
附图说明
图1为客户端进行签名的流程示意图。
具体实施方式
本发明的设计构思为:针对于不可信环境中密钥运行不安全,恶意攻击者可通过白盒攻击手段获取系统密钥的问题展开研究,通过使用余数系统实现大数的拆分,从而降低密钥表的大小;通过使用置乱混淆确保中间结果对攻击者不可见;通过使用云端的随机因子确保终端密钥运算关系的未知性,实现了终端签名运算过程中的签名私钥安全,同时可使用标准的SM2验签算法进行验证。
本发明基于国家商用密码算法SM2数字签名算法进行构建,SM2数字签名算法请参加国家商用密码管理局发布的管理标准,同时本发明还使用了一个典型的数学工具——余数系统,详细介绍如下:
余数系统的定义可以描述为:现假设存在一个余数系统,它是由一组互为质数的余数基β=(m1,m2,...,mk}来确定的,M=m1m2…mk为这组基的动态范围。对于任意整数x≤M,可以在β这组基下唯一表示为(x1,x2,...,xk),其中xi为x对mi的求模结果,记为对余数系统而言,只有当整数x在动态范围之内才存在唯一的表示。
假设整数x、y在基β下分别表示为x=(x1,x2,...,xk)和y=(y1,y2,...,yk),则:
其中“ο″为+、-、×运算。
对于x的余数系统表示(x1,x2,...,xk),由中国剩余定理:
其中α<k,Mi=M/mi,为Mi在模mi下的逆。α可通过选择一个合适的辅助模数mr来恢复,其中mr≥k+1且gcd(M,mr)=1。设xr为x对mr的求模结果,即:
则:
因为α<k<mr,所以对于任意整数x,可在扩展基下表示为(x1,x2,...,xk|xr),称为扩展RNS表示。
本发明所述方法适用的系统包括客户端和服务器。客户端也就是执行数字签名算法的用户,其运行环境是不可信的,服务器是协同签名方,其属于密钥管理中心的一个部件,它主要为客户端提供一个随机因子。
假定所述系统的系统模数为n,辅助模数为mr,所选取椭圆曲线的基点为G,签名消息为M,ZA为客户端的身份标识,Hv为使用的摘要函数(可实用商用密码标准SM3算法)。本方法共包含4个部分:(1)参数选取及密钥生成;(2)私钥表的生成;(3)签名计算;(4)验签计算。其中(1)和(4)均参考国家商用SM2数字签名算法标准执行。
本发明的具体步骤描述如下:
步骤一:客户端选取公钥d、私钥P。选定一个余数系统,素数基为β=(p1,p2,...,pt),基β的动态范围满足ω=p1p2p3…pt≥2768。
步骤二:客户端生成第一私钥查找表、第二私钥查找表。具体方法为:
步骤2.1:随机选取两个非线性密钥置换表(与对称密码算法中使用的S盒是一致的),分别记为Sbox1、Sbox2,并通过服务器的公钥将自己的客户端ID和Sbox1发送给服务器进行保存。
步骤2.2:使用余数系统将公钥P转化为Pi,其中i=1,…,t,r,并生成第一私钥查找表Table1,i(i=1,...,t,r),生成方法为:随机遍历产生两个随机数N1和N2,其中N2,N1∈[1,n-1],通过余数系统将其分别转化为N1i和N2i,计算ui=sbox2(N1,i×sbox1-1(sbox1(N2,i))modpi),将遍历产生的所有ui作为表Table1,i(i=1,...,t,r)的元素。
步骤2.3:使用私钥d和余数系统生成第二私钥查找表Table2,i(i=1,...,t,r),生成方法为:随机遍历产生两个随机数L1和L2,其中L2,L1∈[1,n-1],通过余数系统将其分别转化为L1i和L2i,同时将私钥d转换为di,计算si=di×(sbox2-1(L1i)-L2i×di)mod pi,将遍历产生的所有si作为表Table2,i(i=1,...,t,r)的元素;
步骤三:客户端进行签名,具体方法为:
步骤3.1:客户端计算M’=M||ZA;其中,M为签名消息,ZA为客户端的身份标识。
步骤3.2:客户端用杂凑函数计算消息摘要e=Hv(M’)。
步骤3.3:客户端用随机数发生器产生第一随机数k1∈[1,n-1];
步骤3.4:客户端计算椭圆曲线点Q1=[k1]*G,并将e和Q1发送给服务器;其中,
步骤3.5:服务器用随机数发生器产生第二随机数k2∈[1,n-1];
步骤3.6:服务器计算椭圆曲线点(x1,y1)=[k2]*Q1;
步骤3.7:服务器计算第一部分签名r=(x1+e)mod n,将第二随机数k2基于基{β|pr}用余数系统表示为k2=(k2,1,...,k2,t|k2,r),通过Sbox1进行混淆,然后将r和Sbox1(k2)=[sbox1(k2,1),sbox1(k2,2),...,sbox1(k2,t)|sbox1(k2,r)]发送给客户端。
步骤3.8:客户端将第一随机数k1和r基于基{β|pr}用余数系统表示为k1=(k1,1,k1,2,...,k1,t|k1,r)和r=(r1,r2,...,rt|rr);
步骤3.9:客户端使用第一私钥查找表Table1,i(i=1,...,t,r)计算中间值ui=sbox2(k1,i×sbox1-1(sbox1(k2,i))modpi)。
步骤4.0:客户端使用第二私钥查找表Table2,i(i=1,...,t,r)计算si=di×(sbox2-1(ui)-ri×dA,i)mod pi,其中私钥dA隐藏在第二私钥查找表Table2,i中。
步骤4.1:客户端利用中国剩余定理恢复出s。
步骤4.3:客户端计算s′=s mod n,s′即为第二部分签名值。
步骤五:输出消息M和签名。
进一步的,各个随机数是利用随机数发生器产生。