一种基于MuSig2的多重数据签名加速方法及系统与流程

文档序号:29793583发布日期:2022-04-23 18:16阅读:373来源:国知局
一种基于MuSig2的多重数据签名加速方法及系统与流程
一种基于musig2的多重数据签名加速方法及系统
技术领域
1.本发明公开一种基于musig2的多重数据签名加速方法及系统,涉及密码学数字签名技术领域。


背景技术:

2.多重签名协议,允许一组签名者(每个人拥有自己的私钥/公钥对)在消息m 上产生一个单独的签名σ。schnorr是一种非常优秀的数字签名算法,这得益于它的线性特性,可以利用这一特性将多个数字签名聚合为一个签名和将多个公钥聚合为一个公钥,然后用聚合后的公钥验证聚合后的签名。利用schnorr 算法(相对于ecdsa等)设计多重签名协议相对容易,通信轮次比较少。比特币和以太坊社区都在讨论利用基于schnorr的多重签名算法提高数字签名验证效率、减少区块存储对磁盘空间的占用。
3.musig2([论文参考jty2020])是一种基于schnorr算法实现的、目前为止最高效的多重签名方案。musig2方案是第一个具备以下特性的多重签名方案, i)在并发签名会话下是安全的,ii)支持密钥聚合,iii)输出普通schnorr签名, iiv)只需要两轮通信,v)具有与常规schnorr签名相似的签名者复杂度。
[0004]
musig2是musig(论文参考[mpsw19])多重签名算法的两轮变体,同musig 需要三轮(承诺、随机数获取、签名)并发通信相比,musig2删除了初始承诺 阶段,参与签名的多个签名者i可以立即发送各自随机数(nonce)。但发送的 随机数不是一个,而是v个(v≥2)随机数组成的列表ri,1,..,ri,v,并使用这v 个nonce的线性组合来充当计算挑战时真正使用的随机数 (nonce),其中b1=1而系数bj(2≤j≤v)通过哈希函数派生。
[0005]
musig2的多重数字签名过程实际上是一种安全多方计算(smpc)过程,哪怕已经减少到两轮并发通信,仍存在响应延迟时间长、通信和计算复杂的问题,需要在算法的实际实现时充分利用计算机的批处理、缓存、任务调度等技术,对算法进行加速。
[0006]
故现发明一种基于musig2的多重数据签名加速方法及系统,以解决上述问题。


技术实现要素:

[0007]
本发明针对现有技术的问题,提供一种基于musig2的多重数据签名加速方法及系统,所采用的技术方案为:一种基于musig2的多重数据签名加速方法,所述的方法的具体步骤如下:
[0008]
s1将musig2的实现函数sign'进行拆分;
[0009]
s2批量建立musig2随机数缓存;
[0010]
s3利用缓存进行musig2签名;
[0011]
s4利用索引计数器对中间数据的缓存状态进行更新同步。
[0012]
所述s1将musig2的实现函数sign'进行拆分的具体步骤如下:
[0013]
s101将函数sign'拆分为sign1'和sign2'两个函数;
[0014]
s102利用sign1'函数提前执行并将执行结果缓存;
[0015]
s103收到待签名消息m时,执行sign2'和sign"函数计算签名结果。
[0016]
所述s2批量建立musig2随机数缓存的具体步骤如下:
[0017]
s201重复执行musig2多重数字签名的第一轮,计算出中间数据并本地存储;
[0018]
s202利用待签名消息提前计算中间结果并缓存;
[0019]
s203利用当前节点执行setup、kengen函数建立基本运行环境。
[0020]
所述s3利用缓存进行musig2签名即受到签名请求时执行musig2数字签名算法的第二轮次,其具体步骤如下:
[0021]
s301从本地缓存中取出state1,msg,a1,调用函数函数返回state1',msg1',发送msg1'给其他n-1 个节点;
[0022]
s302等待其他节点的msgi',调用函数 sign"(state1',(msg2',...,msgn')),函数返回多重schnorr签名σ=(r,s);
[0023]
s303将本地缓存的索引计数器加1,等待下一次的签名请求。
[0024]
所述s4利用索引计数器对中间数据的缓存状态进行更新同步的具体步骤如下:
[0025]
s401利用各节点对中间数据进行批量缓存;
[0026]
s402各节点通过相互发送自己的索引计数器值进行缓存状态的一致性更新和同步;
[0027]
s403当发生局部性计数器不一致时,对计数器进行初始化并放弃当前中间数据;
[0028]
s404对中间数据重新进行批量计算。
[0029]
一种基于musig2的多重数据签名加速系统,所述的系统具体包括函数拆分模块、数据缓存模块、多重签名模块和状态处理模块:
[0030]
函数拆分模块:将musig2的实现函数sign'进行拆分;
[0031]
数据缓存模块:批量建立musig2随机数缓存;
[0032]
多重签名模块:利用缓存进行musig2签名;
[0033]
状态处理模块:利用索引计数器对中间数据的缓存状态进行更新同步。
[0034]
所述函数拆分模块具体包括拆分处理模块、函数执行模块和签名执行模块:
[0035]
拆分处理模块:将函数sign'拆分为sign1'和sign2'两个函数;
[0036]
函数执行模块:利用sign1'函数提前执行并将执行结果缓存;
[0037]
签名执行模块:收到待签名消息m时,执行sign2'和sign"函数计算签名结果。
[0038]
所述数据缓存模块具体包括第一轮执行模块、提前处理模块和节点处理模块:
[0039]
第一轮执行模块:重复执行musig2多重数字签名的第一轮,计算出中间数据并本地存储;
[0040]
提前处理模块:利用待签名消息提前计算中间结果并缓存;
[0041]
节点处理模块:利用当前节点执行setup、kengen函数建立基本运行环境。
[0042]
所述多重签名模块利用缓存进行musig2签名即受到签名请求时执行 musig2数字签名算法的第二轮次,多重签名模块具体包括函数抽取模块、函数调用模块和请求等待模块:
[0043]
函数抽取模块:从本地缓存中取出state1,msg,a1,调用函数
函数返回state1',msg1',发送msg1'给其他n-1 个节点;
[0044]
函数调用模块:等待其他节点的msgi',调用函数 sign"(state1',(msg2',...,msgn')),函数返回多重schnorr签名σ=(r,s);
[0045]
请求等待模块:将本地缓存的索引计数器加1,等待下一次的签名请求。
[0046]
所述状态处理模块具体包括批量缓存模块、节点同步模块、计数处理模块和批量计算模块:
[0047]
批量缓存模块:利用各节点对中间数据进行批量缓存;
[0048]
节点同步模块:各节点通过相互发送自己的索引计数器值进行缓存状态的一致性更新和同步;
[0049]
计数处理模块:当发生局部性计数器不一致时,对计数器进行初始化并放弃当前中间数据;
[0050]
批量计算模块:对中间数据重新进行批量计算。
[0051]
本发明的有益效果为:本发明提供了一种基于musig2的多重数据签名加速方法,将musig2的两轮并发通信的第一轮进行提前批量预处理,让各签名节点提前为第二轮计算准备好中间数据,从而在即时进行多方musig2数字签名时直接跳过第一轮,各签名节点者利用本地缓存的中间数据直接进行第二轮次的计算,减少了实时签名时的通信量、计算量,从而提高musig2多重数字签名的响应速度。
附图说明
[0052]
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0053]
图1是本发明方法的流程图;图2是本发明系统的结构示意图。
具体实施方式
[0054]
下面结合附图和具体实施例对本发明作进一步说明,以使本领域的技术人员可以更好地理解本发明并能予以实施,但所举实施例不作为对本发明的限定。
[0055]
首先对本发明涉及的函数定义进行简述:
[0056]
musig2多重签名算法简述:
[0057]
1.参数设置;在输入1λ上,设置算法setup运行(g,p,g)

grgen(1λ),选择三个散列函数8hagg、hnon和hsig从{0,1}*到zp,并返回 par:=((g,p,g),hagg,hnon,hsig);
[0058]
2.密钥生成;每个签名者生成一个随机私钥x

$zp,并计算相关公钥x=gx;
[0059]
3.第一个签名步骤(sign和通信轮);设x1和x1是特定签名者的公共密钥和优先密钥;对于每个j∈{1,

,v}签名者随机生成r1,j

$zp,计算r1,并广播(r1,1,...,r1,v)发送给所有潜在的共同签署人9;
[0060]
4.第二个签名步骤(sign'和通信轮);设m为要签名的消息,设x2,...,xn 是其他
共同签名者的公钥,设l={x1,...,xn}是签名过程中涉及的所有公钥的多集10;对于i∈{1,...,n},签名者计算ai=hagg(l,xi),然后“聚合”公钥当从其他签名者那里收到 (r2,1,...,r2,v),...,(rn,1,....,rn,v),对于每个j∈{1,...,v}签名者计算然后系数向量(b1,...,bv)为b1=1、对j∈{2,...,v};然后它计算
[0061][0062][0063][0064]
并将s1发送给所有其他共同签名者;
[0065]
5.最后签名步骤(sign");最后,从其他联名者那里接收到s2,...,sn后,签名者可以计算签名是σ=(r,s);
[0066]
6.验证;给定公钥多集l={x1,...,xn}、消息m和签名σ=(r,s),验证者计算ai=hagg(l,xi)对于i∈{1,...,n}、如果则接受签名;
[0067]
下表是musig2算法中几个函数的定义,包括setup、kengen、ver、sigin、 sign'、sign":
[0068][0069]
对函数sign'的拆分简述:
[0070]
将sign'拆分为sign1'和sign2'两个函数;其中sign1'仅包含musig2第一轮的计算逻辑和sign2',sign2'仅包含第二轮的计算逻辑;sign1'和sign2' 的具体定义如下:
[0071]
sign1'(state1,((pk2,msg2),...,(pkn,msgn))):
[0072]
//sign'must be called at most once per state1. (x1,r1,1,...,r1,v):=state1
[0073][0074][0075]
for i=2...n do
[0076]
xi:=pki;(r1,1,...,r1,v):=msgi
[0077]
l:={x1,...,xn}
[0078]
for i=1...n do
[0079]
ai:=hagg(l,xi)
[0080][0081]
for i=1...v do
[0082][0083]
msg:=(r1,..rv)
[0084][0085][0086]
(x1,r1,1,...,r1,v):=state1
[0087]
(r1,..rv):=msg
[0088]
b1:=1
[0089]
for j=2...v do
[0090][0091][0092][0093][0094]
state1':=(r,s1);msg1':=s1
[0095]
return(state1',msg1')
[0096]
实施例一:
[0097]
一种基于musig2的多重数据签名加速方法,所述的方法的具体步骤如下:
[0098]
s1将musig2的实现函数sign'进行拆分;
[0099]
s2批量建立musig2随机数缓存;
[0100]
s3利用缓存进行musig2签名;
[0101]
s4利用索引计数器对中间数据的缓存状态进行更新同步;
[0102]
对musig2的实现函数sign'进行了拆分(拆分为sign1'和sign2'),以方便进行第一轮并发通信和协作计算的提前和批量进行;通过重复调用函数 sign1'并批量缓存返回值(称为中间数据),使得第二轮执行可以提前准备好的中间数据基础上进行,提高了musig2多重数字签名的响应速度;
[0103]
各节点对中间数据进行了批量缓存,在协同使用中间数据时,各节点通过相互发送自己的索引计数器值进行缓存状态的一致性更新和同步;当发生全局性计数器不一致时,对计数器进行初始化并放弃当前中间数据,重新进行中间数据的批量计算,从而保证算法的正确性和对计算错误、恶意攻击的抵抗性;
[0104]
进一步的,所述s1将musig2的实现函数sign'进行拆分的具体步骤如下:
[0105]
s101将函数sign'拆分为sign1'和sign2'两个函数;
[0106]
s102利用sign1'函数提前执行并将执行结果缓存;
[0107]
s103收到待签名消息m时,执行sign2'和sign"函数计算签名结果;
[0108]
musig2的多重签名计算过程由6个函数组成:setup、kengen、ver、sigin、 sign'、sign",其中函数sign'将第一轮的和第二轮的计算混杂在一起,且把待签名消息m作为输入参数,这使得第一轮计算无法提前,也就无法批量处理和缓存提前计算的结果;本发明将函数sign'拆分为sign1'和sign2'两个函数; sign1'只包含第一轮的计算,且不需要参数m
(待签名消息);这样,函数sign1' 就可以提前执行,并可以把执行结果缓存起来,收到待签名消息m时,再执行 sign2'和sign"(即第二轮),从而快速计算出结果,提高签名响应速度;函数sign1'和sign2'的具体定义见对函数sign'的拆分简述;
[0109]
进一步的,所述s2批量建立musig2随机数缓存的具体步骤如下:
[0110]
s201重复执行musig2多重数字签名的第一轮,计算出中间数据并本地存储;
[0111]
s202利用待签名消息提前计算中间结果并缓存;
[0112]
s203利用当前节点执行setup、kengen函数建立基本运行环境;
[0113]
重复执行musig2多重数字签名的第一轮,使多个客户端协同计算出第二轮需要的中间数据,并在本地存储;假定有n个签名方节点参与,计划为k个待签名消息提前计算中间结果并缓存;假定已当前节点以执行setup、kengen函数建立了基本运行环境;下面从调用sign函数开始为第1个待签名消息准备中间数据:
[0114]
调用函数sign(sk1),函数的返回值是state1和msg1;(将state1保存到本地缓存,将msg1发送给其他的n-1个节点,并接收其他节点的msgi,其中 i=2,...,n;
[0115]
调用函数sign1'(state1,((pk2,msg2),...,(pkn,msgn))),将返回值 msg,a1保存到本地缓存;
[0116]
跳到第1)步,直到执行k次;
[0117]
这样就为k个待签名消息准备好了调用第二轮的中间数据;
[0118]
进一步的,所述s3利用缓存进行musig2签名即受到签名请求时执行 musig2数字签名算法的第二轮次,其具体步骤如下:
[0119]
s301从本地缓存中取出state1,msg,a1,调用函数函数返回state1',msg1',发送msg1'给其他n-1 个节点;
[0120]
s302等待其他节点的msgi',调用函数 sign"(state1',(msg2',...,msgn')),函数返回多重schnorr签名σ=(r,s);
[0121]
s303将本地缓存的索引计数器加1,等待下一次的签名请求;
[0122]
收到签名请求时(待签名消息是m),直接执行musig2数字签名算法的第二轮次,具体的:
[0123]
从本地缓存中取出state1,msg,a1,调用函数函数返回state1',msg1',发送msg1'给其他n-1 个节点;
[0124]
等待其他节点的msgi',其中i=2,...,n;等msgi'收集全了,调用函数 sign"(state1',(msg2',...,msgn')),函数返回多重schnorr签名σ=(r,s);
[0125]
将本地缓存的索引计数器加1(下面详述索引计数器),然后等待下一次的签名请求;
[0126]
再进一步的,所述s4利用索引计数器对中间数据的缓存状态进行更新同步的具体步骤如下:
[0127]
s401利用各节点对中间数据进行批量缓存;
[0128]
s402各节点通过相互发送自己的索引计数器值进行缓存状态的一致性更新和同步;
[0129]
s403当发生局部性计数器不一致时,对计数器进行初始化并放弃当前中间数据;
[0130]
s404对中间数据重新进行批量计算;
[0131]
所有第一轮的中间数据只能使用一次,各签名节点利用计数器标记中间数据是否已使用;所有节点的索引计数器都应该从1开始,每处理一个签名请求就加1,直到等于k;当计数器大于k时,就要重新从1开始,并触发步骤(2) 的“批量建立musig2随机数缓存(第一轮)”,各节点重新协同计算出k套中间数据;
[0132]
索引计数器的具体管理方法是:
[0133]
1)所有n个节点各自维护一个计数器,初始编号是1;
[0134]
2)当收到签名请求(消息m),执行musig2的第二轮时,即调用函数sign2' 时,使用这个以计数器编号为索引号,读取本地缓存中的中间数据;
[0135]
3)发送msg1'给其他节点之前,将索引计数器加1,并将计数器值和msg1' 一并发送给其他节点;
[0136]
4)接收其他签名节点的msgi'(其中i=2,...,n)和计数器编号,比较接收到的和本地的共n个计数器编号是否相等;如果计数器不相等则说明某一个或几个节点的出错或恶意攻击,签名终止,并重新进行首轮批量预处理;
[0137]
5)如果本地索引计数器大于k,说明所有的中间数据都已经用完,需要重新启动“首轮批量预处理”,需要各节点重新合作计算出k套中间数据。
[0138]
实施例二:
[0139]
一种基于musig2的多重数据签名加速系统,所述的系统具体包括函数拆分模块、数据缓存模块、多重签名模块和状态处理模块:
[0140]
函数拆分模块:将musig2的实现函数sign'进行拆分;
[0141]
数据缓存模块:批量建立musig2随机数缓存;
[0142]
多重签名模块:利用缓存进行musig2签名;
[0143]
状态处理模块:利用索引计数器对中间数据的缓存状态进行更新同步;
[0144]
进一步的,所述函数拆分模块具体包括拆分处理模块、函数执行模块和签名执行模块:
[0145]
拆分处理模块:将函数sign'拆分为sign1'和sign2'两个函数;
[0146]
函数执行模块:利用sign1'函数提前执行并将执行结果缓存;
[0147]
签名执行模块:收到待签名消息m时,执行sign2'和sign"函数计算签名结果;
[0148]
进一步的,所述数据缓存模块具体包括第一轮执行模块、提前处理模块和节点处理模块:
[0149]
第一轮执行模块:重复执行musig2多重数字签名的第一轮,计算出中间数据并本地存储;
[0150]
提前处理模块:利用待签名消息提前计算中间结果并缓存;
[0151]
节点处理模块:利用当前节点执行setup、kengen函数建立基本运行环境;
[0152]
进一步的,所述多重签名模块利用缓存进行musig2签名即受到签名请求时执行musig2数字签名算法的第二轮次,多重签名模块具体包括函数抽取模块、函数调用模块和
请求等待模块:
[0153]
函数抽取模块:从本地缓存中取出state1,msg,a1,调用函数函数返回state1',msg1',发送msg1'给其他n-1 个节点;
[0154]
函数调用模块:等待其他节点的msgi',调用函数 sign"(state1',(msg2',...,msgn')),函数返回多重schnorr签名σ=(r,s);
[0155]
请求等待模块:将本地缓存的索引计数器加1,等待下一次的签名请求;
[0156]
再进一步的,所述状态处理模块具体包括批量缓存模块、节点同步模块、计数处理模块和批量计算模块:
[0157]
批量缓存模块:利用各节点对中间数据进行批量缓存;
[0158]
节点同步模块:各节点通过相互发送自己的索引计数器值进行缓存状态的一致性更新和同步;
[0159]
计数处理模块:当发生局部性计数器不一致时,对计数器进行初始化并放弃当前中间数据;
[0160]
批量计算模块:对中间数据重新进行批量计算。
[0161]
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1