基于SM2的两方签名方法及系统与流程

文档序号:17070366发布日期:2019-03-08 23:16阅读:414来源:国知局
基于SM2的两方签名方法及系统与流程

本发明涉及信息安全技术领域,具体涉及一种基于sm2的两方签名方法及系统。



背景技术:

一般情况下,运行密码算法时需要调用完整的密钥信息,所以需要密钥直接存储在内存中。而在防护能力较弱的终端上,这会增加密钥丢失的风险。例如手机丢失、算法运算过程被窃听等都会导致密钥的丢失,如何能安全地保护弱终端的密钥是密码算法实现中面临的非常重要的问题。

现有的解决方案是采用两方签名的方法,但是普遍存在的问题是整个交互签名运算中,运算量大且通信的数据量也大,降低了签名生成的效率。



技术实现要素:

有鉴于此,本公开提供一种基于sm2的两方签名方法及系统,能够解决或者至少部分解决上述存在的问题。

为解决以上技术问题,本发明提供的技术方案是一种基于sm2的两方签名方法,第一通信方和第二通信方共享一套椭圆曲线参数,g为该椭圆曲线的基点,基点的阶数为n,所述方法包括:

第一通信方生成待签名消息m的消息摘要e,并根据g和自身的子私钥d1生成第一参数g1,将e和g1发送给第二通信方;

所述第二通信方根据e、g1、g和自身的子私钥d2生成第一部分签名r,若r不等于0,则根据r和d2生成第二参数s1,将r和s1发送给所述第一通信方;

所述第一通信方根据s1和d1生成第二部分签名s,若s不等于0且s不等于r,则输出完整签名(s,r)和消息m。

可选的,在所述第一通信方生成待签名消息m的消息摘要e,并根据g和自身的子私钥d1生成第一参数g1,将e和g1发送给第二通信方的步骤前,还包括:第一通信方生成自身的子私钥d1,第二通信方生成自身的子私钥d2;

其中,所述第一通信方生成自身的子私钥d1,所述第二通信方生成自身的子私钥d2的方法,包括:

所述第一通信方产生一个随机数d1’,d1’∈[1,n-1],计算hash(d1’),并将hash(d1’)的计算结果转换为d1”,d1”∈[1,n-1],计算子私钥d1=(d1’+d1”)modn;

所述第二通信方产生一个随机数d2’,d2’∈[1,n-1],计算hash(d2’),并将hash(d2’)的计算结果转换为d2”,d2”∈[1,n-1],计算子私钥d2=(d2’+d2”)modn;

其中,hash()表示预定的密码杂凑函数,mod表示求模运算。

可选的,所述方法还包括:

所述第一通信方根据d1计算第三参数q1=[d1-1]g,将q1发送给所述第二通信方;

所述第二通信方根据d2和q1计算p=[d2-1]q1-g,将p作为公钥公开;

其中,[*]g表示椭圆曲线上的倍点运算。

可选的,所述第一通信方生成待签名消息m的消息摘要e,并根据g和自身的子私钥d1生成第一参数g1,将e和g1发送给第二通信方的方法,包括:

所述第一通信方计算待签名的消息m的摘要e=hash(z||m),其中,z表示第一通信方和第二通信方共同的身份标识,hash()表示预定的密码杂凑函数,||表示级联;

所述第一通信方产生一个随机数k1,k1∈[1,n-1],计算第一参数g1=[d1-1k1]g;

所述第一通信方将e和g1发送给第二通信方。

可选的,所述第二通信方根据e、g1、g和自身的子私钥d2生成第一部分签名r,若r不等于0,则根据r和d2生成第二参数s1,将r和s1发送给第一通信方的方法,包括:

所述第二通信方产生一个随机数k2,k2∈[1,n-1],计算(x1,y1)=[d2-1k2]g+[d2-1]g1,再计算第一部分签名r=(x1+e)modn;

所述第二通信方若判断r不等于0,则计算第二参数s1=d2r+k2;

所述第二通信方将r和s1发送给所述第一通信方。

可选的,所述第一通信方根据s1和d1生成第二部分签名s,若s不等于0且s不等于r,则输出完整签名(s,r)和消息m的方法,包括:

所述第一通信方计算第二部分签名s=d1s1+k1-r;

所述第一通信方若判断s不等于0且s不等于r,则输出完整签名(s,r)和消息m。

本发明还提供一种基于sm2的两方签名系统,包括第一通信装置和第二通信装置;所述第一通信装置,包括

第一计算输出模块,用于生成待签名消息m的消息摘要e,并根据g和自身的子私钥d1生成第一参数g1,将e和g1发送给第二通信装置;

第三计算输出模块,用于根据s1和d1生成第二部分签名s,若s不等于0且s不等于r,则输出完整签名(s,r)和消息m;

第一共享模块,用于与第二通信装置共享一套椭圆曲线参数,g为该椭圆曲线的基点,基点的阶数为n;

所述第二通信装置,包括

第二计算输出模块,用于根据e、g1、g和自身的子私钥d2生成第一部分签名r,若r不等于0,则根据r和d2生成第二参数s1,将r和s1发送给所述第一通信装置;

第二共享模块,用于与第一通信装置共享一套椭圆曲线参数,g为该椭圆曲线的基点,基点的阶数为n。

可选的,所述第一通信装置还包括第一子私钥生成模块,用于生成自身的子私钥d1;所述第一子私钥生成模块用于产生一个随机数d1’,d1’∈[1,n-1],计算hash(d1’),并将hash(d1’)的计算结果转换为d1”,d1”∈[1,n-1],计算子私钥d1=(d1’+d1”)modn;

所述第二通信装置还包括第二子私钥生成模块,用于生成自身的子私钥d2;所述第二子私钥生成模块用于产生一个随机数d2’,d2’∈[1,n-1],计算hash(d2’),并将hash(d2’)的计算结果转换为d2”,d2”∈[1,n-1],计算子私钥d2=(d2’+d2”)modn;

所述第一通信装置包括第一共享模块,第二通信装置包括第二共享模块,用于共享一套椭圆曲线参数,g为该椭圆曲线的基点,基点的阶数为n;

其中,hash()表示预定的密码杂凑函数,mod表示求模运算。

可选的,所述第一子私钥生成模块还用于根据d1计算第三参数q1=[d1-1]g,将q1发送给第二通信装置;所述第二子私钥生成模块还用于根据d2和q1计算

p=[d2-1]q1-g,将p作为公钥公开;其中,[*]g表示椭圆曲线上的倍点运算。

可选的,所述第一计算输出模块还用于:

计算待签名的消息m的摘要e=hash(z||m),其中,z表示第一通信装置和第二通信装置共同的身份标识,hash()表示预定的密码杂凑函数,||表示级联;

产生一个随机数k1,k1∈[1,n-1],计算第一参数g1=[d1-1k1]g;

将e和g1发送给所述第二通信装置。

可选的,所述第二计算输出模块还用于:

产生一个随机数k2,k2∈[1,n-1],计算(x1,y1)=[d2-1k2]g+[d2-1]g1,再计算第一部分签名r=(x1+e)modn;

若判断r不等于0,则计算第二参数s1=d2r+k2;

将r和s1发送给所述第一通信装置。

可选的,所述第三计算输出模块还用于:

计算第二部分签名s=d1s1+k1-r;

若判断s不等于0且s不等于r,则输出完整签名(s,r)和消息m。

本公开与现有技术相比,其有益效果详细说明如下:采用本发明的技术方案,可在通信两方分别存储部分私钥,两方联合才能对消息进行签名或者解密等操作,通信两方均无法获取到对方私钥的任何信息,因此攻击者在入侵其中任一方的情况下,都不能伪造签名或解密密文,并且在签名交互中,通信两方都仅需要传递给对方两个数据,数据通信量和数据运算量较低,签名效率较高。

附图说明

为了更清楚地说明本发明实施例,下面将对实施例中所需要使用的附图做简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明基于sm2的两方签名方法实施例的流程示意图;

图2为本发明第一通信方和第二通信方生成各自的子私钥和公钥的过程示意图;

图3为本发明第一通信方和第二通信方生成待签名消息m的完整签名的过程示意图;

图4为本发明基于sm2的两方签名系统实施例的结构示意图;

图5为本发明基于sm2的两方签名系统另一实施例的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下,所获得的所有其他实施例,都属于本发明保护范围。

为了使本领域的技术人员更好地理解本发明的技术方案,下面结合附图和具体实施例对本发明作进一步的详细说明。

如图1所示,本发明实施例提供了一种基于sm2的两方签名方法,第一通信方和第二通信方共享一套椭圆曲线参数,g为该椭圆曲线的基点,基点的阶数为n,该方法包括:

11:第一通信方生成待签名消息m的消息摘要e,并根据g和自身的子私钥d1生成第一参数g1,将e和g1发送给第二通信方;

12:第二通信方根据e、g1、g和自身的子私钥d2生成第一部分签名r,若r不等于0,则根据r和d2生成第二参数s1,将r和s1发送给第一通信方;

13:第一通信方根据s1和d1生成第二部分签名s,若s不等于0且s不等于r,则输出完整签名(s,r)和消息m。

这里,采用上述实施例的技术方案,可在通信两方分别存储部分私钥,两方联合才能对消息进行签名或者解密等操作,通信两方均无法获取到对方私钥的任何信息,因此攻击者在入侵其中任一方的情况下,都不能伪造签名或解密密文,并且在签名交互中,通信两方都仅需要传递给对方两个数据,数据通信量和数据运算量较低,签名效率较高。

如图2所示,需要说明的是,在步骤11前还可以包括步骤:第一通信方生成自身的子私钥d1,第二通信方生成自身的子私钥d2;

其中,第一通信方生成自身的子私钥d1,第二通信方生成自身的子私钥d2的方法,包括:

21:第一通信方产生一个随机数d1’,d1’∈[1,n-1],计算hash(d1’),并将hash(d1’)的计算结果转换为d1”,d1”∈[1,n-1],计算子私钥d1=(d1’+d1”)modn。

22:第二通信方产生一个随机数d2’,d2’∈[1,n-1],计算hash(d2’),并将hash(d2’)的计算结果转换为d2”,d2”∈[1,n-1],计算子私钥d2=(d2’+d2”)modn;

其中,hash()表示预定的密码杂凑函数,mod表示求模运算。

这里,hash的输出值是固定长度的比特串,因此需要将输出值转变为小于n的整数才能进行下一步计算。转换的方法很多,这里可以采用简单的用模运算,即将hash(d1’)的计算结果通过modn运算转换为d1”,将hash(d2’)的计算结果通过modn运算转换为d2”。n是椭圆曲线基点g的阶数,是一个固定的大素数,具体取值由所选择的椭圆曲线决定。

需要说明的是,步骤第一通信方生成自身的子私钥d1,第二通信方生成自身的子私钥d2的方法,还可以包括:

23:第一通信方根据d1计算第三参数q1=[d1-1]g,将q1发送给第二通信方;

24:第二通信方根据d2和q1计算p=[d2-1]q1-g;

25:第二通信方将p作为公钥公开;

其中,[*]g表示椭圆曲线上的倍点运算。

这里,步骤23-25是协商生成私钥的方法,该过程明确具体地给出了子私钥d1、d2和私钥的关系,在后面的签名过程的设计方法时需要用到该关系。公钥p是在验证签名时利用,本公开采用的是标准算法sm2签名的验签方法。

如图3所示,需要说明的是,步骤11中第一通信方生成待签名消息m的消息摘要e,并根据g和自身的子私钥d1生成第一参数g1,将e和g1发送给第二通信方的方法,包括:

31:第一通信方计算待签名的消息m的摘要e=hash(z||m),其中,z表示第一通信方和第二通信方共同的身份标识,hash()表示预定的密码杂凑函数,||表示级联;

32:第一通信方产生一个随机数k1,k1∈[1,n-1],计算第一参数g1=[d1-1k1]g,其中,[*]g表示椭圆曲线上的倍点运算;

33:第一通信方将e和g1发送给第二通信方。

需要说明的是,步骤12中第二通信方根据e、g1、g和自身的子私钥d2生成第一部分签名r,若r不等于0,则根据r和d2生成第二参数s1,将r和s1发送给第一通信方的方法,包括:

34:第二通信方产生一个随机数k2,k2∈[1,n-1],计算(x1,y1)=[d2-1k2]g+[d2-1]g1;

35:第二通信方计算第一部分签名r=(x1+e)modn,若判断r不等于0,则计算第二参数s1=d2r+k2:,其中,mod表示求模运算,[*]g表示椭圆曲线上的倍点运算;

36:第二通信方将r和s1发送给第一通信方。

需要说明的是,步骤13中第一通信方根据s1和d1生成第二部分签名s,若s不等于0且s不等于r,则输出完整签名(s,r)和消息m的方法,包括:

37:第一通信方计算第二部分签名s=d1s1+k1-r;若判断s不等于0且s不等于r,则输出完整签名(s,r)和消息m。

这里,计算(x1,y1)=[d2-1k2]g+[d2-1]g1的目的是将随机数k1,k2和子私钥d1,d2的信息揉合到一起,用于计算签名,在计算第一部分签名r时只需要x1信息就可以。本公开采用的验签的过程与标准算法sm2的验签过程一致。

这里,本公开采用的子私钥d1,d2是由随机数和随机数相关的其哈希值组成所得,获取方法简单高效;在生成签名的整个交互运算过程中,第二通信方仅需要生成一个随机数,整个签名过程仅需要生成两个随机数,降低了生成最终签名所需要的运算量;在签名交互时,第二通信方仅需要返回两个数据给第一通信方,降低了数据通信量和数据计算量,提高了签名生成的效率。具体的,在本实施例的技术方案中,第一通信方仅采用了1次椭圆曲线倍点运算,2次有限域乘法运算,2次有限域加法运算和1次生成随机数运算;第二通信方仅采用2次椭圆曲线倍点运算,1次椭圆曲线点加运算,2次有限域乘法运算,2次有限域加法运算和1次生成随机数运算,与现有技术相比,明显的降低了交互两方的数据通信量和数据计算量,提高了签名生成的效率。

如图4所示,本发明实施例还提供一种基于sm2的两方签名系统,包括第一通信装置41和第二通信装置42;第一通信装置41,包括:

第一计算输出模块411,用于生成待签名消息m的消息摘要e,并根据g和自身的子私钥d1生成第一参数g1,将e和g1发送给第二通信装置42;

第三计算输出模块412,用于根据s1和d1生成第二部分签名s,若s不等于0且s不等于r,则输出完整签名(s,r)和消息m;

第一共享模块413,用于与第二通信装置共享一套椭圆曲线参数,g为该椭圆曲线的基点,基点的阶数为n。

第二通信装置42,包括:

第二计算输出模块421,用于根据e、g1、g和自身的子私钥d2生成第一部分签名r,若r不等于0,则根据r和d2生成第二参数s1,将r和s1发送给第一通信装置41;

第二共享模块422,用于与第一通信装置共享一套椭圆曲线参数,g为该椭圆曲线的基点,基点的阶数为n。

如图5所示,需要说明的是,第一通信装置41还包括第一子私钥生成模块410,用于生成自身的子私钥d1;第一子私钥生成模块410用于产生一个随机数d1’,d1’∈[1,n-1],计算hash(d1’),并将hash(d1’)的计算结果转换为d1”,d1”∈[1,n-1],计算子私钥d1=(d1’+d1”)modn;

更具体的,第二通信装置42还包括第二子私钥生成模块420,用于生成自身的子私钥d2,第二子私钥生成模块420用于产生一个随机数d2’,d2’∈[1,n-1],计算hash(d2’),并将hash(d2’)的计算结果转换为d2”,d2”∈[1,n-1],计算子私钥d2=(d2’+d2”)modn;其中hash()表示预定的密码杂凑函数,mod表示求模运算。

更具体的,第一子私钥生成模块410还用于根据d1计算第三参数q1=[d1-1]g,将q1发送给第二通信装置;第二子私钥生成模块420还用于根据d2和q1计算p=[d2-1]q1-g,将p作为公钥公开;其中,[*]g表示椭圆曲线上的倍点运算。

更具体的,第一计算输出模块411还用于:计算待签名的消息m的摘要e=hash(z||m),其中,z表示第一通信装置41和第二通信装置42共同的身份标识,hash()表示预定的密码杂凑函数,||表示级联;产生一个随机数k1,k1∈[1,n-1],计算第一参数g1=[d1-1k1]g,其中,[*]g表示椭圆曲线上的倍点运算;将e和g1发送给第二通信装置42。

更具体的,第二计算输出模块421还用于:产生一个随机数k2,k2∈[1,n-1],计算(x1,y1)=[d2-1k2]g+[d2-1]g1,再计算第一部分签名r=(x1+e)modn,其中,mod表示求模运算,[*]g表示椭圆曲线上的倍点运算;若判断r不等于0,则计算第二参数s1=d2r+k2;将r和s1发送给第一通信装置41。

更具体的,第三计算输出模块412还用于:计算第二部分签名s=d1s1+k1-r;若判断s不等于0且s不等于r,则输出完整签名(s,r)和消息m。

图4和图5所对应实施例中的系统,其中各个装置、模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。

以上结合附图详细描述了本公开的优选实施方式,但是,本公开并不限于上述实施方式中的具体细节,在本公开的技术构思范围内,可以对本公开的技术方案进行多种简单变型,这些简单变型均属于本公开的保护范围。

另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合,为了避免不必要的重复,本公开对各种可能的组合方式不再另行说明。

此外,本公开的各种不同的实施方式之间也可以进行任意组合,只要其不违背本公开的思想,其同样应当视为本申请所公开的内容。

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