无可信中心的分布式数字签名方法与流程

文档序号:18267024发布日期:2019-07-27 09:15阅读:200来源:国知局
无可信中心的分布式数字签名方法与流程

本发明涉及一种数字签名方法,特别涉及一种无可信中心的分布式数字签名方法。



背景技术:

文献“goldfeders,gennaror,kalodnerh,etal.securingbitcoinwalletsviaanewdsa/ecdsathresholdsignaturescheme.2015.”中提出了一种分布式门限签名方法,该方法利用的主要技术是paillier同态加密算法和零知识证明。该方法中,签名的私钥由t个人掌握,签名过程需要t个人参与完成,因此提高了签名私钥的安全性。然而,这个方法中使用了大量的零知识证明操作,零知识证明需要验证方与被验证方进行多次交互,交互次数的量级越高,被验证方的可信度越高,这是一个耗时操作,因此该方法的效率相对较低。在该方法中,完成一次签名需要进行t次零知识证明,假设进行一次零知识证明需要tz次交互,那么完成所有的零知识证明就需要t·tz次交互,交互的次数太多导致该方法并不适合在真实场景中应用。



技术实现要素:

为了克服现有数字签名方法效率低的不足,本发明提供一种无可信中心的分布式数字签名方法。该方法在密钥生成阶段,t个签名参与者依次选取自己的子私钥并秘密保存,通过与前一个公钥生成参数相乘计算自己对应的公钥生成参数,最终第t个签名参与者计算出公钥。在签名阶段,t个签名参与者依次利用自己持有的子私钥进行分布式签名,然后由第t个签名参与者在同态加密条件下完成签名第二部分的合成,再由第一个签名参与者完成最终的签名合成与验证。本发明利用paillier同态加密算法,每个签名参与者不需要利用零知识证明来保证签名的正确性,只需要由第一个签名参与者对签名进行验证就可以保证最终签名的正确性,最后的签名验证只需要一个椭圆曲线上的点加运算和两个椭圆曲线上的点乘运算,与背景技术方法的t·tz次交互相比,提高了计算效率。

本发明解决其技术问题所采用的技术方案:一种无可信中心的分布式数字签名方法,其特点是包括以下步骤:

步骤一、第一个签名参与者id1选取自己的子私钥d1∈{1,2,…,n-1}并秘密保存,然后按照下式,计算第一个公钥生成参数q1,并将第一个公钥生成参数q1发送给第二个签名参与者id2:

q1=d1g

其中,id1表示第一个签名参与者,id2表示第二个签名参与者,d1表示第一个签名参与者id1的子私钥,q1表示第一个公钥生成参数,g表示椭圆曲线上一个阶为n的基点,n为正整数,表示基点g的阶;

步骤二、第i个签名参与者idi接收到第i-1个公钥生成参数qi-1后,选取自己的子私钥di∈{1,2,…,n-1}并秘密保存,然后按照下式,计算第i个公钥生成参数qi,并将第i个公钥生成参数qi发送给第i+1个签名参与者idi+1,i∈{2,3,…,t-1}:

qi=diqi-1

其中,idi表示第i个签名参与者,idi+1表示第i+1个签名参与者,di表示第i个签名参与者idi的子私钥,qi-1表示第i-1个公钥生成参数,qi表示第i个公钥生成参数,t是一个正整数,表示签名参与者的个数;

步骤三、第t个签名参与者idt接收到第t-1个公钥生成参数qt-1后,选取自己的子私钥dt∈{1,2,…,n-1}并秘密保存,然后按照下式,计算公钥q,并将公钥q广播给所有签名参与者:

q=dtqt-1

其中,idt表示第t个签名参与者,qt-1表示第t-1个公钥生成参数,dt表示第t个签名参与者idt的子私钥,q表示公钥;

步骤四、第一个签名参与者id1选取自己的秘密值k1∈{1,2,…,n-1},然后计算自己的秘密值k1在模n下是否存在乘法逆元如果存在,则执行下一步骤,如果不存在,则重新选取自己的秘密值k1∈{1,2,…,n-1}并重新计算自己的秘密值k1在模n下是否存在乘法逆元直到找到一个存在乘法逆元的秘密值k1,然后执行下一步骤;

其中,k1表示第一个签名参与者id1的秘密值,表示第一个签名参与者id1的秘密值k1在模n下的乘法逆元;

步骤五、按照下式,第一个签名参与者id1计算第一个签名参数中间值r1,并将第一个签名参数中间值r1发送给第二个签名参与者id2:

r1=k1g

其中,r1表示第一个签名参数中间值;

步骤六、第i个签名参与者idi接收到第i-1个签名参数中间值ri-1后,选取自己的秘密值ki∈{1,2,…,n-1},然后计算自己的秘密值ki在模n下是否存在乘法逆元如果存在,则执行下一步骤,如果不存在,则重新选取自己的秘密值ki∈{1,2,…,n-1}并重新计算自己的秘密值ki在模n下是否存在乘法逆元直到找到一个存在乘法逆元的秘密值ki,然后执行下一步骤,i=2,3,…,t-1;

其中,ki表示第i个签名参与者idi的秘密值,表示第i个签名参与者idi的秘密值ki在模n下的乘法逆元;

步骤七、按照下式,第i个签名参与者idi计算第i个签名参数中间值ri,并将第i个签名参数中间值ri发送给第i+1个签名参与者idi+1,i=2,3,…,t-1:

ri=kiri-1

其中,ri表示第i个签名参数中间值,ri-1表示第i-1个签名参数中间值;

步骤八、第t个签名参与者idt接收到第t-1个签名参数中间值rt-1后,选取自己的秘密值kt∈{1,2,…,n-1},然后计算自己的秘密值kt在模n下是否存在乘法逆元如果存在,则执行下一步骤,如果不存在,则重新选取自己的秘密值kt∈{1,2,…,n-1}并重新计算自己的秘密值kt在模n下是否存在乘法逆元直到找到一个存在乘法逆元的秘密值kt,然后执行下一步骤;

其中,kt表示第t个签名参与者idt的秘密值,表示第t个签名参与者idt的秘密值kt在模n下的乘法逆元;

步骤九、按照下式,第t个签名参与者idt计算签名参数r:

r=ktrt-1=(xr,yr)

然后判断签名参数r是否为椭圆曲线上的零点,如果是,则返回步骤六,如果不是,则将签名参数r广播给所有的签名参与者;

其中,rt-1表示第t-1个签名参数中间值,r表示签名参数,xr表示签名参数r的横坐标,yr表示签名参数r的纵坐标;

步骤十、第一个签名参与者id1接收到签名参数r后,按照下式,计算第一部分签名r:

r=xrmodn

然后判断r=0是否成立,如果成立,则返回步骤三,如果不成立,则继续执行下一步骤;

其中,r表示第一部分签名,mod表示求模运算;

步骤十一、按照下式,第一个签名参与者id1计算消息m的哈希值h,然后按照数据类型转换规则,将h转换成一个整数e;

h=hash(m)

其中,m表示消息,h表示消息m的哈希值,hash表示一个密码哈希算法,e表示哈希值h转换后的整数值;

步骤十二、第一个签名参与者id1选择paillier同态加密算法的私钥sk和公钥pk,将私钥sk秘密保存,并将公钥pk公开;

其中,paillier表示同态加密算法,sk表示paillier同态加密算法的私钥,用来做解密运算,pk表示paillier同态加密算法的公钥,用来做加密运算;

步骤十三、按照下式,第一个签名参与者id1计算第一个签名生成参数第一部分α1和第一个签名生成参数第二部分β1,然后将第一个签名生成参数第一部分α1和第一个签名生成参数第二部分β1发送给第二个签名参与者id2:

其中,α1表示第一个签名生成参数第一部分,β1表示第一个签名生成参数第二部分,epk(.)表示paillier同态加密算法的加密运算;

步骤十四、第i个签名参与者idi接收到第i-1个签名生成参数第一部分αi-1和第i-1个签名生成参数第二部分βi-1后,按照下式,计算第i个签名生成参数第一部分αi和第i个签名生成参数第二部分βi,然后将第i个签名生成参数第一部分αi和第i个签名生成参数第二部分βi发送给第i+1个签名参与者idi+1,i=2,3,…,t-1:

其中,αi表示第i个签名生成参数第一部分,βi表示第i个签名生成参数第二部分,αi-1表示第i-1个签名生成参数第一部分,βi-1表示第i-1个签名生成参数第二部分,×e表示paillier同态加密算法下的乘法同态运算;

步骤十五、第t个签名参与者idt接收到第t-1个签名生成参数第一部分αt-1和第t-1个签名生成参数第二部分βt-1后,按照下式,计算第t个签名生成参数第一部分αt和第t个签名生成参数第二部分βt:

其中,αt表示第t个签名生成参数第一部分,βt表示第t个签名生成参数第二部分,αt-1表示第t-1个签名生成参数第一部分,βt-1表示第t-1个签名生成参数第二部分;

步骤十六、按照下式,第t个签名参与者idt计算第二部分签名s在paillier同态加密下的密文c,然后将第二部分签名s在paillier同态加密下的密文c发送给第一个签名参与者id1:

c=αt+eβ2t+1

其中,s表示第二部分签名,c表示第二部分签名s在paillier同态加密下的密文,+e表示paillier同态加密算法下的加法同态运算;

步骤十七、按照下式,第一个签名参与者id1计算第二部分签名s:

s=dsk(c)modn

其中,dsk(.)表示paillier同态加密算法的解密运算;

步骤十八、按照下式,第一个签名参与者id1计算签名验证参数r′,r′=(xr′,yr′):

r′=s-1(eg+rq)

其中,r′表示签名验证参数,xr′表示签名验证参数r′的横坐标,yr′表示签名验证参数r′的纵坐标,s-1表示第二部分签名s在模n下的乘法逆元;

步骤十九、按照下式,第一个签名参与者id1计算第一部分签名的验证参数r′:

r′≡xr′modn

然后判断等式r′=r是否成立,如果成立,则执行下一步骤,如果不成立,则签名失败,返回步骤六;

其中,r′表示第一部分签名的验证参数,≡表示同余符号;

步骤二十、第一个签名参与者id1提取签名(r,s),然后将签名(r,s)广播给所有签名参与者;

其中,(r,s)表示最终生成的签名。

本发明的有益效果是:该方法在密钥生成阶段,t个签名参与者依次选取自己的子私钥并秘密保存,通过与前一个公钥生成参数相乘计算自己对应的公钥生成参数,最终第t个签名参与者计算出公钥。在签名阶段,t个签名参与者依次利用自己持有的子私钥进行分布式签名,然后由第t个签名参与者在同态加密条件下完成签名第二部分的合成,再由第一个签名参与者完成最终的签名合成与验证。本发明利用paillier同态加密算法,每个签名参与者不需要利用零知识证明来保证签名的正确性,只需要由第一个签名参与者对签名进行验证就可以保证最终签名的正确性,最后的签名验证只需要一个椭圆曲线上的点加运算和两个椭圆曲线上的点乘运算,与背景技术方法的t·tz次交互相比,提高了计算效率。

另外,本发明实现了私钥的分布式生成与存储,私钥的生成不需要可信中心,私钥的安全性较高。

本发明利用分布式签名的方法,实现了私钥由多个人持有、签名由多个人生成的功能,并且在私钥生成和签名过程中都不需要显式地合成私钥,避免了私钥泄露所带来的风险。

下面结合附图和具体实施方式对本发明作详细说明。

附图说明

图1是本发明无可信中心的分布式数字签名方法的流程图。

具体实施方式

名词解释:

t:椭圆曲线secp256k1的参数;

p:生成有限域fp的大素数,其值为fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f=2256-232-29-28-27-26-24-1;

a,b:椭圆方程的参数,a=0,b=7;

g:椭圆曲线上一个阶为n的基点,其值为0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8;

n:椭圆曲线基点g的阶,其值为fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141;

h:余因数,控制选取点的密度,其值为01;

id1:第一个签名参与者;

id2:第二个签名参与者;

idi:第i个签名参与者;

idi+1:第i+1个签名参与者;

idt:第t个签名参与者;

d1:第一个签名参与者id1的子私钥;

di:第i个签名参与者idi的子私钥;

dt:第t个签名参与者idt的子私钥;

q1:第一个公钥生成参数;

qi:第i个公钥生成参数;

qi-1:第i-1个公钥生成参数;

qt-1:第t-1个公钥生成参数;

q:签名公钥;

t:一个正整数,表示签名参与者的个数;

k1:第一个签名参与者id1的秘密值;

第一个签名参与者id1的秘密值k1在模n下的乘法逆元;ki:第i个签名参与者idi的秘密值;

ki-1:第i个签名参与者idi的秘密值ki在模n下的乘法逆元;kt:第t个签名参与者idt的秘密值;

第t个签名参与者idt的秘密值kt在模n下的乘法逆元;

r1:第一个签名参数中间值;

ri:第i个签名参数中间值;

ri-1:第i-1个签名参数中间值;

rt-1:第t-1个签名参数中间值;

r:签名参数;

xr:签名参数r的横坐标;

yr:签名参数r的纵坐标;

r:第一部分签名;

mod:求模运算;

m:消息;

h:消息m的哈希值;

hash:密码哈希算法;

e:哈希值h转换后的整数值;

α1:第一个签名生成参数第一部分;

β1:第一个签名生成参数第二部分;

paillier:同态加密算法;

sk:paillier同态加密算法的私钥;

pk:paillier同态加密算法的公钥;

esk(.):paillier同态加密算法的加密运算;

dpk(.):paillier同态加密算法的解密运算;

αi:第i个签名生成参数第一部分;

αi-1:第i-1个签名生成参数第一部分;

αt-1:第t-1个签名生成参数第一部分;

αt:第t个签名生成参数第一部分;

βi:第i个签名生成参数第二部分;

βi-1:第i-1个签名生成参数第二部分;

βt-1:第t-1个签名生成参数第二部分;

βt:第t个签名生成参数第二部分;

×e:paillier同态加密算法下的乘法同态运算;

+e:paillier同态加密算法下的加法同态运算;

s:第二部分签名;

s-1:第二部分签名s在模n下的乘法逆元;

c:第二部分签名s在paillier同态加密下的密文;

r′:签名验证参数;

xr′:签名验证参数r′的横坐标;

yr′:签名验证参数r′的纵坐标;

r′:第一部分签名的验证参数;

≡:同余符号;

(r,s):最终生成的签名。

参照图1。本发明无可信中心的分布式数字签名方法具体步骤如下:

确定系统参数:这是具体实施之前的准备工作。

选取椭圆曲线secp256k1,确定参数t=(p,a,b,g,n,h),其中,t表示椭圆曲线secp256k1的参数,p表示生成有限域fp的大素数,p=fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f=2256-232-29-28-27-26-24-1,a,b表示椭圆方程的参数,a=0,b=7,g表示椭圆曲线上一个阶为n的基点,g=0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8,n表示椭圆曲线基点g的阶,n=fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141,h表示余因数,控制选取点的密度,h=01。

步骤一、第一个签名参与者id1选取自己的子私钥d1∈{1,2,…,n-1}并秘密保存,然后按照下式,计算第一个公钥生成参数q1,并将第一个公钥生成参数q1发送给第二个签名参与者id2:

q1=d1g

其中,id1表示第一个签名参与者,id2表示第二个签名参与者,d1表示第一个签名参与者id1的子私钥,q1表示第一个公钥生成参数,g表示椭圆曲线上一个阶为n的基点,n为正整数,表示基点g的阶;

步骤二、第i个签名参与者idi接收到第i-1个公钥生成参数qi-1后,选取自己的子私钥di∈{1,2,…,n-1}并秘密保存,然后按照下式,计算第i个公钥生成参数qi,并将第i个公钥生成参数qi发送给第i+1个签名参与者idi+1,i∈{2,3,…,t-1}:

qi=diqi-1

其中,idi表示第i个签名参与者,idi+1表示第i+1个签名参与者,di表示第i个签名参与者idi的子私钥,qi-1表示第i-1个公钥生成参数,qi表示第i个公钥生成参数,t是一个正整数,表示签名参与者的个数;

步骤三、第t个签名参与者idt接收到第t-1个公钥生成参数qt-1后,选取自己的子私钥dt∈{1,2,…,n-1}并秘密保存,然后按照下式,计算公钥q,并将公钥q广播给所有签名参与者:

q=dtqt-1

其中,idt表示第t个签名参与者,qt-1表示第t-1个公钥生成参数,dt表示第t个签名参与者idt的子私钥,q表示公钥;

步骤四、第一个签名参与者id1选取自己的秘密值k1∈{1,2,…,n-1},然后计算自己的秘密值k1在模n下是否存在乘法逆元如果存在,则执行下一步骤,如果不存在,则重新选取自己的秘密值k1∈{1,2,…,n-1}并重新计算自己的秘密值k1在模n下是否存在乘法逆元直到找到一个存在乘法逆元的秘密值k1,然后执行下一步骤;

其中,k1表示第一个签名参与者id1的秘密值,表示第一个签名参与者id1的秘密值k1在模n下的乘法逆元;

步骤五、按照下式,第一个签名参与者id1计算第一个签名参数中间值r1,并将第一个签名参数中间值r1发送给第二个签名参与者id2:

r1=k1g

其中,r1表示第一个签名参数中间值;

步骤六、第i个签名参与者idi接收到第i-1个签名参数中间值ri-1后,选取自己的秘密值ki∈{1,2,…,n-1},然后计算自己的秘密值ki在模n下是否存在乘法逆元如果存在,则执行下一步骤,如果不存在,则重新选取自己的秘密值ki∈{1,2,…,n-1}并重新计算自己的秘密值ki在模n下是否存在乘法逆元直到找到一个存在乘法逆元的秘密值ki,然后执行下一步骤,i=2,3,…,t-1;

其中,ki表示第i个签名参与者idi的秘密值,表示第i个签名参与者idi的秘密值ki在模n下的乘法逆元;

步骤七、按照下式,第i个签名参与者idi计算第i个签名参数中间值ri,并将第i个签名参数中间值ri发送给第i+1个签名参与者idi+1,i=2,3,…,t-1:

ri=kiri-1

其中,ri表示第i个签名参数中间值,ri-1表示第i-1个签名参数中间值;

步骤八、第t个签名参与者idt接收到第t-1个签名参数中间值rt-1后,选取自己的秘密值kt∈{1,2,…,n-1},然后计算自己的秘密值kt在模n下是否存在乘法逆元如果存在,则执行下一步骤,如果不存在,则重新选取自己的秘密值kt∈{1,2,…,n-1}并重新计算自己的秘密值kt在模n下是否存在乘法逆元直到找到一个存在乘法逆元的秘密值kt,然后执行下一步骤;

其中,kt表示第t个签名参与者idt的秘密值,表示第t个签名参与者idt的秘密值kt在模n下的乘法逆元;

步骤九、按照下式,第t个签名参与者idt计算签名参数r:

r=ktrt-1=(xr,yr)

然后判断签名参数r是否为椭圆曲线上的零点,如果是,则返回步骤六,如果不是,则将签名参数r广播给所有的签名参与者;

其中,rt-1表示第t-1个签名参数中间值,r表示签名参数,xr表示签名参数r的横坐标,yr表示签名参数r的纵坐标;

步骤十、第一个签名参与者id1接收到签名参数r后,按照下式,计算第一部分签名r:

r=xrmodn

然后判断r=0是否成立,如果成立,则返回步骤三,如果不成立,则继续执行下一步骤;

其中,r表示第一部分签名,mod表示求模运算;

步骤十一、按照下式,第一个签名参与者id1计算消息m的哈希值h,然后按照数据类型转换规则,将h转换成一个整数e;

h=hash(m)

其中,m表示消息,h表示消息m的哈希值,hash表示一个密码哈希算法,e表示哈希值h转换后的整数值;

步骤十二、第一个签名参与者id1选择paillier同态加密算法的私钥sk和公钥pk,将私钥sk秘密保存,并将公钥pk公开;

其中,paillier表示同态加密算法,sk表示paillier同态加密算法的私钥,用来做解密运算,pk表示paillier同态加密算法的公钥,用来做加密运算;

步骤十三、按照下式,第一个签名参与者id1计算第一个签名生成参数第一部分α1和第一个签名生成参数第二部分β1,然后将第一个签名生成参数第一部分α1和第一个签名生成参数第二部分β1发送给第二个签名参与者id2:

其中,α1表示第一个签名生成参数第一部分,β1表示第一个签名生成参数第二部分,epk(.)表示paillier同态加密算法的加密运算;

步骤十四、第i个签名参与者idi接收到第i-1个签名生成参数第一部分αi-1和第i-1个签名生成参数第二部分βi-1后,按照下式,计算第i个签名生成参数第一部分αi和第i个签名生成参数第二部分βi,然后将第i个签名生成参数第一部分αi和第i个签名生成参数第二部分βi发送给第i+1个签名参与者idi+1,i=2,3,…,t-1:

其中,αi表示第i个签名生成参数第一部分,βi表示第i个签名生成参数第二部分,αi-1表示第i-1个签名生成参数第一部分,βi-1表示第i-1个签名生成参数第二部分,×e表示paillier同态加密算法下的乘法同态运算;

步骤十五、第t个签名参与者idt接收到第t-1个签名生成参数第一部分αt-1和第t-1个签名生成参数第二部分βt-1后,按照下式,计算第t个签名生成参数第一部分αt和第t个签名生成参数第二部分βt:

其中,αt表示第t个签名生成参数第一部分,βt表示第t个签名生成参数第二部分,αt-1表示第t-1个签名生成参数第一部分,βt-1表示第t-1个签名生成参数第二部分;

步骤十六、按照下式,第t个签名参与者idt计算第二部分签名s在paillier同态加密下的密文c,然后将第二部分签名s在paillier同态加密下的密文c发送给第一个签名参与者id1:

c=αt+eβ2t+1

其中,s表示第二部分签名,c表示第二部分签名s在paillier同态加密下的密文,+e表示paillier同态加密算法下的加法同态运算;

步骤十七、按照下式,第一个签名参与者id1计算第二部分签名s:

s=dsk(c)modn

其中,dsk(.)表示paillier同态加密算法的解密运算;

步骤十八、按照下式,第一个签名参与者id1计算签名验证参数r′,r′=(xr′,yr′):

r′=s-1(eg+rq)

其中,r′表示签名验证参数,xr′表示签名验证参数r′的横坐标,yr′表示签名验证参数r′的纵坐标,s-1表示第二部分签名s在模n下的乘法逆元;

步骤十九、按照下式,第一个签名参与者id1计算第一部分签名的验证参数r′:

r′≡xr′modn

然后判断等式r′=r是否成立,如果成立,则执行下一步骤,如果不成立,则签名失败,返回步骤六;

其中,r′表示第一部分签名的验证参数,≡表示同余符号;

步骤二十、第一个签名参与者id1提取签名(r,s),然后将签名(r,s)广播给所有签名参与者;

其中,(r,s)表示最终生成的签名。

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