生成秘密份额的制作方法

文档序号:33433653发布日期:2023-03-14 20:40阅读:228来源:国知局
生成秘密份额的制作方法

1.本公开涉及一种生成共享秘密的份额的方法。例如,该方法可以用于生成共享私钥的新份额。


背景技术:

2.通常,共享秘密(shared secret)可以用于共享分布在一组参与者之间的数据项。每个参与者具有该秘密的不同份额(share)。通常,只有当一定数量(称为“阈值”)的参与者提供其相应份额时才能重建该秘密,例如组合在一起以计算该秘密。
3.公钥密码学是一种使用密钥对的加密系统,该密钥对包括:私钥,其仅对私钥所有者已知;以及公钥,其是基于对应的私钥生成的,并且可以在不损害私钥安全性的情况下进行传播。
4.公钥密码学使得发送者能够使用接收者的公钥(即,与仅对接收者已知的私钥对应的公钥)来加密消息。该加密消息随后只能使用接收者的私钥进行解密。
5.类似地,发送者可以使用自己的私钥对消息进行签名,例如以证明该消息是由发送者发送的,和/或指示发送者同意该消息。签名者(即,生成签名的一方)使用他们的私钥基于该消息创建数字签名。基于消息创建数字签名意味着将该消息和私钥提供给基于该消息和私钥生成该签名的函数。该签名被添加到(例如,标记到)该消息中或以其他方式与该消息相关联。拥有签名者的对应公钥的任何人都可以使用同一消息以及该消息中的数字签名来验证签名是否有效创建,即签名是否确实是使用签名者的私钥创建的。除确保消息的真实性之外,数字签名还确保消息的完整性和不可否认性。也就是说,数字签名可以用于证明消息在使用该签名进行签名之后未更改,并且签名的创建者将来不能否认他们创建了该签名。
6.数字签名方案通常涉及三个过程,即算法。密钥生成算法用于生成随机私钥和对应的公钥。签名算法用于基于消息和私钥来生成签名。在给定公钥和消息的情况下,验证算法用于验证是否已使用对应的私钥并根据签名算法生成签名。
7.共享秘密的常见用途是作为私钥-公钥对的共享私钥。也就是说,私钥可以分布在一组参与者之间,使得没有一个参与者能够访问该私钥。因此,没有一个参与者可以生成消息的有效签名。相反,一些或全部参与者必须共同生成该私钥才能生成该签名。
8.参与者可以使用阈值签名方案,而不是共享他们的私钥份额来生成签名。阈值签名方案允许一组中阈值数量的参与者使用共享私钥的单独份额基于消息创建数字签名,而不向任何一个参与者提供该私钥。这里,数字签名是基于待签名消息生成的签名。在此类方案中,只有当阈值数量的参与者同意在消息中生成签名时,才能创建签名。使用较少数量的参与者生成签名的任何尝试都不会生成有效的签名。因此,该组的有效签名(即,使用消息和共享私钥生成的签名)可证明具有阈值数量的人同意生成签名。这还意味着,任何攻击者都需要获取私钥的阈值数量的份额,才能使用该私钥伪造签名。


技术实现要素:

9.在某些情况下,需要能够在不更改共享秘密的情况下生成所述共享秘密本身的新份额。例如,具有所述共享秘密的相应份额的一个或多个参与者可以离开一组参与者,使得其相应份额不再可用于重建所述共享秘密或使用这些份额执行计算,例如以生成阈值签名方案的签名份额。或者,再如,所述秘密的一些份额可能由于丢失或泄露而不再可用,而不是因为参与者离开所述一组参与者。这些份额可能需要更换。再如,所述一组参与者可以扩展为包括一个或多个附加参与者,因此这些参与者需要他们自己的关于所述共享秘密的份额。
10.类似地,在某些情况下,需要更改所述共享秘密的阈值。也就是说,更改重建所述共享秘密所需的密钥份额的数量。例如,增加所述共享秘密的阈值可以提高所述共享秘密的安全性,因为恶意方必须获得对其更多份额的访问权限才能重建所述共享秘密。当所述共享秘密是用于加密数据或控制对资源的访问权限的私钥时,这一点尤其相关。
11.根据本文公开的一个方面,提供了一种生成共享秘密的份额的计算机实现的方法,其中一组参与者中的每一个具有所述共享秘密的相应第一秘密份额,其中所述方法由所述一组参与者中的第一参与者执行并且包括:生成共享盲秘密的相应盲份额;从所述第一组参与者中的每一个获取至少阈值数量的相应中间份额,其中每个相应中间份额是基于相应盲份额和相应第一秘密份额生成的;基于每个所获取到的中间份额来生成中间值;以及,生成所述共享秘密的相应第二秘密份额,其中所述相应第二秘密份额是基于所述中间值和所述相应盲份额生成的。
12.本发明方案可以用于生成所述共享秘密的新份额,以便增加或减少具有所述共享秘密的有效份额的参与者数量。在本文中,有效份额是第二秘密份额中的一个秘密份额,从这个意义上来说,所述有效份额可以视为有效;此外,只有所述一组参与者作为一个整体使用所述第二秘密份额才会促成有效计算。
13.本发明方案还可以用于生成所述共享秘密的新份额,以便更改所述共享秘密的所述阈值,使得所述共享秘密的第二份额的阈值不同于所述共享秘密的所述第一份额的阈值。
14.已丢失或泄露的份额可以使用本发明方案来替代。如果“旧”份额泄露,则本发明使得所述份额无效,因为本发明方案中的其他参与者仅使用所述新份额。因此,从攻击者必须尝试泄露另一份额这个意义上来说,所述攻击者必须“重新开始”。
15.如上所述,共享秘密通常在私钥的上下文中使用,即私钥可以是共享秘密。更通俗地说,共享秘密可以是需要阈值数量的人员才能泄露它或对它进行更多计算的任何数据。
16.例如,所述数据可以是医疗数据或其他此类私人数据,其中优选地不共享实际数据(例如,与个人相关联的生物特征数据或遗传数据)。以共享秘密的形式共享医疗数据使得能够在不泄露敏感数据的情况下对所述数据进行计算(例如,统计分析)。如果本发明方案中的一个或多个参与者是所述数据的所有者,则所述所有者将需要参与结果的计算,从而允许所述所有者批准或拒绝对其数据的访问权限。拥有份额的其他参与者可以对所述数据进行计算并获取结果,而无需了解个人秘密。本发明使得所述数据的所述所有者能够更新份额,以便将其他参与者从本发明方案中“移除”。
17.更新共享秘密的另一用例是,一组参与者可以使用同一共享秘密创建多个“方
案”,从而提高所述共享秘密的安全性。所述参与者可以创建共享秘密,然后执行多次迭代或轮次的份额重新分配。结果是所述参与者都具有同一共享秘密的多个份额,所述多个份额可以和与同一“方案”或“轮次”对应的其他参与者的份额组合以求出所述秘密。如果这些共享都存储在一起,攻击者不仅需要攻击多个位置(即,参与者),还需要确定所述份额的正确组合。
附图说明
18.为了帮助理解本公开的实施例并显示如何实施此类实施例,现将仅通过举例的方式参考附图进行说明,其中:
19.图1示意性地示出了根据本发明的各实施例的用于更新共享秘密的份额的示例性系统;
20.图2示意性地示出了根据本发明的各实施例的用于更新共享秘密的份额的示例性方法;
21.图3示意性地示出了根据本发明的一些实施例的用于生成消息的签名的示例性系统;
22.图4示意性地示出了根据本发明的各实施例的用于生成消息的签名份额的示例性方法。
具体实施方式
23.预备知识
24.虽然就椭圆曲线密码学描述了以下示例,但是本发明并不限于任何一种特定的加密方案,并且通常可以应用于任何加密方案,例如rsa或其他公钥加密方案。
25.椭圆曲线群
26.椭圆曲线e满足以下等式:
27.y2=x3+ax+b mod p
28.其中和a,b是满足4a3+27b2≠0的常量。该椭圆曲线上的群被定义为满足该等式的元素集合(x,y)以及无穷远点该无穷远点是单位元素。对该群中元素进行的群运算称为椭圆曲线点加法,由+表示。该群由表示,其阶数由n表示。
29.该群运算可以用于定义对元素进行的另一种运算,称为点乘法,由
·
表示。对于点和标量点k
·
g被定义为与其自身相加k次的点g。
30.在椭圆曲线密码学中,私钥被定义为标量其中是集合{1,

,n-1}的符号,而对应的公钥是椭圆曲线上的点k
·
g。例如,在一些区块链协议中,椭圆曲线被选择作为secp256k1椭圆曲线,值a、b、和p完全由该曲线指定。在给定这些值的情况下,已经计算出该群的阶数n,在该曲线的情况下,该群的阶数是素数,并且secp256k1标准还指定了一个点g,该点将被用作该群的生成器。
31.椭圆曲线数字签名算法
32.为了使用私钥a在消息msg中创建签名,需要采取以下步骤:
33.1.计算消息摘要e=hash(msg),其中可以是任何哈希函数。例如,在一些示例中,
hash(msg)=sha256(sha256(msg)),其中sha256(

)是sha-256哈希函数。应当注意的是,相比之下,该消息可以仅进行一次哈希处理,也可以使用相同或不同的哈希函数进行两次以上哈希处理。
34.2.选择一个随机整数k∈{1,

,n-1},其中n是椭圆曲线(例如,secp256k1曲线)的阶数。在下文中,k称为临时私钥。
35.3.计算与该临时私钥对应的临时公钥k
·
g=(r
x
,ry)。
36.4.计算r=r
x mod n。如果r=0,则返回步骤2。
37.5.计算临时密钥的乘法逆k-1 mod n。
38.6.计算s=k-1
(e+ar)mod n。如果s=0,则返回步骤2。
39.7.消息msg中的签名是(r,s)。
40.临时密钥必须保密,否则可以在给定消息和签名的情况下计算私钥。此外,每次生成签名时,必须使用不同的临时密钥。如果情况并非如此,则可以在给定两个不同的签名及其对应消息的情况下导出私钥a。
41.给定消息msg、公钥p=a
·
g和对应的签名(r,s),则可以通过完成以下步骤来验证签名:
42.1.计算消息摘要e=hash(msg),例如e=sha256(sha256(msg))。
43.2.计算以n为模数的s的乘法逆s-1

44.3.计算j1=es-1 mod n和j2=rs-1 mod n。
45.4.计算点q=j1·
g+j2·
p。
46.5.如果(无穷远点),则签名无效。
47.6.如果则使q:=(q
x
,qy),然后计算u=q
x mod n。如果u=r,则签名有效。
48.在阈值签名方案中,该私钥a被分割为在阈值方案群中的参与者之间分发的密钥份额。
49.联合可验证随机秘密共享
50.假设n个参与者想要创建联合秘密,该联合秘密只能由该方案中的至少(t+1)个参与者重新生成。要创建共享秘密,请采取以下步骤:
51.1.参与者就每个参与者的唯一标签i达成一致。每个参与者i生成(t+1)个随机数
[0052][0053]
其中∈r表示集合中随机生成的元素,其中是集合{1,

,n-1}的符号。每个参与者具有t阶秘密多项式
[0054]fi
(x)=a
i0
+a
i1
x+

+a
it
x
t mod n,
[0055]
其中i=1,

,n。应当注意的是,从现在开始省略符号mod n,并且假设对整数的所有算术运算都是以n为模数进行的。
[0056]
2.每个参与者i将该值fi(j)发送给参与者j,例如仅使用与参与者j的安全通信通道。
[0057]
3.每个参与者i根据以下等式计算自己的共享秘密多项式的秘密份额
[0058][0059]
共享秘密份额是采用形式(i,ai)的点,其中i是方案中的参与者标签。如步骤1-3中所述,对于参与者i,这种用于创建秘密份额a的方法在本文中由ai=jvrss(i)表示。应当注意的是,“jvrss”通常表示“联合验证随机秘密共享”,并且还包括步骤4和步骤5。然而,在本文中,jvrss被理解为至少执行步骤1至步骤3,其中步骤4和步骤5是可选步骤。
[0060]
此时,参与者已生成共享多项式,这些参与者中的每个参与者可以验证其他参与者已将正确的信息共享给所有参与者,同时验证所有参与者具有相同的共享多项式。这可以通过以下方式实现。
[0061]
4.每个参与者i将混淆系数广播给所有参与者
[0062]aik
·
g,
[0063]
其中k=0,

,t。
[0064]
5.每个参与者i核实每个参与者j已通过以下方式正确计算多项式点fj(i):计算f
j(i)·
g,然后验证
[0065][0066]
如果所有参与者发现该等式对于每个多项式都成立,则该群可以共同确定他们均已创建相同的共享多项式。
[0067]
重建共享秘密
[0068]
假设参与者想要重建共享秘密a,该共享秘密是共享多项式的零阶。在给定采用以下形式的该多项式上的(t+1)个点的情况下,
[0069]
(1,a1),

,((t+1),a
t+1
),
[0070]
然后,为了找到共享秘密a,需要计算
[0071][0072]
其可根据称为“拉格朗日插值法”的一般公式推导出。
[0073]
公钥计算
[0074]
在给定jvrss的步骤4中共享的n个零阶私有多项式系数公钥a
i0
·
g(其中i=1,

,n)的情况下,每个参与者使用以下等式计算共享公钥p
[0075][0076]
对应于共享秘密a。
[0077]
共享秘密的加法
[0078]
为了计算在一组n个参与者之间共享的两个共享秘密的和,其中每个秘密多项式的阶数为t,而任何实体都不知道各个秘密,请采取以下步骤:
[0079]
1.生成第一共享秘密a,其中参与者i的份额通过ai=jvrss(i)得出,其中i=1,

,n,阈值为(t+1)。
[0080]
2.生成第二共享秘密b,其中参与者i的份额通过bi=jvrss(i)得出,阈值为(t+1)。
[0081]
3.每个参与者i计算自己的加法份额
[0082]
vi=ai+b
i mod n。
[0083]
4.所有参与者将他们的加法份额vi广播给所有其他参与者。
[0084]
5.每个参与者对份额vi中的至少(t+1)个份额进行内插以计算
[0085]
v=interpolate(v1,

,v
t+1
)=a+b。
[0086]
对于参与者i,这种用于将共享秘密相加的方法由addss(i)表示,这会使得每个参与者i知道v=(a+b)。
[0087]
共享秘密的乘积
[0088]
为了计算在一组n个参与者之间共享的两个共享秘密的乘积,其中每个秘密多项式的阶数为t,该组参与者需要采取以下步骤:
[0089]
1.生成第一共享秘密a,其中参与者i的份额通过ai=jvrss(i)得出,其中i=1,

,n。共享秘密多项式的阶数为t,这意味着(t+1)个参与者需要重新创建该共享秘密多项式。
[0090]
2.生成第二共享秘密b,其中参与者i的份额通过bi=jvrss(i)得出,并且共享秘密多项式的阶数再次为t。
[0091]
3.每个参与者使用以下等式计算自己的乘法份额μi[0092]
μi=a
ibi

[0093]
4.所有参与者将他们的乘法份额μi广播给所有其他参与者。
[0094]
5.每个参与者对0处份额μi中的至少(2t+1)个份额进行内插以计算
[0095]
μ=interpolate(μ1,


2t+1
)=ab。
[0096]
对于参与者i,这种用于计算两个共享秘密的乘积的方法在本文中由μ=ab=pross(i)表示。
[0097]
共享秘密的逆
[0098]
为了计算共享秘密a的逆,需要采取以下步骤:
[0099]
1.所有参与者计算共享秘密的乘积pross(i),其结果是μ=ab mod n。
[0100]
2.每个参与者计算μ的模逆,其结果是
[0101]
μ-1
=(ab)-1
mod n。
[0102]
3.每个参与者i通过计算以下内容来计算自己的逆秘密份额
[0103][0104]
对于参与者i,这种用于计算共享秘密的逆的方法由表示。
[0105]
共享私钥生成与验证
[0106]
为了计算n≥2t+1个参与者之间的共享私钥a,其中t+1个参与者需要创建签名,参
与者通过阈值t+1执行jvrss以及执行如上所述的公钥计算。结果是每个参与者i=1,

,n具有私钥份额ai和对应的共享公钥p=(a
·
g)。
[0107]
临时密钥份额生成
[0108]
为了根据签名中的要求生成临时密钥份额和对应的r,大小为n的一组(具有共享私钥a,阈值为(t+1))需要执行以下步骤:
[0109]
1.生成共享秘密的逆份额其中需要(t+1)个份额才能重新创建。
[0110]
2.每个参与者通过以下方式计算
[0111][0112]
使用在验证ki时共享的混淆系数,然后计算
[0113]
r=x mod n。
[0114]
3.每个参与者i存储
[0115]
具有不同阈值的秘密的加法运算
[0116]
在将阶数为t和t

的秘密相加的情况下,计算这两个秘密的和需要max(t,t

)+1个份额。原因在于,共享秘密的份额的加法运算步骤创建了新多项式的份额。这个新的加法多项式等同于两个共享秘密的单独多项式的加法运算结果。将两个多项式相加是将每个阶数x的对应系数相加。因此,加法多项式的阶数必须与两个多项式中的最高阶数相同。这可以推广到将两个以上多项式相加,其中所得到的多项式的阶数与具有最高阶数的单个多项式的阶数相同。
[0117]
一旦计算出具有不同阈值的两个秘密的和,具有较高阈值的秘密的安全性会降低。这是因为,如果现在知道具有相应阈值t和t

的结果(a+b),并且假设t《t

,则可以使用t个份额计算a,然后计算(a+b)-a=b,因此已仅使用t个份额计算值b。该较低阈值在下文中称为b的“隐含阈值”。
[0118]
具有不同阈值的秘密的乘法运算
[0119]
在将具有阈值t和t

的两个秘密相乘的情况下,计算乘积需要t+t

+1个份额。在这种情况下,将两个多项式的份额相乘会得到新多项式的份额。这个新多项式是将两个单独多项式相乘得出的结果,因此该结果的阶数是两个单独多项式的阶数的和。
[0120]
乘法运算还可以推广到任意数量的共享秘密,所得到的阈值是各个阈值加1的总和,即∑
ρ
t
ρ
+1,其中ρ遍历各个共享秘密。
[0121]
与加法运算类似,将具有不同阈值的两个秘密相乘会得到具有较高阈值的秘密的隐含阈值。如前所述,如果知道ab,其中a具有阈值t且b具有阈值t

,并且t《t

,则a和b都可以使用t个份额来计算。首先,可以仅使用秘密的t个份额来计算a,并使用(ab)a-1
求出b。
[0122]
在一个步骤中组合共享秘密的加法运算和乘法运算
[0123]
可以将上述内容概括为在一个步骤中计算加法运算和乘法运算的任意组合。假设一组n个参与者想要计算结果ab+c,其中a、b、c是分别具有阈值(ta+1)、(tb+1)、(tc+1)的共享秘密。条件是max(ta+tb,tc)《n,也就是说,本发明方案中的参与者的数量必须大于秘密c
的阶数与秘密a和b的乘法运算结果的阶数之间的最大值。
[0124]
1.每个参与者i计算其分别具有阈值(ta+1)、(tb+1)、(tc+1)的秘密份额ai=jvrss(i)、bi=jvrss(i)和ci=jvrss(i)。
[0125]
2.每个参与者i计算份额λi=a
ibi
+ci。
[0126]
3.每个参与者i与其他参与者共享结果λi。
[0127]
4.每个参与者对max(ta+tb,tc)+1个份额进行内插,以求出结果λ=int(λ1,

,λi,

)=ab+c。
[0128]
这在根据下面的一些实施例计算共享签名时完成。也就是说,对进行内插。上述用例基本如此,其中且在这种情况下,ta+tb=2t且tc=t,并且插值超过max(ta+tb,tc)+1=2t+1个份额。
[0129]
生成秘密份额
[0130]
图1示出了用于实现本发明的各实施例的示例性系统100。如图所示,系统100包括多方(下文也称为“参与者”)102。图1中仅示出了三个参与者102,但应当理解的是,该系统通常可以包括任意数量的参与者。参与者102中的每一个操作相应的计算设备。
[0131]
相应参与者102的相应计算设备中的每一个包括相应的处理装置,所述处理装置包括一个或多个处理器,例如一个或多个中央处理单元(cpu)、加速器处理器(gpu)、专用处理器和/或现场可编程门阵列(fpga)。相应计算设备还可以包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。存储器可包括一个或多个存储器单元,其采用一个或多个存储器介质,例如诸如硬盘等磁介质、诸如固态硬盘(ssd)、闪存或电可擦可编程只读存储器(eeprom)等电子媒介和/或诸如光盘驱动器等光学介质。相应计算机设备可以包括至少一个用户终端,例如台式电脑或笔记本电脑、平板电脑、智能手机或诸如智能手表等可穿戴设备。替代地或附加地,相应计算设备可以包括一个或多个其他联网资源,例如经由用户终端访问的云计算资源(该云计算资源包括在一个或多个站点实现的一个或多个物理服务器设备的资源)。应当理解的是,被描述为由系统100的一方执行的任何动作可以由该方操作的相应计算设备执行。
[0132]
参与者102中的每一个被配置为通过使用lan或wan连接的互联网或经由替代的有线或无线通信手段将数据传输给其他参与者102中的一个、一些或全部。除非上下文另有要求,否则对传输数据的参与者102的引用可以理解为:例如,经由第一参与者102a与第二参与者102b之间的安全通信通道单独将数据传输给其他参与者102;或者,例如,经由电子邮件或其他手段将数据广播给一组参与者。同样,除非上下文另有要求,否则每个参与者102可以原始形式传输数据,也可以加密形式传输数据。例如,在将数据发送给接收方参与者之前,可以使用该接收方参与者的公钥来加密数据。
[0133]
参与者中的一个、一些或全部具有共享秘密的相应份额(例如,将其存储在存储器中)。具有该共享秘密的份额的参与者将统称为第一组参与者。在一些示例中,参与者中的一个或一些可能不具有该共享秘密的相应份额。例如,参与者的相应份额可能已丢失(例如,存储秘密份额的存储器可能已损坏)或被盗。不具有该共享秘密的份额的参与者将统称为第二组参与者。
[0134]
该共享秘密实际上是数据项,并且从需要该数据项保持私密(即,不可公开访问)的意义上说,该数据项是“秘密”。该共享秘密可以是公钥-私钥对等的共享私钥。以下示例
将该共享秘密称为共享私钥。这些示例还将该共享秘密的份额称为私钥份额。然而,应当理解的是,这些示例只是说明性示例。
[0135]
技术人员将熟悉用于生成私钥的份额(和一般的共享秘密)的技术。
[0136]
优选地,第一参与者102a被配置为使用联合秘密共享方案(jvrss)(例如,使用上述jvrss技术)来生成私钥a的第一私钥份额a1。例如,第一参与者102a可以具有索引1,并且对于参与者1,使用a1=jvrss(1)来生成第一私钥份额,其中该私钥由a表示。每个参与者102可以生成相应私钥份额ai。例如,对于参与者2,第二参与者102b可以使用a2=jvrss(2)来生成第二私钥份额,依此类推。
[0137]
使用联合秘密共享方案生成第一私钥份额a1可以包括:生成一组数字然后生成第一多项式f1(x)=a
10
+a
11
x+

+a
1t
x
t mod n,其中该组数字是多项式的系数。其他参与者102中的每个参与者可以使用相应一组数字来生成相应多项式。例如,第二参与者102b生成第二多项式f2(x)=a
20
+a
21
x+

+a
2t
x
t mod n。然后,参与者102将在每个其他参与者的索引处评估的相应函数的值传输给该其他参与者。例如,第一参与者102a评估第二参与者102b的f1(2),然后将该值传输给第二参与者102b;评估第三参与者102c的f1(3),然后将该值传输给第三参与者102c,依此类推。第一参与者102a获取其他参与者102生成的作为第一参与者的索引的函数的相应值。这些值可以通过互联网或通过其他方式传输。这些值可以通过相应参与者对之间的相应安全通信通道传输。一个或多个参与者102(例如,第一参与者102a)可以广播而不是直接传输他们的相应值。在从至少阈值数量的参与者获取至少阈值数量的值之后,第一参与者102a基于第一值和所获取的每个其他数据值(例如,f2(1)、f3(1)等)来生成第一私钥份额。
[0138]
第一参与者102a可以基于一组混淆系数来计算对应的公钥a
·
g,其中这些系数用于生成每个参与者102的相应私钥份额ai。换言之,生成临时私钥份额ki时,每个参与者102可以与每个其他参与者102共享混淆系数a
ij
·
g。这些系数由所选椭圆曲线上的公共生成点g进行混淆。这些混淆系数可以在参与者102之间直接传输,也可以广播给该组。例如,第一参与者102a可以广播混淆系数a
10
·
g、a
11
·
g、a
12
·
g等。然后,与私钥对应的公钥可以通过以下等式计算
[0139][0140]
应当理解的是,不需要生成对应的公钥来生成私钥份额ai,因此,这是参与者102可以在他们选择的情况下实现的可选特征。
[0141]
应当注意的是,私钥份额ai可以使用替代方法(即,不使用上述jvrss方法)来生成。用于生成私钥的份额的方法本身在本领域中是公知的。类似地,用于分发私钥的份额(或其他此类数据)的方法本身在本领域中是公知的。也就是说,私钥份额ai可以多种方式生成。例如,发起者dealer(例如,参与者102中的可信的一个参与者、或一独立方)可以(例如使用shamir的秘密共享方案来)生成和分发私钥份额ai中的一个、一些或全部私钥份额。wo2017145010a1中描述了可以用于生成和分发私钥份额ai的一种此类方案。
[0142]
无论用于生成私钥份额的具体方法如何,第一组参与者102中的每一个具有(例
如,存储)私钥a的相应私钥份额ai。
[0143]
新方案(即,具有私钥的新份额的方案)的参与者102中的每一个生成共享盲钥的相应盲钥份额。盲钥份额用于混淆或以其他方式“致盲”或“隐藏”另一密钥份额。也就是说,对第一密钥份额应用盲钥份额以隐藏第一密钥份额,使得可以在不泄露第一密钥份额的情况下共享所得到的密钥份额。在不成熟的示例中,第一密钥份额可以是100,并且盲钥份额可以是74,使得能够共享数量174。现在,在不知道盲钥份额为74的情况下,接收方无法确定第一密钥份额。应当理解的是,实际上,密钥份额的数量可能更大。
[0144]
请记住,“密钥份额”和“密钥”是为了清楚起见而使用的,通常可以分别替换为“秘密份额”和“秘密”。在实践中,“份额”和“密钥”的数量很可能较大。这些参与者102(下文称为“新的一组”)可以仅包含第一组参与者中的参与者或第一组参与者和第二组参与者组合中的参与者。
[0145]
优选地,盲钥份额κi可以使用联合秘密共享方案来计算,例如使用上述jvrss技术。例如,第一参与者102a可以具有索引1,并且对于参与者1,使用κ1=jvrss(1)来生成盲钥份额,其中该盲钥由κ表示。每个参与者102可以生成相应盲钥份额κi。例如,对于参与者2,第二参与者102b可以使用κ2=jvrss(2)来生成第二盲钥份额,依此类推。
[0146]
使用联合秘密共享方案生成盲钥κ1包括上述用于生成私钥份额a1的相同步骤,不同之处在于,用于生成盲钥份额κ1的随机数不同于用于生成私钥份额a1的随机数。
[0147]
与私钥份额ai类似,生成盲钥份额κi时,可以使用jvrss的替代方案。
[0148]
至少阈值数量的第一组参与者102(即,具有相应私钥份额ai的参与者)也是新的一组参与者的一部分,这些参与者基于其相应盲钥份额和其相应私钥份额ai来生成中间密钥份额vi。也就是说,中间密钥份额vi是盲钥份额和私钥份额ai的函数。应当注意的是,仅第一组参与者102中的部分参与者102可以生成该中间密钥份额vi,这是因为它取决于私钥份额ai。同样应当注意的是,中间密钥份额vi通常可以是任何秘密份额,具体不限于密钥或私钥。
[0149]
在一些示例中,中间密钥份额vi可以计算为盲钥份额和私钥份额的总和,即vi=ai+κi。然而,不排除中间密钥份额vi可以通过替代方式来计算,例如vi=a
i-κi。
[0150]
已计算出中间密钥份额vi的参与者102将其相应份额vi传输给新的一组参与者中的参与者102中的每一个。中间密钥份额vi可以在多对参与者102之间直接传输,或者通常广播给新的一组参与者102或以其他方式发布。
[0151]
新的一组参与者102中的每一个获取多个中间密钥份额vi。然后,新的一组参与者102中的每一个基于多个中间密钥份额vi来计算中间密钥v。也就是说,中间密钥v是多个中间密钥份额vi中的每一个的函数。例如,新的一组参与者102中的每一个可以对中间密钥份额vi进行内插。
[0152]
然后,在获取中间密钥v之后,新的一组参与者102中的每一个基于中间密钥v和盲钥份额κi来生成私钥a的新份额(例如,更新后的份额)a
′i。也就是说,私钥a的新份额a
′i是中间密钥v和盲钥份额κi的函数。
[0153]
在一些示例中,新的私钥份额a
′i可以计算为中间密钥份额和私钥份额的总和,即a
′i=v-κi。然而,不排除新的私钥份额a
′i可以通过替代方法来计算,例如a
′i=v+κi。
[0154]
通常,通过第一运算对第一秘密份额ai应用第二秘密份额κi以生成中间份额vi,然
后跨中间份额vi内插以生成中间密钥v。然后,对中间密钥v和第二秘密份额κi执行第一运算的逆运算,以求出第一秘密a
′i的新份额。
[0155]
新的一组参与者102中的每一个现在具有私钥的新份额。新的一组参与者102可以包括先前不具有私钥的份额的参与者102(即,新的一组包括第二组中的参与者102)。或者,新的一组可以仅包括第一组参与者102中的参与者102。
[0156]
基于盲份额κi的阈值来确定私钥a的新份额a
′i的阈值。盲份额κi可以具有与私钥份额ai相同的阈值,使得私钥的新份额a
′i的阈值保持相同。或者,盲份额ki可以具有比私钥份额ai更高的阈值,使得私钥a的新份额a
′i的阈值高于先前份额ai的阈值;对于具有较低阈值的盲份额κi,反之亦然。
[0157]“分配issue”新份额时,现在可以通过两种方法来创建共享秘密,即使用旧份额ai或新份额a
′i。如果尝试使用旧份额和新份额的组合,则计算会得出错误份额。因此,只有当每个参与者使用旧份额ai或每个参与者使用其新份额a
′i时,计算才会得出正确份额。更新份额时,其他参与者也可能需要信任元素才能使用其新份额。试图使用旧份额的用户可能被视为攻击者,因此他们在份额更新或重新分配之前被视为攻击者。只要“攻击者”的数量小于本发明方案中的最小阈值(即,更新份额之前和之后的最小阈值),则本发明方案是安全的,因为攻击者可以执行的任何攻击都将被捕获和/或只会导致攻击者被排除在本发明方案之外。因此,不存在攻击本发明方案的动机。唯一的问题在于,攻击者的数量大于阈值,但这并不是新问题,这通常存在于任何共享秘密方案中。
[0158]
图2示出了由本发明方案中的参与者102执行的示例性方法200。该方法可以在份额丢失的情况下使用,或者替代地用于在共享秘密方案中添加或移除参与者102。附加地或替代地,该方法还可以用于更改共享秘密的阈值。要分配新份额a
′i,请采取以下步骤。
[0159]
在步骤s201中,旧方案中的每个参与者已使用jvrss等生成私钥a的份额ai。
[0160]
在步骤202中,新方案中的每个参与者生成具有阈值(t+1)的盲份额ki=jvrss(i)。应当注意的是,可以使用用于生成密钥份额的替代方法。
[0161]
在步骤s203中,具有旧份额ai的至少(t+1)个参与者102分别计算中间秘密份额vi=ai+κi。可以使用私钥份额ai和盲钥份额κi的替代函数。
[0162]
在步骤s204中,这些参与者102将中间秘密份额广播给所有参与者102。
[0163]
在步骤s205中,所有参与者102使用(t+1)个中间份额v=interpolate(v1,

,v
t+1
)=a+κ计算盲秘密。
[0164]
在步骤s206中,每个参与者计算其自己的新秘密份额a
′i=v-κi=(a+κ)-κi。根据步骤s203中使用的函数,可以使用中间密钥v和盲钥份额κi的替代函数。
[0165]
这些新秘密份额可以与旧秘密份额相同的方式使用,并且对其进行的任何计算都将得出旧共享秘密。更新份额的先前方法是简单地添加第二多项式,该第二多项式确实具有次数为零的项,即常数项为零。结果是不会更改定义为零阶项的共享秘密。这意味着在不增加阈值的情况下无法更新阈值为2的私钥,因为无法对具有1阶多项式的秘密执行jvrss,但可以对具有零阶多项式的秘密执行jvrss。
[0166]
通过更新份额,可以通过两种方法提高阈值签名方案的安全性。首先,如果发现份额被泄露,则本发明方案中的参与者102可以立即使用该方法来使该份额无效。或者,执行该方案的一组参与者可以同意间歇性地更新其份额,以便任何攻击者必须在一定时间范围
内攻击多个位置。这意味着随着时间的推移,该方案仍然是安全的。更通俗地说,新方案中的每个参与者可以定期或根据参与者102中的一个的请求执行步骤s202至步骤s206。
[0167]
应当注意的是,在份额丢失的情况下,只有在仍然存在至少(t+1)个已知份额的情况下才有可能重新分配份额。此外,在移除参与者102的情况下,剩余参与者102的数量必须至少为(t+1),或者存在的份额小于创建秘密所需的数量。应当注意的是,除非至少存在(t+1)个参与者,否则无法通过步骤s204,因为无法使用少于(t+1)个份额来计算(a+κ)。将阈值更改为较高阈值时也是如此。也就是说,本发明方案中至少需要该阈值数量。
[0168]
如上所述,可以更改共享秘密a的阈值。图2所示的方法200可以实现为生成同一秘密a的新共享秘密阈值(t

+1),然后参与者102通过以下方法生成具有该阈值的新份额。
[0169]
在步骤s201中,旧方案中的每个参与者已生成私钥a的份额ai,这些份额具有阈值t+1。
[0170]
在步骤s202中,本发明方案中的所有参与者102生成具有阈值(t

+1)的盲份额ki=jvrss(i),并将两个阈值中的较高阈值标记为
[0171]
在步骤s203中,至少个参与者102计算其中间秘密份额vi=ai+κi。可以使用私钥份额ai和盲钥份额κi的替代函数。
[0172]
在步骤s204中,这些参与者102将中间秘密份额广播给所有其他参与者102。
[0173]
在步骤s205中,所有参与者102计算盲秘密
[0174]
在步骤s206中,每个参与者计算其自己的新秘密份额a
′i=v-κi=(a+κ)-κi。根据步骤s203中使用的函数,可以使用中间密钥v和盲钥份额κi的替代函数。
[0175]
这些新秘密份额具有阈值(t

+1),并且对阈值数量的份额进行内插将得出共享秘密a。如果随后将其用于签名计算(例如,如下所述),其中临时密钥具有阈值t,则新签名份额具有阈值t+t

+1。
[0176]
在一些实施例中,可以同时更改私钥a的份额a
′i的数量和私钥a的阈值。
[0177]
应当注意的是,只有在可证明地删除阈值数量的“旧”份额的情况下,才能提高安全性。必须可证明地删除足够的份额,使得剩余的份额数量小于旧阈值。
[0178]
假设秘密具有阈值t+1,并将其增加到t

+1,其中t

》t。假设存在n个份额。然后,为了提高安全性,需要证明剩余的旧份额数量小于t+1,即,本发明方案需要确定仍然存在小于阈值的旧份额。这是因为,在这种情况下,无法使用旧份额来计算秘密。如果仍然存在t+1个旧份额,则安全性仍然为t+1,因为这些份额可以用于计算秘密,即使还存在具有较高阈值的新份额。安全性基于计算秘密所需的最小数量的份额。
[0179]
新方案中的参与者102可以验证新份额a
′i已正确计算。这通过以下方式实现:将与个人秘密对应的公钥相加,并将该公钥和与加法运算结果对应的公钥进行比较。
[0180]
如上述预备知识部分所述,用于生成每个秘密a、κ的方法会产生足够的信息来计算公钥。因此,在计算公钥之后,参与者知道a
·
g,κ
·
g。要验证结果,每个参与者可以执行以下步骤:
[0181]
1.计算(a
·
g)+(κ
·
g);
[0182]
2.使用(a+κ),计算(a+κ)
·
g;
[0183]
3.比较这些结果,以验证它们是相同的。
[0184]
此外,如果参与者102发现错误结果,则可以确定错误份额。为此,参与者102为每个参与者存储ai·
g和κi·
g。然后,由于参与者102知道ai·
g和ki·
g,因此与上述验证相同。参与者还知道ai+κi,由于该份额是用于内插的共享份额,因此对这些值重复相同的步骤1至步骤3。步骤3中得出不相等值的份额是错误份额。
[0185]
如上所述,新份额a
′i可以用作阈值签名方案的一部分。也就是说,新份额a
′i可以是私钥a的私钥份额。本发明可以用于更新签名方案的签名所依据的私钥的参与者份额。可以更改新份额a
′i的数量,和/或可以更改新私钥份额a
′i的阈值。
[0186]
图3示出了用于使用新的私钥份额a
′i来实现阈值最优签名方案(例如,阈值最优ecdsa方案)的示例性系统300。
[0187]
应当注意的是,如果使用旧份额,则生成的签名将与使用新份额生成的签名相同。如图所示,系统100包括多个参与者102,其中包括协调者101和一组参与者102。图3中仅示出了三个参与者102,但应当理解的是,该系统通常可以包括任意数量的参与者。此外,在图1中,协调者101被示为与参与者102不同,但在一些实施例中,协调者101也可以是参与者102中的一个,例如第一参与者102a。上面已结合图1描述了参与者102。
[0188]
应当注意的是,虽然下面描述了使用椭圆曲线加密方案实现的方案,但是在本发明的一般实施例中,该方案可以应用于其他公钥加密方案(例如,rsa)。
[0189]
协调者101是使用一组参与者102中的相应参与者生成的阈值数量的签名份额来发起签名的一方。换言之,协调者101在待签名消息中生成签名。同样,应当注意的是,在消息中生成签名意味着签名依赖于待签名消息,或者换句话说,签名是待签名消息的函数。协调者101还可以是将签名以及(可选地)消息发送给第三方103或以其他方式输出签名的一方。例如,第三方103可以是认证中心或其他形式的机构或其他用户。在其他示例中,例如,签名可以记录在数据库或其他文档中。在一些示例中,签名可以向公众提供,例如,记录在网站或其他可公开访问的媒体上。
[0190]
协调者101可以将待签名消息传输给参与者102。消息可以传输给所有参与者102,也可以传输给参与者的子集(例如,阈值数量的参与者)。在图1的示例中,一组参与者包括三个参与者102a、102b、102c。协调者101可以将消息传输给一个参与者,该参与者然后将消息转发给其他参与者中的一个、一些或全部参与者。
[0191]
消息可以使用lan或wan连接通过互联网传输,也可以通过替代的有线或无线通信方式传输。例如,消息可以通过协调者101与每个参与者102之间的安全通信通道单独地传输给每个参与者102,也可以通过电子邮件或其他方式整体广播给该组参与者。消息可以原始形式或加密形式传输。例如,消息可以进行一次或多次哈希处理。
[0192]
参与者102中的一个或多个参与者可以通过替代方式(即,不从协调者101)获取消息。例如,消息可以由参与者102中的一个参与者生成,或以其他方式(例如,公开)提供。一个或多个参与者102可以从第三方103接收消息。获取消息的参与者102可以将消息(以原始或加密形式)传输给一个或多个其他参与者102。例如,第一参与者102可以将消息传输给第二参与者102b和/或第三参与者102c。
[0193]
协调者101获取(例如,接收)阈值数量的签名份额。在图1的示例中,阈值为2,并且仅第一参与者102a和第二参与者102b决定生成相应的签名份额。例如,生成签名份额的参
与者102中的一个或多个参与者可以(例如)通过安全通信通道将其相应份额直接传输给协调者101。或者,参与者102中的一个或多个参与者可以广播他们的相应份额和/或公开提供他们的份额。如上所述,协调者101也可以是参与者。在这些实施例中,协调者101还可以生成相应的签名份额。从这个意义上来说,获取阈值数量的签名份额中的至少一个意味着生成至少一个签名份额,并且因此协调者101仅需接收比阈值数量少一个的签名份额。
[0194]
为了获取签名份额,协调者101可以在消息中传输对签名份额的请求。例如,协调者101可以将对签名份额的请求传输给一组参与者102中的一个、一些或全部参与者。
[0195]
在获取至少阈值数量的签名份额之后,协调者101使用所获取的份额来生成签名。然后,协调者101可以将签名广播或传输给一个或多个其他实体。附加地或替代地,例如,协调者可以将签名存储在电子邮件或其他文档中和/或将签名作为数字记录的一部分记录在电子邮件或其他文档中。
[0196]
现在将描述用于生成签名份额si的方法。该方法是从第一参与者102a的角度来描述的,但应当理解的是,生成签名份额的每个其他参与者102使用等效方法来生成签名份额,尽管需要使用特定于该其他参与者102的某些数据。
[0197]
每个参与者102可以访问以下数据项:相应的私钥份额a
′i(即,私钥a的份额);相应的临时私钥份额ki;以及基于公共临时公钥k
·
g生成的公共共享值r。公共临时公钥对应于临时私钥,即基于临时私钥生成。这里,从每个参与者可以访问值或密钥的意义上来说,相同的值或密钥可以是公共值或密钥。应当注意的是,除非指定,否则基于第一密钥生成第二密钥并不一定意味着第一密钥本身是已知的。下面提供了关于如何生成这些数据项的示例。
[0198]
第一参与者102a获取或已经有权访问待签名消息。消息可以采用其原始形式(例如,明文),也可以采用加密形式或以其他方式编码(例如,密文)。第一参与者102a可以从协调者和/或从其他参与者102获取消息(采用任一形式)。或者,第一参与者102a可以生成待签名消息。
[0199]
第一参与者102a生成第一签名份额s1。应当注意的是,在该上下文中,“第一”仅用作任意标签以分别区分特定参与者和特定签名份额与其他参与者和签名份额,并且不一定意味着第一参与者102a是生成签名份额si的第一参与者,或者第一签名份额s1是签名份额si的有序列表中的第一签名份额。
[0200]
在一些实施例中,第一签名份额s1可以基于第一消息无关组件(mic)和第一消息相关组件(mdc)来生成(即,作为第一mic和第一mdc的函数),其中,“第一”同样仅用作标签。mic是独立于消息生成的。换言之,mic不是待签名消息的函数(即,mic不是基于该消息生成的),并且不需要知道该消息即可生成mic。相反,mdc是待签名消息的函数,并且需要知道该消息才能生成mdc。
[0201]
在其他实施例中,第一签名可以不是第一消息无关组件(mic)的函数。在这些实施例中,生成第一消息无关组件并将其提供给协调者101,例如,传输给协调者101或广播给一个或多个参与者102。第一消息无关组件(mic)可以在第一签名份额之前并且与第一签名份额分开地与协调者共享。
[0202]
协调者101可以从至少阈值数量的参与者获取相应的消息无关组件(mic),并且基于相应的签名份额(其是相应的消息相关组件(mdc)的函数)和相应的消息无关组件(mic)
来生成签名。下面提供了更多详细信息。
[0203]
由于mic不需要知道消息,因此可以预先计算mic。换句话说,可以在获取消息之前生成mic。因此,可以预先计算多个不同的mic,每个mic用于生成不同的相应签名份额s1′
,以对不同消息进行签名,其中素数(

)指示它是第一签名份额的不同实例。
[0204]
在生成第一签名份额s1之后,第一参与者102a将第一签名份额s1提供给协调者101,用于在消息中生成签名s。如果第一参与者102a是协调者101,则将第一签名份额s1提供给协调者101可能仅意味着将第一签名份额s1输出到用于生成签名s的函数。否则,第一参与者102a可以将第一签名份额s1传输给协调者101,也可以传输给一个或多个其他参与者102以转发给协调者101,或者广播第一签名份额s1,或者使用这些选项的组合。
[0205]
如上所述,第一签名份额s1可以基于第一mic和第一mdc生成。无论第一签名份额是否为第一mic的函数,第一mic都是基于第一私钥份额a1(即,第一参与者102a已知的私钥a的份额)生成的(即,充当第一私钥份额的函数)。第一mic还可以基于第一临时私钥份额k1(即,第一参与者102a已知的临时私钥k的份额)和共享值r,该共享值是基于与临时私钥k对应的临时公钥k
·
g生成的。第一mdc是基于消息(采用原始或加密形式)生成的(即,充当消息的函数),并且还可以是基于第一临时私钥份额k1生成的。下面提供了mic和mdc的变体。
[0206]
第一临时私钥份额k1可以使用联合秘密共享方案,例如使用上述jvrss技术来计算。例如,第一参与者102a可以具有索引1,并且对于参与者1,使用k1=jvrss(1)来生成第一临时私钥份额,其中该临时私钥由k表示。每个参与者102可以生成相应的临时私钥份额ki。例如,对于参与者2,第二参与者102b可以使用k2=jvrss(2)来生成第二临时私钥份额,依此类推。
[0207]
使用联合秘密共享方案生成第一临时私钥份额k1包括上述用于生成第一私钥份额a1的相同步骤,不同之处在于,用于生成临时私钥份额k1的随机数不同于用于生成私钥份额a1的随机数。
[0208]
应当注意的是,相同的私钥a和私钥份额ai用于每个签名,而临时私钥k和临时私钥份额ki会针对每个签名进行更改(或更确切地说,它们是随机生成的,因此不太可能相同,而不是有意选择为不同)。
[0209]
共享值r是基于与临时私钥k对应的临时公钥k
·
g生成的。临时公钥(x,y)包括两个组件,通常称为x和y组件。共享值r可以是临时公钥的x组件的函数,例如r=x mod n。
[0210]
临时公钥k
·
g可以基于一组混淆系数来生成,其中这些系数用于生成每个参与者102的相应临时私钥份额ki。换言之,生成临时私钥份额ki时,每个参与者102与每个其他参与者102共享混淆系数k
ij
·
g。这些系数由所选椭圆曲线上的公共生成点g进行混淆。这些混淆系数可以在参与者102之间直接传输,也可以广播给该组。例如,第一参与者102a可以广播混淆系数k
10
·
g、k
11
·
g、k
12
·
g等。然后,临时公钥可以通过以下等式计算
[0211][0212]
在一些实施例中,第一mic是基于与第一临时私钥份额k1对应的第一逆份额生成的。换言之,第一逆份额是第一临时私钥份额k1的函数。
[0213]
第一逆份额可以是(例如)通过针对参与者1计算生成的共享秘密的逆。如上所述,计算共享秘密的逆包括计算共享秘密的乘积。第一参与者102a生成中间值μ,作为第一临时私钥k和第一盲钥α的乘积。例如,对于参与者1,中间值可以通过μ=kα=pross(1)计算,其结果为μ=kα mod n。
[0214]
这可以涉及每个参与者102生成乘法份额μi=kiαi,其中αi是第一盲钥α的份额。每个参与者102可以使用联合秘密共享方案,例如使用上述jvrss技术来计算第一盲钥α的相应份额αi。例如,第一参与者102a可以具有索引1,并且对于参与者1,使用α1=jvrss(1)来生成第一盲钥的份额。每个参与者共享(例如,通过直接传输或广播)相应的乘法份额μi,然后基于每个乘法份额μi(例如,通过内插)来生成中间值μ。第一逆份额可以通过计算中间值μ的逆来生成。例如,第一参与者102a可以计算μ的模逆,其结果为
[0215]
μ-1
=(kα)-1 mod n。
[0216]
然后,第一参与者102a可以基于中间值的模逆μ-1
和相应的第一盲钥份额α1来计算第一逆份额例如通过计算
[0217][0218]
应当注意的是,盲钥份额αi的使用是可选的,并且可以从上述步骤中省略。
[0219]
可选地,mic可以基于第二盲钥β的份额(即,第二盲钥份额的函数)生成。换言之,除上述数据项之外,mic还基于第二盲钥β的第一份额β1。第二盲钥的第一份额可以使用联合秘密共享方案,例如使用上述jvrss技术来计算。例如,第一参与者102a可以具有索引1,并且对于参与者1,使用β1=jvrss(1)来生成第二盲钥的第一份额,其中该第二盲钥由β表示。
[0220]
mic可以基于第一预签名份额σ1生成,该第一预签名份额是从至少阈值数量的参与者102获取的第一中间份额λ1和相应中间份额λi的函数。换言之,参与者102中的每个参与者可以生成相应的中间份额λi,并将这些中间份额λi传输和/或广播给其他参与者102。第一参与者102a可以收集中间份额λi以生成公共中间值λ,例如通过对中间份额λi进行内插。第一参与者102a(以及可选地,其他参与者102)可以生成多个预签名份额σ1′
,每个预签名份额用于生成不同的签名份额s1′

[0221]
第一中间份额λ1可以是新的第一私钥份额a
′i和第一逆份额的函数。在这种情况下,至少阈值数量的参与者102中的每个参与者生成并共享相应的中间份额λi,该相应的中间份额是相应的私钥份额a
′i和相应的逆份额的函数。
[0222]
或者,第一中间份额λ1可以是第一私钥份额a
′i和第一盲钥α1的第一份额的函数。在这种情况下,至少阈值数量的参与者102中的每个参与者生成并共享相应的中间份额λi,该相应的中间份额是相应的私钥份额a
′i以及第一盲钥α1的相应份额的函数。
[0223]
在一些实施例中,第一预签名份额σ1也可以基于第二盲钥的第一份额β1生成。例如,第一中间份额λ1可以是第二盲钥的第一份额β1的函数。在附加或替代实施例中,第一中间份额λ1也可以是公共值r的函数。
[0224]
图4示出了根据本发明各实施例的用于在消息中生成签名的示例性方法400。步骤s401至步骤s408由该示例中阈值数量的参与者102中的每个参与者(包括第一参与者102a)
执行。步骤s409由协调者101执行,该协调者也可以是执行步骤s401至步骤s408的参与者中的一个参与者。应当理解的是,这些步骤中的一些步骤可以省略,也可以按照不同的顺序执行。
[0225]
示例性方法400使得能够在一组n≥2t+1个参与者中创建阈值为(t+1)的共享秘密,其中签名阈值也是(t+1)。
[0226]
设置:
[0227]
在步骤s401中,每个参与者102计算共享私钥份额和对应的公钥。私钥份额a
′i的生成已在前文描述过。此时,每个参与者i具有秘密密钥份额和公钥(a
′i,p),其中p是与共享私钥对应的公钥的符号。共享私钥的阈值为(t+1)。
[0228]
预先计算:
[0229]
在步骤s402中,每个参与者102计算共享临时密钥份额和对应的公钥。例如,每个参与者102可以使用jvrss和预备知识部分给出的公钥计算来计算共享临时密钥。然后,每个参与者102可以基于临时私钥来计算逆份额。这会导致每个参与者具有逆份额阈值为(t+1)。
[0230]
在步骤s403中,每个参与者102创建两个不同的共享盲钥份额。例如,每个参与者102可以创建两个共享秘密,使得参与者i具有份额αi=jvrss(i)和βi=jvrss(i),每个共享秘密的阈值为(t+1)。应当注意的是,在一些示例中,并不是所有共享秘密都需要具有相同的阈值。
[0231]
在步骤s404中,每个参与者102计算中间份额,并将其中间份额广播给其他参与者。例如,每个参与者i可以计算中间份额该值的阈值为(2t+1)。
[0232]
在步骤s405中,每个参与者102至少基于中间份额来计算中间值。例如,每个参与者102可以通过对(2t+1)个份额λ=interpolate(λ1,


2t+1
)=k-1
a+β进行内插来计算中间值。
[0233]
在步骤s406中,每个参与者102计算预签名份额。例如,每个参与者i可以计算他们的预签名份额σi=λ-βi=(k-1
a+β)-βi。每个参与者102可以存储私钥份额和对应的公钥(a
′i,p)。
[0234]
应当注意的是,由于每个签名使用不同的临时密钥,因此可以一次设置多个临时密钥,即,可以重复步骤s402至步骤s406以在预先计算过程中创建多个临时密钥,并存储它们以供后续使用。这些操作可以同时执行,因此不需要额外的通信轮次。应当注意的是,优选地,应为每个签名使用不同的α和β值。
[0235]
签名生成:
[0236]
为了对消息msg进行签名,至少(t+1)个参与者必须执行步骤s407和步骤s408。
[0237]
在步骤s407中,至少阈值数量的参与者102获取待签名消息并计算消息摘要(message digest)。例如,协调者101可以将请求发送给(t+1)个参与者,以在消息msg中创建签名份额。每个参与者i可以计算消息摘要e=hash(msg)。在一些示例中,该哈希函数是双sha-256哈希函数。可以使用替代的哈希函数。
[0238]
在步骤s408中,至少阈值数量的参与者102计算签名份额并将其发送给协调者
101。例如,每个参与者i可以计算他们的签名份额然后将他们的签名份额(r,si)发送给协调者。应当注意的是,该值r可能不是由所有参与者发送的。
[0239]
在步骤s409中,协调者101计算签名。例如,协调者101可以计算s=interpolate(s1,

,s
t+1
)=k-1
(e+ar),最终计算签名(r,s)。
[0240]
有几种替代方案用于预先计算签名份额的消息无关组件。这些方案大致可以分为两组变体:何时将r纳入计算中;以及何时纳入(kα)-1
。这些方案可以彼此独立地选择,因此上述方法400有八种变体。
[0241]
一种修改是在步骤s406中存储这意味着将r包括在预签名份额中。另一种修改是还可以在计算中间份额过程中提前与r相乘。通过转为在步骤s404中定义在步骤s406中,σi=λ-βi=(rk-1
a+β)-βi,并且签名份额的计算为
[0242]
另一种修改是转为计算λi=α
ia′i+βi,使得λ=(kα)-1
(αa+β),并且σi=λ-(kα)-1
βi。在替代点处包括r的两种变体可以与此相结合。每个参与者都知道kα,因为它是在预先计算的步骤s402中计算的。此外,所有参与者102广播其λi份额。因此,每个参与者102知道(至少)2t+1个份额和值kα。然后,计算
[0243]
λ=(kα)-1
×
interpolate(λ1,....,λ
2t+1
)。
[0244]
另一种修改是转为将中间值计算为λ=(αa+β),并且将预签名份额计算为σi=λ-βi。最后,签名份额将是关于何时将r纳入计算中的两种变体也可以与此相结合。每个参与者102通过计算获悉kα。然后,他们可以据此计算(kα)-1 mod n,然后将其纳入si的计算中。
[0245]
综上所述,每个参与者102可以生成四个秘密共享:a
′i,ki,αi,βi。在示例性方法400中,需要计算两个乘积:kα,该乘积随后用于计算(对这些份额进行内插可得出k-1
,因为α将被取消);k-1
a,用于签名中,该签名使用第一乘积,因此如果份额扩展,则计算结果得出对份额(由kα和αi组成)进行的任何计算都可以通过先对αi本身进行计算,然后在必要时乘以(kα)-1
来完成。
[0246]
上述方案的一个版本可以概括如下:使用由消息无关组件(mic)和消息相关组件(mdc)组成的份额来计算签名,其中,mic可以基于预签名份额σi,mdc基于消息e。
[0247]
一种等效方案包括如上所述计算mic,然后将其与签名份额一起并入签名中,例如在对仅由mdc组成的签名份额进行内插之后。显然,该方案在预先计算的步骤s406之前可以是相同的,其中,中间份额包括r值使得在内插之后为λ=k-1
ar+β。
[0248]
在该阶段,参与者知道并将其与私钥份额和对应的公钥(a
′i,p)一起存储。
[0249]
然后,为了在给定消息m中生成他们的签名份额,其中该消息经哈希处理以创建消息摘要e=hash(m),参与者计算
[0250]
[0251]
并将其发送给协调者。然后,协调者计算
[0252]
s=interpolate(s1,

,s
t+1
)+λ,
[0253]
=k-1
e+k-1
ar,
[0254]
从而得出预期的签名份额,因为β项会取消。该协议的类似变体可以如上所述描述何时将(kα)-1
和r纳入计算中。
[0255]
可以实现用于计算消息无关组件的以下变体:
[0256]
i)计算k=k-1
a+β,则签名份额现在为并通过以下等式生成签名s=int(s1,

,s
t+1
)+rλ。
[0257]
ii)计算λ=αar+β,则签名份额现在为si=αie-βi,并通过以下等式生成签名s=(kα)-1
(int(s1,

,s
t+1
)+λ)。
[0258]
iii)计算λ=αa+β,则签名份额现在为并通过以下等式生成签名s=(kα)-1
(int(s1,

,s
t+1
)+rλ)。
[0259]
iv)计算λ=αar+β,则签名份额现在为并通过以下等式生成签名s=(int(s1,

,s
t+1
)+(kα)-1
λ)。
[0260]
v)计算λ=αa+β,则签名份额现在为并且通过以下等式生成签名s=(int(s1,

,s
t+1
)+r(kα)-1
λ)。
[0261]
应当注意的是,秘密的阈值可以不同。换言之,执行签名生成方案时,a、k、α、β本身的阈值不必相同。例如,如果有六个人组成的一组,并且三个人需要创建签名和/或私钥,则从技术上讲,他们可以在k的阈值为4且其他共享秘密的阈值为3的情况下进行计算,并且他们将仍然拥有阈值最优方案。
[0262]
应当注意的是,本发明可以应用于任何阈值签名方案(无论是最优还是非最优),并且不限于上述具体方案。
[0263]
一般而言,本发明的实施例可以用于在任何消息中生成签名。作为特定示例性用例,消息可以是区块链事务(transaction)的一部分或全部。换言之,签名可以用于对区块链事务的一个或多个输入和/或一个或多个输出进行签名。例如,所生成的签名可以至少部分地用于解锁区块链事务的输出。作为特定示例,先前事务的输出可以是支付到公钥哈希(p2pkh)输出,该输出锁定到公钥哈希。为了解锁,引用p2pkh输出的后续事务的输入需要包括(未经哈希处理的)公钥以及基于与公钥对应的私钥生成的签名。
[0264]
脚本中表示的“锁定脚本locking script”和“解锁脚本unlocking script”可以采取以下形式:
[0265]
locking script=op_dup op_hash160《public keyhash》op_equal op_checksig
[0266]
unlocking script=《signature》《public key》
[0267]
参考上述实施例,《public key》可以等同于p=a
·
g,并且《signature》包括阈值签名s,其中上一个事务是待签名消息。应当注意的是,如上所述,ecdsa签名采用(r,s)形式。
[0268]
本发明可以用于更改能够生成签名份额的参与者,并且因此可以更改必须一起解锁资金(即,解锁区块链事务的输出)的参与者。附加地或替代地,本发明可以用于增加解锁资金所需的参与者的数量。
[0269]
应当注意的是,所描述的签名生成方法并不限于任何特定用例,并且通常可以用于基于任何消息来生成签名。对区块链事务的全部或部分进行签名仅是一个说明性示例。例如,所描述的方法可以用于签署和/或授权法律文档(例如,遗嘱、契据或其他合同)、一方或多方之间的通信、数字证书(例如,由认证中心颁发)、医学处方、银行转账或金融工具、抵押或贷款申请等。
[0270]
作为一个特定示例,一组参与者(假设总共五个参与者)可以组成一家公司的董事会。公司的投票事项可能需要董事会的大多数成员(即,至少三个参与者)就特定投票达成一致。董事会可以使用所描述的签名生成方法来证明至少有三名董事会成员同意投票赞成某个特定结果。在该示例中,签名生成方案的阈值为3。换言之,至少三名董事会成员必须提供相应签名份额,以便协调者成功生成签名。如果签名成功生成,则至少阈值数量(即,三名)的董事会成员同意投票赞成该结果。因此,签名的成功生成作为投票记录,并证明董事会的大多数成员以特定方式投票。
[0271]
本发明可以用于更改能够对此类事项进行投票的人员,和/或增加或减少成功决定投票结果所需的票数(即,份额)。
[0272]
本发明的另一个用例涉及数字证书(例如,根据x.509标准颁发的数字证书)领域。数字证书包含对某些数据进行签名的签名。数据通常可以是任意数据,但数字证书中包含的数据的一个特定示例是公钥。数字证书中的公钥通常称为“认证公钥”。数字证书的发行者(“认证中心”)可以对公钥的所有者执行一次或多次检查(例如,了解客户检查),并且如果检查成功,则认证中心颁发包括认证公钥的数字证书。用户可以使用认证公钥来证明自己便是他们所称的身份,例如,通过使用与认证公钥对应的私钥对消息进行签名。
[0273]
认证中心的一种特殊用途是对https中使用的证书进行签名,以便在互联网上安全浏览。另一种常见用途是国家政府签发身份证,用于以电子方式签署文档。认证中心使用私钥对公钥(或任何其他待证明数据)进行签名。本发明可以用于更改具有私钥的份额的参与者。私钥的安全性还可以通过提高私钥的阈值来提高。
[0274]
本发明背后的原则是一组参与者基于相应盲份额来生成共享秘密的新份额。盲份额使得具有共享秘密的旧份额的参与者能够将旧份额的盲(即,模糊)版本以“中间份额”的形式分发给“新的”一组参与者。组合(或以其他方式内插)中间份额以形成中间份额,该组参与者中的每一个可以根据该中间份额应用(例如,减去或加上)他们的盲份额以获取其相应共享秘密的新份额。虽然本发明主要根据ecc实现方式进行了描述,但是本发明同样适用于其他实现方式(例如,rsa)。
[0275]
应当理解,上述实施例仅通过示例的方式进行描述。更一般地说,可根据下述任何一个或更多个语句提供一种方法、装置或程序。
[0276]
语句1.一种生成共享秘密的份额的计算机实现的方法,其中一组参与者中的每一个具有所述共享秘密的相应第一秘密份额,其中所述方法由所述一组参与者中的第一参与者执行并且包括:
[0277]
生成共享盲秘密的相应盲份额;
[0278]
从所述第一组参与者中的每一个获取至少阈值数量的相应中间份额,其中每个相应中间份额是基于相应盲份额和相应第一秘密份额生成的;
[0279]
基于每个所获取到的中间份额来生成中间值;以及,
[0280]
生成所述共享秘密的相应第二秘密份额,其中所述相应第二秘密份额是基于所述中间值和所述相应盲份额生成的。
[0281]
语句2.根据语句1所述的方法,其中所述相应中间份额中的第一相应中间份额由所述第一参与者生成。
[0282]
语句3.根据语句1或2所述的方法,其中所述共享秘密的阈值等于所述共享盲秘密的阈值。
[0283]
换句话说,所述第二秘密份额的阈值与所述第一秘密份额相同。
[0284]
语句4.根据语句1或2所述的方法,其中所述共享秘密的阈值不同于所述共享盲秘密的阈值。
[0285]
也就是说,所述第二秘密份额的阈值不同于所述第一秘密份额。
[0286]
语句5.根据语句4所述的方法,其中所述共享秘密的所述阈值大于所述共享盲秘密的所述阈值。
[0287]
语句6.根据语句4所述的方法,其中所述共享秘密的所述阈值小于所述共享盲秘密的所述阈值。
[0288]
语句7.根据前述任一项语句所述的方法,其中所述共享盲秘密的所述相应盲份额是使用联合可验证秘密共享方案生成的。
[0289]
语句8.根据语句7所述的方法,其中使用所述联合秘密共享方案生成所述相应盲份额包括:
[0290]
生成第一数据项,所述第一数据项是第一多项式;
[0291]
从至少所述阈值数量的参与者获取相应数据项,每个相应数据项是由相应参与者生成的相应多项式;以及,
[0292]
基于所述第一数据项和每个所述相应数据项来生成所述相应盲份额。
[0293]
语句9.根据语句7或8所述的方法,其中获取所述相应数据项包括:通过所述第一参与者与所述阈值数量的参与者中的每一个参与者之间的相应通信通道获取所述相应数据项。
[0294]
语句10.根据语句7至9中任一项所述的方法,所述方法包括:将所述第一多项式的相应实例传输给至少所述阈值数量的参与者中的每一个,其中所述第一多项式的所述相应实例基于相应参与者。
[0295]
语句11.根据语句1至7中任一项所述的方法,其中所述共享盲秘密的所述相应盲份额是使用shamir的秘密共享方案生成的。
[0296]
语句12.根据前述任一项语句所述的方法,其中所述共享秘密的所述相应第一秘密份额是使用联合可验证秘密共享方案生成的。
[0297]
语句13.根据语句1至11中任一项所述的方法,其中所述共享秘密的所述相应第一秘密份额是使用shamir的秘密共享方案生成的。
[0298]
语句14.根据前述任一项语句所述的方法,其中所述共享秘密是私钥,所述相应第二秘密份额是所述私钥的相应私钥份额。
[0299]
语句15.根据语句14所述的方法,其中所述共享盲秘密是盲私钥,所述中间值是中间私钥,并且其中所述方法包括:
[0300]
生成与所述私钥对应的第一公钥;
[0301]
生成与所述盲私钥对应的第二公钥;
[0302]
生成与所述中间私钥对应的第三公钥;
[0303]
基于所述第一公钥和所述第二公钥来生成第一值;以及,
[0304]
基于所述第一值是否与所述第三公钥匹配来验证所述共享秘密的所述第二秘密份额已正确生成。
[0305]
语句16.根据语句15所述的方法,所述方法包括:
[0306]
响应于确定所述第二秘密份额未正确生成,对其他相应参与者中的一个、一些或全部执行以下步骤:
[0307]
获取与所述参与者的所述相应第一秘密份额对应的相应第一公钥;
[0308]
获取与所述参与者的所述相应盲份额对应的相应第二公钥;
[0309]
获取与所述参与者的所述相应中间份额对应的相应第三公钥;
[0310]
基于所述参与者的所述相应第一公钥和所述相应第二公钥来生成相应第一值;以及,
[0311]
基于所述相应第一值是否与所述相应第三公钥匹配来验证所述共享秘密的所述相应第二秘密份额已由所述参与者正确生成。
[0312]
语句17.根据语句14至16中任一项所述的方法,所述方法包括:
[0313]
获取消息;以及,
[0314]
基于所述消息和所述私钥的所述相应份额来生成数字签名份额。
[0315]
语句18.根据语句14至16中任一项所述的方法,所述方法包括:
[0316]
获取消息;
[0317]
生成第一消息无关组件和第一消息相关组件,其中所述消息无关组件是基于所述相应私钥份额生成的,并且其中所述消息相关组件是基于所述消息生成的;
[0318]
使得所述第一消息无关组件能够提供给协调者;以及,
[0319]
使得第一签名份额能够提供给所述协调者,以用于基于至少所述阈值数量的签名份额来生成所述签名,其中所述第一签名份额至少包括所述消息相关组件。
[0320]
语句19.一种计算机设备,所述计算机设备包括:
[0321]
存储器,所述存储器包括一个或多个存储器单元;以及,
[0322]
处理装置,所述处理装置包括一个或多个处理单元,其中所述存储器存储被设置在所述处理装置上运行的代码,所述代码被配置为当在所述处理装置上运行时,执行根据语句1至18中任一项所述的方法。
[0323]
语句20.一种计算机程序,所述计算机程序包含在计算机可读存储器上并且被配置为当在计算机设备上运行时,执行根据语句1至18中任一项所述的方法。
[0324]
根据本文公开的另一方面,可提供一种方法,所述方法包括各参与者的动作。
[0325]
根据本文公开的另一方面,可提供一种系统,所述系统包括各参与者的计算机设备。
[0326]
一旦给出本文的公开内容,所公开技术的其他变体或用例对于本领域技术人员可能变得显而易见。本公开的范围不受所描述的实施例限制,而仅受随附权利要求限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1