一种基于SM2的多方协同签名方法及系统与流程

文档序号:20700707发布日期:2020-05-12 15:39阅读:331来源:国知局
一种基于SM2的多方协同签名方法及系统与流程

本发明涉及数字签名技术领域,尤其涉及一种基于sm2的多方协同签名方法及系统。



背景技术:

随着国家大力推广国产自主密码算法的战略,公钥密码标准算法sm2在金融、电力、交通等重要信息系统获得了广泛应用。随着移动互联网的普及,以及以区块链为基础的数字货币的应用,需要多方对某个文件进行联合签名(有时也称为多重签名,门限签名),比如企业中的多个领导或机构对于文件的电子签章,联盟链中多机构的联合签名,以及数字货币中的的钱包保护等。

现在多方签名的方式主要是以用户各自的私钥进行签名,这样签名值就会随着签名者数量的增加而增加,而已有的一些多重签名方案是通过其它方式另行设计,与现在的国家标准sm2完全不同,安全性没有保证且不符合对密码算法使用的要求。另外,用户各自私钥独立签名,在移动终端中存在使用存储密钥泄露的风险。



技术实现要素:

鉴于上述的分析,本发明旨在提供一种基于sm2的多方协同签名方法及系统,以解决现有多方签名技术难以保证用户各自私钥独立签名时密钥安全性及不符合国家标准的密码算法使用要求问题。

本发明的目的主要是通过以下技术方案实现的:

一方面,本发明提供了一种基于sm2的多方协同签名方法,包括以下步骤:得到多个通信端装置各自的子私钥作为用户的多方私钥,并利用用户的多方私钥生成用户公钥;利用所述用户公钥将待签名消息m生成消息摘要e,并基于sm2根据所述消息摘要e生成第一部分签名;利用多个通信端装置产生的随机数、各自的子私钥和所述第一部分签名生成第二部分签名,得到消息m的完整签名。

进一步地,所述通信端装置的数量为m;所述得到多个通信端装置各自的子私钥作为用户的多方私钥包括:

若用户私钥未确定,m个通信端装置分别随机产生位于[1,n-1]之间的随机数,所产生的m个随机数作为m个通信端装置各自的子私钥d1,d2,…,dm-1,dm;

若用户私钥已确定,m-1个通信端装置分别随机产生位于[1,n-1]之间的随机数,所产生的m-1个随机数作为m-1个通信端装置各自的子私钥d1,d2,…,dm-1,第m个通信端装置根据公式dm=d1-1d2-1...dm-1-1(d+1)modn计算得到子私钥dm;其中,d为用户私钥,d∈[1,n-2],n为g的阶,g为sm2的椭圆曲线基点,mod为求模运算。

进一步地,所述利用用户的多方私钥生成用户公钥包括:第1个通信端装置根据公式p1=[d1]g计算得到椭圆曲线点p1,并将p1发送给第2个通信端装置;对于第2个通信端装置至第m-1个通信端装置,依次执行pi=[di]pi-1,i=2……m,并将pi发送给第i+1个通信端装置,直至第m个通信端装置接收到pm-1,并根据公式p=[dm]pm-1-g计算得到用户公钥p;其中,g为sm2的椭圆曲线基点。

进一步地,第m个通信端装置基于sm2根据所述消息摘要e生成第一部分签名r,并将第一部分签名r发送给第1个通信端装置;

第m个通信端装置至第2个通信端装置依次根据自身产生的随机数、接收的ti和子私钥dm分别计算ti-1直至得到t1发送给第1个通信端;其中,ti-1为第i个通信端装置计算得到后传送给第i-1个通信端装置的参数,i=m,m-1,…,2,tm=r;

第1个通信端装置根据自身产生的随机数、接收的t1和第一部分签名r生成第二部分签名s,得到消息m的完整签名(r,s)。

进一步地,利用所述用户公钥将待签名消息m生成消息摘要e包括:

第m个通信端装置将杂凑z和待签名消息m拼接后输入密码杂凑函数后得到消息摘要e,公式如下:

e=h256(z||m);

其中,h256()为消息摘要长度256比特的密码杂凑函数,z为用户的身份标识、部分椭圆曲线参数和用户公钥的杂凑。

进一步地,所述基于sm2根据所述消息摘要e生成第一部分签名包括:

第m个通信端装置根据公式(x,y)=[dm]rm-1+[km]g计算得到椭圆曲线点(x,y),若(x,y)≠o则根据公式r=(e+x)modn计算得到r;若r不等于0则作为第一部分签名r;

其中,dm为第m个通信端装置的子私钥,km为第m个通信端装置产生的随机数,km∈[1,n-1],rm-1为第m-1个通信端装置计算得到的椭圆曲线点,g为sm2的椭圆曲线基点,n为g的阶,mod为求模运算。

进一步地,所述第m-1个通信端装置计算得到椭圆曲线点rm-1的过程如下:

第1个通信端装置根据公式r1=[k1]g计算得到满足椭圆曲线方程的椭圆曲线点r1,并将r1发送给第2个通信端装置;对于第2个通信端装置到第m-1个通信端装置,依次执行ri=[di]ri-1+[ki]g,将满足椭圆曲线方程的椭圆曲线点ri发送给第i+1个通信端装置,直至计算得到满足椭圆曲线方程的椭圆曲线点rm-1发送给第m个通信端装置;其中,di为第i个通信端装置的子私钥,ki为第i个通信端装置产生的随机数,ki∈[1,n-1],i=2,3,…,m-1,g为sm2的椭圆曲线基点。

进一步地,所述利用多个通信端装置产生的随机数、各自的子私钥和所述第一部分签名生成第二部分签名包括:

第m个通信端装置至第2个通信端装置依次根据自身产生的随机数、接收的ti和子私钥dm通过如下公式计算得到不等于0的ti-1直至得到t1:

ti-1=dm-1(ki+ti)modn;

其中,dm为第m个通信端的子私钥,ki为第i个通信端装置产生的随机数,ki∈[1,n-1],i=m,m-1,…,2,n为g的阶,mod为求模运算;

若t1不等于0且r不等于0,则第1个通信端根据自身产生的随机数、接收的t1和第一部分签名r通过如下公式生成s:

s=(d1-1(k1+t1)-r)modn;

其中,d1为第1个通信端的子私钥,k1为第1个通信端产生的随机数,k1∈[1,n-1],n为g的阶,mod为求模运算;若s不等于0,则得到完整签名(r,s)并输出。

进一步地,m个通信端装置共享sm2的椭圆曲线参数e(fp)、(p,a,b,g,n,h),其中,椭圆曲线e为定义在包含p个元素的素域fp上的椭圆曲线,e(fp)为fp上椭圆曲线e的包括无穷远点o的所有有理点组成的集合,a和b为fp中的元素,g为椭圆曲线e上n阶的基点,h为余因子。

另一方面,本发明提供了一种基于sm2的多方协同签名系统,其特征在于,包括多个通信端装置,用于生成并存储各自的子私钥;其中,所述通信端装置的数量为m;

所述各自的子私钥为用户的多方私钥,用于生成用户公钥;

第m个通信端装置,用于基于sm2根据待签名消息m的消息摘要e生成第一部分签名r;

第m个通信端装置到第2个通信端装置,依次用于根据自身产生的随机数、接收的ti和子私钥dm分别计算ti-1直至得到t1;其中,ti-1为第i-1个通信端装置接收到的第i个通信端装置计算输出参数,i=m,m-1,…,2,tm=r;

第1个通信端装置,用于接收第一部分签名r和t1,并根据自身产生的随机数、接收的t1和第一部分签名r生成第二部分签名s,得到消息m的完整签名。

本技术方案有益效果如下:本发明实施例采用将用户私钥分割存放的多方协同签名方案,即将私钥分割存放于多个通信端装置,在进行sm2签名运算时,多个通信端装置利用各自存放的子私钥进行签名运算,最后由一个通信端装置来合成签名,在整个运算过程中不会泄露私钥的任何信息,各个通信端装置也不会获取到其它端存放的任何子私钥,从而有效避免了因单个设备的密钥管理不善而导致私钥泄露。

本发明的其他特征和优点将在随后的说明书中阐述,并且,部分的从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。

附图说明

附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。

图1为本发明实施例的基于sm2的多方协同签名方法的流程图。

图2为本发明实施例的通信端装置计算得到椭圆曲线点的流程图。

图3为本发明实施例的通信端装置生成第二部分签名的流程图。

具体实施方式

下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理,并非用于限定本发明的范围。

缩略语和关键术语:

fp:包含p个元素的素域。

e(fp):fp上椭圆曲线e的所有有理点(包括无穷远点o)组成的集合。

(p,a,b,g,n,h):sm2算法的曲线参数,其中,p为一个256比特长度的素数;a和b为fp中的元素,用于定义fp上的一条椭圆曲线e;g为基点,用坐标表示g=(xg,yg);n为g的阶;h为余因子。

hv():消息摘要长度为v比特的密码杂凑函数,该杂凑函数使用sm3。

ida:用户a的身份标识。

entla:ida的长度,entla的长度为2个字节;

modn:模n运算。

o:椭圆曲线上的一个特殊点,称为无穷远点或零点,是椭圆曲线加法群的单位元。

pa:用户a的公钥,用坐标表示pa=(xa,ya)。

x||y:x与y的拼接,其中x、y是比特串或字节串。

z:关于用户的身份标识、部分椭圆曲线系统参数和用户公钥的杂凑值,具体为z=h256(entla||ida||a||b||xg||yg||xa||ya)。

[k]p:椭圆曲线上点p的k倍点,即,k是正整数。

本发明的技术基础:假设用户身份为u,其用户公钥为p,其用户私钥为d,用户私钥分割存放于m(m≥2)个通信端装置,分别称为端1、端2、…、端m,每个通信端装置对应的私钥分割分别为d1,d2,...,dm-1,dm,这里d∈[1,n-2],di∈[1,n-1],i=1,2,3,…,m-1,m。

本发明的一个具体实施例,如图1所示,公开了一种基于sm2的多方协同签名方法,包括以下步骤:

s1,得到多个通信端装置各自的子私钥作为用户的多方私钥,并利用用户的多方私钥生成用户公钥;

s2,利用所述用户公钥将待签名消息m生成消息摘要e,并基于sm2根据所述消息摘要e生成第一部分签名;

s3,利用多个通信端装置产生的随机数、各自的子私钥和所述第一部分签名生成第二部分签名,得到消息m的完整签名。

由上述步骤可见,本发明技术方案的多方协同签名包含用户公私钥对生成和签名计算两个过程。与现有技术相比,本发明实施例采用多方联合协同签名的方案,将用户私钥分割存储于多个通信端装置,可以用于数字货币的钱包保护,也可以用于企事业单位多个领导和部门的联合签名,同时可以用于移动端等设备私钥的保护。在进行sm2签名运算时,多个通信端装置利用各自存放的子私钥进行签名运算,最后由一个通信端装置来合成签名。本技术方案的有益效果是在整个运算过程不会泄露私钥的任何信息,各个通信端装置也不会获取到其它端存放的任何私钥信息,从而有效避免了因单个设备端的密钥管理不善而导致私钥泄露。

本发明的一个具体实施例,所述通信端装置的数量为m;所述得到多个通信端装置各自的子私钥作为用户的多方私钥包括:

若用户私钥未确定,m个通信端装置分别随机产生位于[1,n-1]之间的随机数,所产生的m个随机数作为m个通信端装置各自的子私钥d1,d2,…,dm-1,dm;

需要说明的是,装置1到装置m分别随机生成d1,d2,…,dm-1,dm,这时对应的用户私钥d=(d1d2...dm-1)modn。

若用户私钥已确定,m-1个通信端装置分别随机产生位于[1,n-1]之间的随机数,所产生的m-1个随机数作为m-1个通信端装置各自的子私钥d1,d2,…,dm-1,第m个通信端装置根据公式dm=d1-1d2-1...dm-1-1(d+1)modn计算得到子私钥dm;其中,d为用户私钥,d∈[1,n-2],n为g的阶,g为sm2的椭圆曲线基点,mod为求模运算。

本发明的一个具体实施例,所述利用用户的多方私钥生成用户公钥包括:第1个通信端装置根据公式p1=[d1]g计算得到椭圆曲线点p1,并将p1发送给第2个通信端装置;对于第2个通信端装置至第m-1个通信端装置,依次执行pi=[di]pi-1,i=2……m,并将pi发送给第i+1个通信端装置,直至第m个通信端装置接收到pm-1,并根据公式p=[dm]pm-1-g计算得到用户公钥;其中,g为sm2的椭圆曲线基点。

优选地,用户公钥生成方法为:

1:端1计算p1=[d1]g,并将p1发送给端2;

2:对于端i=2,3,…,m-1,执行:

2.1:计算pi=[di]pi-1;

2.2:将pi发送给端i+1;

3:端m计算用户公钥p=[dm]pm-1-g。

本发明的一个具体实施例,第m个通信端装置基于sm2根据所述消息摘要e生成第一部分签名r,并将第一部分签名r发送给第1个通信端装置;

第m个通信端装置至第2个通信端装置依次根据自身产生的随机数、接收的ti和子私钥dm分别计算ti-1直至得到t1发送给第1个通信端;其中,ti-1为第i个通信端装置计算得到后传送给第i-1个通信端装置的参数,i=m,m-1,…,2,tm=r;

第1个通信端装置根据自身产生的随机数、接收的t1和第一部分签名r生成第二部分签名s,得到消息m的完整签名(r,s)。

本发明的一个具体实施例,利用所述用户公钥将待签名消息m生成消息摘要e包括:

第m个通信端装置将杂凑z和待签名消息m拼接后输入密码杂凑函数后得到消息摘要e,公式如下:

e=h256(z||m);

其中,h256()为消息摘要长度256比特的密码杂凑函数,z为用户的身份标识、部分椭圆曲线参数和用户公钥的杂凑。

需要说明的是,消息摘要e的计算可在m个通信端装置中任意一个,若非第m个通信端计算时,只需要将e传送第m个通信端装置即可。

本发明的一个具体实施例,所述基于sm2根据所述消息摘要e生成第一部分签名包括:

第m个通信端装置根据公式(x,y)=[dm]rm-1+[km]g计算得到椭圆曲线点(x,y),若(x,y)≠o则根据公式r=(e+x)modn计算得到r;若r不等于0则作为第一部分签名r;

其中,dm为第m个通信端装置的子私钥,km为第m个通信端装置产生的随机数,km∈[1,n-1],rm-1为第m-1个通信端装置计算得到的椭圆曲线点,g为sm2的椭圆曲线基点,n为g的阶,mod为求模运算。

具体地,私钥分割存放于m(m≥2)个通信端装置,每个通信端装置对应的子私钥分别为d1,d2,…,dm-1,dm。m方联合对消息m进行签名,联合签名的过程分为第一部分签名的计算过程和第二部分签名的计算过程,其中第一部分签名r的计算过程如下:

1:端1产生随机数k1∈[1,n-1],计算r1=[k1]g;并将r1发送给端2;

2:对于端i=2,3,…,m-1,执行

2.1:产生随机数ki∈[1,n-1],计算ri=[di]ri-1+[ki]g;

2.2:将ri发送给端i+1;

3:端m按照sm2的描述计算e=h256(z||m),并将e转换为整数;随机产生km∈[1,n-1],计算(x,y)=[dm]r2+[km]g,计算r=(e+x)modn。

本发明的一个具体实施例,所述第m-1个通信端装置计算得到椭圆曲线点rm-1的过程如下:

s21,第1个通信端装置根据公式r1=[k1]g计算得到满足椭圆曲线方程的椭圆曲线点r1,并将r1发送给第2个通信端装置;

s22,对于第2个通信端装置到第m-1个通信端装置,依次执行ri=[di]ri-1+[ki]g,将满足椭圆曲线方程的椭圆曲线点ri发送给第i+1个通信端装置,直至计算得到满足椭圆曲线方程的椭圆曲线点rm-1发送给第m个通信端装置;

其中,di为第i个通信端装置的子私钥,ki为第i个通信端装置产生的随机数,ki∈[1,n-1],i=2,3,…,m-1,g为sm2的椭圆曲线基点。

本发明的一个具体实施例,所述利用多个通信端装置产生的随机数、各自的子私钥和所述第一部分签名生成第二部分签名包括:

s31,第m个通信端装置至第2个通信端装置依次根据自身产生的随机数、接收的ti和子私钥dm通过如下公式计算得到不等于0的ti-1直至得到t1:

ti-1=dm-1(ki+ti)modn;

其中,dm为第m个通信端的子私钥,ki为第i个通信端装置产生的随机数,ki∈[1,n-1],i=m,m-1,…,2,n为g的阶,mod为求模运算;

s32,若t1不等于0且r不等于0,则第1个通信端根据自身产生的随机数、接收的t1和第一部分签名r通过如下公式生成s:

s=(d1-1(k1+t1)-r)modn;

其中,d1为第1个通信端的子私钥,k1为第1个通信端产生的随机数,k1∈[1,n-1],n为g的阶,mod为求模运算;若s不等于0,则得到完整签名(r,s)并输出。

具体地,联合签名的过程分为第一部分签名的计算过程和第二部分签名的计算过程,其中第二部分签名s的计算过程如下:

1:令tm=r;

2:对于端i=m,m-1,…,2,执行

2.1:计算ti-1=dm-1(ki+ti)modn;

2.2:将ti-1发送给端i-1;

3:端1计算s=(d1-1(k1+t1)-r)modn。

以上第一部分签名的计算和第二部分签名的计算完成了对消息m的签名,签名值为(r,s)。

本发明的一个具体实施例,m个通信端装置共享sm2的椭圆曲线参数e(fp)、(p,a,b,g,n,h),其中,椭圆曲线e为定义在包含p个元素的素域fp上的椭圆曲线,e(fp)为fp上椭圆曲线e的包括无穷远点o的所有有理点组成的集合,a和b为fp中的元素,g为椭圆曲线e上n阶的基点,h为余因子。

本发明的一个具体实施例,公开了一种基于sm2的多方协同签名系统,包括多个通信端装置,用于生成并存储各自的子私钥;其中,所述通信端装置的数量为m;

所述各自的子私钥为用户的多方私钥,用于生成用户公钥;

第m个通信端装置,用于基于sm2根据待签名消息m的消息摘要e生成第一部分签名r;

第m个通信端装置到第2个通信端装置,依次用于根据自身产生的随机数、接收的ti和子私钥dm分别计算ti-1直至得到t1;其中,ti-1为第i-1个通信端装置接收到的第i个通信端装置计算输出参数,i=m,m-1,…,2,tm=r;

第1个通信端装置,用于接收第一部分签名r和t1,并根据自身产生的随机数、接收的t1和第一部分签名r生成第二部分签名s,得到消息m的完整签名。

与现有技术相比,本发明实施例能够保护用户私钥的安全存储,将用户私钥分割存储,并且在多个存储方相互交互、协作计算签名,并且保证私钥不会泄露,任意方也不会由交互内容得到完整私钥。

具体用例来说,以m=3为例,进一步说明多方协同签名的执行过程。待签名的消息为m,为了获取消息m的数字签名(r,s),通信端a、通信端b、通信端c实现以下运算步骤。

(1)端a执行

a1:用产生随机数k1∈[1,n-1];

a2:计算椭圆曲线点r1=[k1]g,并将r1发送给端b;

(2)端b执行

b1:按sm2算法给出的方法,验证r1是否满足椭圆曲线方程,若不满足则报错并退出;

b2:用随机数发生器产生随机数k2∈[1,n-1];

b3:计算椭圆曲线点r2=[d2]r1+[k2]g,若r2=o则返回b2;否则将r2发送给端c;

(3)端c执行

c1:按sm2算法给出的方法,验证r2是否满足椭圆曲线方程,若不满足则报错并退出;

c2:按照sm2的描述计算e=h256(z||m),并将e转换为整数;

c3:用随机数发生器产生随机数k3∈[1,n-1];

c4:计算椭圆曲线点(x,y)=[d3]r2+[k3]g,若(x,y)=o则返回c2;否则按sm2算法给出的方法将x的数据类型转换为整数;

c5:计算r=(e+x)modn,若r=0则返回c2;

c6:计算t=d3-1(k3+r)modn,若t=0则返回c2;

c7:将r和t发送给端b;

(4)端b执行

b4:若r=0或t=0则报错并退出;

b5:计算u=d2-1(k2+t)modn,若u=0则报错并退出;

b6:将r和u发送给端a;

(5)端a执行

a3:若r=0或u=0则报错并退出;

a4:计算s=(d1-1(k1+u)-r)modn,若s=0则报错并退出;

a5:按sm2算法将r、s的数据类型转换为字节串,消息m的签名为(r,s)。

综上所述,本发明公开了一种基于sm2的多方协同签名方法及系统,该方法包括以下步骤:得到多个通信端装置各自的子私钥作为用户的多方私钥,并利用用户的多方私钥生成用户公钥;利用所述用户公钥将待签名消息m生成消息摘要e,并基于sm2根据所述消息摘要e生成第一部分签名;利用多个通信端装置产生的随机数、各自的子私钥和所述第一部分签名生成第二部分签名,得到消息m的完整签名。本发明采用将私钥分割存放的多方协同签名方案,将私钥信息分割存放于多个存储端,在进行sm2签名运算时,多个存储端利用各自存放的私钥进行签名运算,最后由一端来合成签名,在整个运算过程中不会泄露私钥的任何信息,各个存储端也不会获取到其它端存放的任何私钥信息,从而有效避免了因单个设备的密钥管理不善而导致私钥泄露。

本领域技术人员可以理解,实现上述实施例中方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

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