基于SM2算法的签名方法与流程

文档序号:12908087阅读:6536来源:国知局

本发明涉及一种基于sm2算法的签名方法。



背景技术:

数字签名是通过某种密码运算生成一系列符号及代码组成电子密码进行签名,来代替书写签名或印章,对于这种电子式的签名还可进行技术验证,其验证的准确度是一般手工签名和图章的验证而无法比拟的。数字签名是目前电子商务、电子政务中应用最普遍、技术最成熟的、可操作性最强的一种电子签名方法。

为了提高数字签名的安全性,签名算法逐渐向着交互少、减少传输参数数量方向发展,并逐渐提高算法的处理效率。

申请公布号为cn104243456a的中国发明专利公开了一种“适用于云计算的基于sm2算法的签名及解密方法和系统”,它可在通信双方分别存储部分私钥,两方联合才能对消息进行签名或解密等操作,通信双方均无法获取到对方私钥的任何信息,因此攻击者在入侵其中任何一方的情况下,都不能伪造签名或解密密文,从而提高了云计算环境中的私钥的安全性;而且,签名过程和解密过程中,通信双方仅需要进行的交互也简化了很多,从而能够满足云计算环境中低延迟、少交互的应用需求。但第一通信方和第二通信方均产生长度在[1,n-1]之间的子私钥,其乘积可能大于n,在实际运算中私钥会大于n-2,造成私钥过大导致签名溢出风险。而且,在签名运算过程中运算过程相对比较繁琐,需要额外条件进行处理,在输出签名过程中,也需要多次网络交互计算,降低了运算效率。



技术实现要素:

为了避免私钥过大导致签名溢出风险,并进一步简化算法,提升运算效率,本发明提供一种基于sm2算法的签名方法。

本发明提出以下技术方案:一种基于sm2算法的签名方法,它包括如下步骤:

步骤a:密钥生成,

客户端与服务端共享sm2椭圆曲线算法参数e(fq)、g、n、z,椭圆曲线e为定义在有限域fq上的椭圆曲线,g为椭圆曲线e上n阶的基点,z为双方的共有身份标识;

客户端生成自身的子密钥a,服务端生成自身的子密钥b,客户端和服务端交互生成公钥p;

步骤b:签名运算;

其特征在于,

所述步骤a中,客户端与服务端均采用限制次幂方式生成随机子密钥a和b,使子密钥a和b的乘积小于n-2;计算a、b逆元交互处理,形成常量v,计算输出公钥p;

所述步骤b的签名运算包括以下步骤:

步骤b1:客户端根据待签原文m生成e,同时随机生成dh交互k11,将e和k11传输至服务端;

步骤b2:服务端随机生成dh交互k22发送至客户端,客户端和服务端协商临时密钥k,进而由客户端生成部分签名q2;

步骤b3:客户端将q2传输至服务端,服务端同步计算r和s,最终输出签名值[r,s]。

进一步的,所述步骤a中,采用限制次幂方式生成随机子密钥a和b的方法为:客户端与服务端共享的sm2椭圆曲线算法参数还包括c和t,c=log2n,且c取整数;t=2q(c/2),其中q函数为取整数函数;

使随机生成的子密钥a介于[1,t]之间,子密钥b介于[1,t]之间;

计算a、b逆元交互处理,形成常量v,计算输出公钥p的方法为:客户端计算a的逆元a-1modn得到其值为v1;计算a[*]g得到其值为p1;将v1和p1发送至服务端;服务端计算b的逆元b-1modn得到其值为v2,计算(v1*v2)modn的结果记为v;计算公钥信息p=p1[*]b[-]g。

进一步的,所述步骤b1包括:客户端将z和m拼装成m’,计算hash(m’),获取其结果为e;

客户端随机生成随机数k1,使得k1介于[1,n]之间,计算2k1modn作为k11。

进一步的,所述步骤b2包括:

服务端随机生成随机数k2,使得k2介于[1,n]之间,计算2k2modn作为k22,服务端将k22发送至客户端;

此时客户端利用k22k1modn和服务端利用k11k2modn进行计算,均可得到相同的值为k;

在客户端,计算椭圆曲线上的点d(x,y)=k[*]g、计算(e+x)modn得到r,若r是为0或r+k等于n则需要重新协商生成k,计算q2=a*r,并将q2发送至服务端。

进一步的,所述步骤b3包括:

服务端接收到q2后,通过同样的计算公式,d(x,y)=k[*]g、计算(e+x)modn得到r,[v*(k-q2*b+r)]modn,即可得到签名值s;若s等于0则需要重新生成k进行签名运算;运算后将[r,s]作为最终签名值输出。

有益效果:

1、通过限制次幂的方式,使得各个子密钥乘积均不会大于n-2,保障子密钥合成后的最终密钥小于n-2,规避了私钥过大导致签名溢出风险。

2、云端通过预计算的方式,将合成签名值中的部分信息先行计算,方便后续合成代入,提升处理效率。实现并行运算。在签名过程中,通过交互完成k的计算后,双方即可同时进行并行运算计算r值,不用再进行r值的网络交互。

3、签名过程采用dh交互,用于双方生成临时参数k,在减少传输参数数量的情况下,仅传输大数乘积,不容易被破解还原子密钥。

4、定量存储,利用空间赢取时间。在最终s签名输出的过程中,直接采用了在生成密钥对时输出的v值,不再重复计算(v1*v2)modn,提升运算效率。

附图说明

图1为本发明的方法流程图。

具体实施方式

如图1所示,本方法的大致流程为:s1、客户端与服务端均采用限制次幂方式生成随机子密钥a和b,计算a、b逆元交互处理,形成常量v,计算输出公钥p。s2、客户端根据待签原文m生成e,同时随机生成dh交互k11,将e和k11传输至服务端。s3、服务端随机生成dh交互k22发送至客户端,客户端和服务端协商临时密钥k,进而由客户端生成部分签名q2。s4、客户端将q2传输至服务端,服务端同步计算r和s,最终输出签名值[r,s]。

下面对本方法的具体流程做详细说明:本方法主要包括密钥生成和签名运算两个过程。

1、密钥生成过程

客户端与服务端共享sm2椭圆曲线算法参数e(fq)、g、n、c、z、t,椭圆曲线e为定义在有限域fq上的椭圆曲线,g为椭圆曲线e上n阶的基点,c=log2n,且c取整数;t=2q(c/2),其中q函数为取整数函数,z为双方共同的身份标识。

客户端生成随机数a,使得a介于[1,t],作为客户端的子密钥。

服务端生成随机数b,使得b介于[1,t],作为服务端的子密钥。

客户端计算a的逆元a-1modn得到其值为v1;计算a[*]g,得到其值为p1。将v1和p1发送至服务端;服务端计算b的逆元b-1modn,得到其值为v2,计算(v1*v2)modn其结果记为v;计算公钥信息p=p1[*]b[-]g,其中[*]为椭圆曲线点乘计算,[-]为椭圆曲线点减计算。

上述即完成了密钥的生成和分发,客户端子密钥为a,服务端子密钥为b,且含有公钥p和关键字v。

2、签名运算的过程

客户端将z和m拼装成m’,计算hash(m’),获取其结果为e,hash表示为预定的哈希函数。

客户端随机生成随机数k1,使得k1介于[1,n]之间,计算2k1modn作为k11。

客户端将e和k11发送至服务端。

服务端随机生成随机数k2,使得k2介于[1,n]之间,计算2k2modn作为k22。

服务端将k22发送至客户端。

此时客户端利用k22k1modn和服务端利用k11k2modn进行计算,均可得到相同的值为k。

在客户端,计算椭圆曲线上的点d(x,y)=k[*]g、计算(e+x)modn得到r,若r是为0或r+k等于n则需要重新协商生成k,计算q2=a*r,并将q2发送至服务端。其中[*]表示曲线上的点乘(下同)。

服务端接收到q2后,通过同样的计算公式,d(x,y)=k[*]g、计算(e+x)modn得到r,[v*(k-q2*b+r)]modn,即可得到签名值s。若s等于0则需要重新生成k进行签名运算。运算后将[r,s]作为最终签名值输出。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1