一种用于向消息提供数字签名的方法与流程

文档序号:26948008发布日期:2021-10-15 23:02阅读:179来源:国知局
一种用于向消息提供数字签名的方法与流程

1.本发明涉及一种按照数字签名算法(dsa)或椭圆曲线数字签名算法(ecdsa)向消息提供数字签名的方法。按照本发明,使用多方阈值dsa或ecdsa协议来生成数字签名。


背景技术:

2.数字签名可用于确保在线发送的数据的完整性,用于在线的数据和/或实体的认证等。通过使用作为多个参与方之间的秘密共享而生成的秘密签名密钥,每一方都持有一定份额(share)的秘密签名密钥,而不是允许单一参与方持有整个秘密签名密钥,降低了签名系统受到损害的风险。这种方案有时被称为“多方签名方案”。在多方签名方案中,即使某些参与方不可用、被破坏或受到损害,仍有可能生成数字签名。在不违反安全性的情况下可以容许的被破坏方的最大数量有时被称为方案的安全阈值,可以用

t’表示。
3.数字签名算法以前已用于生成数字签名。一个例子是dsa标准。它设计由素数阶q的循环群g和生成元g∈g以及两个函数h:{0,1}
*

z
q
和f:g

z
q
参数化的签名方案。秘密签名密钥x随机地选自z
q
,对应的公共验证密钥被计算为y=g
x
.为了对消息m签名,首先选择随机的随机数k∈z
q
,然后将签名计算为(r,s),其中r=f(g
k
),s=k
‑1·
(h(m)+r
·
x)。已知公共验证密钥y和签名(r,s),通过计算m=h(m)和检查r=f(g
m/s
·
y
r/s
),可以验证签名。
4.另一个例子是ecdsa标准,它定义了基本上以与dsa相同的方式工作的签名方案,不过其中g改为由椭圆曲线上的点g产生。应用椭圆曲线密码学的数字签名算法通常被称为椭圆曲线数字签名算法或ecdsa,以前已用于生成数字签名。已知这样的算法适合于提供可靠的数字签名。
5.在描述dsa时通常使用乘法表示法,但是对于ecdsa使用加法表示法。这里,我们将使用乘法表示法,即使我们的方法可以应用于dsa和ecdsa两者。即,对于群g中的元素a,b,我们将使用a
·
b,或者仅仅ab来表示应用于这两个元素的群运算。对于域z
q
中的元素的计算假设在该域内发生,即,当我们写下r
·
x或m/s时,约减模数q是隐含的。
6.wo 2015/160839a1公开了一种用于分布式生成基于椭圆曲线数字签名算法(ecdsa)的数字签名的系统和方法,其中在客户端和一组n个服务器之间初始化秘密共享协议,以在该组n个服务器之间共享私钥的份额集合。该组服务器初始化协议,以使用私钥的份额集合在消息上生成数字签名,而无需重构或透露私钥。n个服务器中的阈值t(最高可达n/2(即t≤n/2))可以被恶意地和完全地破坏或损害,而不会损害私钥的机密性或生成的签名的正确性。
7.在wo 2015/160839a1中公开的系统和方法需要大量轮次的交互以便生成数字签名。此外,该系统和方法需要高处理能力和通信带宽。
8.rosario gennaro等人的:“robust threshold dss signatures”,information and computation,164卷,第54

84页(2001))公开一种用于使用多方阈值签名方案来提供数字签名的方法。在该文中描述的协议应用多项式插值,并且当参与方的数量n大于或等于3t+1时,对多达t个恶意对手是鲁棒的和不可伪造的。因此,为了容许1个恶意对手,参与方
的数量应当至少为4。此外,该方法需要大量轮次的交互以便生成数字签名。


技术实现要素:

9.本发明的实施例的一个目的是提供一种用于提供基于多方dsa或ecdsa的数字签名的方法,其中在不损害机密性的情况下,减少了生成数字签名所需的交互轮次的数量。
10.本发明的实施例的再一个目的是提供一种用于提供基于多方dsa或ecdsa的数字签名的方法,其中在不损害机密性的情况下,降低了对处理能力的要求。
11.本发明的实施例的又一个目的是提供一种用于提供基于多方dsa或ecdsa的数字签名的方法,其中在不损害机密性的情况下,降低了对通信带宽的要求。
12.本发明的实施例的另一个目的是提供一种用于提供基于多方dsa或ecdsa的数字签名的方法,所述方法能够容许多达t个参与方被恶意破坏,其中t>n/3。
13.本发明提供一种用于按照数字签名算法dsa或椭圆曲线数字签名算法ecdsa向消息m提供数字签名的方法,所述方法包括以下步骤:
14.‑
提供q阶的循环群g的生成元g、函数f和函数h,其中g∈g,g、g、f和h由dsa或ecdsa指定,
15.‑
生成秘密密钥x作为至少两个参与方之间的随机秘密共享[x],
[0016]

在所述至少两个参与方之间生成随机秘密共享[a]和[k],并计算[w]=[a][k],
[0017]

在不透露k的情况下,计算值r为r=g
k

[0018]

通过验证r=g
k
是根据源自诚实参与方的[k]的至少t+1个份额计算的,确保r是正确的,
[0019]

在不透露a或k的情况下,通过计算r
a
,计算认证元w为w=g
ak

[0020]

通过验证w=r
a
是根据源自诚实参与方的[a]的至少t+1个份额计算的,确保w是正确的,
[0021]

通过检查是否g
w
=w,验证[w],以及
[0022]

通过计算[k
‑1]=[a]
·
w
‑1,计算[x
·
k
‑1]=[x]
·
[k
‑1],并且作为m、r、[k
‑1]和[x
·
k
‑1]的函数,生成所述至少两个参与方之间的共享[s],对消息m签名。
[0023]
从而,本发明的方法是用于向消息m提供基于dsa或基于ecdsa的数字签名的方法。按照本发明的方法应用的数字签名例如可以用于确保发送方的真实性,用于确保发送的数据的完整性,例如在在线金融交易期间等。
[0024]
按照本发明的方法,首先提供q阶的循环群g的生成元g、函数f和函数h。生成元g是循环群g的元素,即,g∈g。循环群g、生成元g以及函数f和h都由dsa或ecdsa指定,从而一旦确定了要使用哪种特定的dsa或ecdsa,这些就被定义了。
[0025]
接下来,生成秘密密钥[x],作为至少两个参与方之间,比如至少三个参与方之间的随机秘密共享。在本上下文中,术语“秘密共享”应当被解释为意味着秘密密钥以如下方式分布在至少两个参与方之间,即每一方持有一定份额的秘密密钥,并且没有任何一方拥有整个秘密密钥。因而,本发明的方法适用于多方系统。因此,没有一方构成单一信任点,并且几个参与方,即至少t+1个参与方,需要恶意串通才能获得对整个秘密密钥的访问。这提高了系统的安全性,特别是在机密性方面。
[0026]
秘密共享方案的例子是加法共享。当每一方p
i
持有随机份额x
i
,使得x=x1+x2+...
+x
n
时,秘密x被认为是在n个参与方p1、p2、...、p
n
之间加法共享的。加法共享具有阈值t=n

1,因为重构秘密需要所有n个份额,即重构x需要所有n个参与方的协作,尽管拥有多达除一份之外的所有份额也不允许x的重构。另一个例子是shamir共享方案。这里,当每一方p
i
持有受f(0)=x约束的随机多项式f的值f(i)作为其份额时,秘密x被共享。shamir共享的程度被定义为多项式f的次数(degree)。如果这个次数是t,那么任何t+1方都可以通过使用多项式插值,将他们的份额重新组合成秘密,而t个或更少的参与方的任何子集所持有的份额都不透露关于x的任何信息。
[0027]
在本上下文中,术语

随机秘密共享’应当被解释为其中份额是随机选择的,使得共享的秘密也是随机值的秘密共享。对于加法共享,这意味着份额是完全随机的。对于具有阈值t的shamir共享,意味着份额是随机的t次多项式上的点。
[0028]
在整个本公开中,置于方括号

[]’中的字母表示元素在多个参与方之间的共享。不带方括号的相同字母代表整个元素。从而,例如

x’表示整个秘密密钥,而[x]表示秘密密钥x的秘密共享。
[0029]
可以在不透露秘密的情况下对秘密共享进行计算。这是研究领域

安全多方计算’的主题。对于大多数类型的秘密共享,各个参与方可以容易地计算两个秘密共享的总和,即,已知[x]和[y],他们可以在不透露x或y的情况下计算共享[x+y]。类似地,如果所有参与方同意公共常数c,则他们可以容易地从c和[x]计算共享[c
·
x]而不透露x。我们将对这些运算使用表示法[x]+[y]和c
·
[x]。
[0030]
还可以从[x]和[y]计算乘积[xy]。当多达给定安全阈值(t)的参与方可能恶意串通时,在不透露x和y的情况下这样做是可能的,但是通常困难并且低效。因此,对于两个随机共享[x]和[y],有时使用

弱’乘法表示法。在只要至多t个参与方是恶意的,关于x和y的信息就不会泄露的意义上,弱乘法保证了机密性。但是弱乘法不保证结果的正确性。相反,只在当所有参与方都行为正确时,它才只计算正确的结果[xy]。单个恶意方就可以例如破坏结果,使得作为结果的共享[z]不是xy的共享。在下文中,为了简化起见,除非另有说明,我们使用表示法[z]=[x][y]来表示弱乘法。
[0031]
例如,只要安全阈值t满足t<n/2,就可以为shamir共享构建弱乘法。对于较大的阈值,即,直到最大阈值t=n

1,例如,通过将诸如paillier加密方案之类的加法同态加密方案与所谓的零知识证明相结合,对于加法共享可以获得弱乘法。弱乘法的这种构建的例子可以在安全多方计算研究文献中找到。
[0032]
参与方例如可以采取物理上彼此分离的独立服务器的形式。在一方可用的信息对其它参与方来说不可用的意义上,参与方优选是分开的或独立的。不过,只要t+1个或更多参与方的子集不拥有所有信息,就不排除某些参与方共享某些信息。
[0033]
接下来,在至少两个参与方之间生成随机秘密共享[a]和[k]。因而,所述至少两个参与方中的每一方持有份额a和份额k。此外,计算[w]=[a][k],也作为所述至少两个参与方之间的秘密共享。这可以通过所述至少两个参与方中的每一方从其份额a和k计算份额w来进行。此外,[w]可以是“开放的”,即秘密w被透露给所述至少两个参与方中的每一方。例如,这可以通过所述至少两个参与方中的每一方向其它参与方中的每一方透露其份额w来获得。应注意的是,可以在不开放[a]和/或[k]的情况下开放[w],即,同时使a及k的值保密。
[0034]
接下来,在不透露k的情况下,计算值r为r=g
k
。例如,这可以包括所述至少两个参
与方中的每一方基于他们的份额k计算份额r。这将在下面进一步详细描述。作为备选方案,可以以另外的方式计算r,只要确保k不被透露即可。然而,r可以被透露给所述至少两个参与方中的每一方。注意,由于通常接受的称为

离散日志’假设的加密假设(标准dsa/ecdsa也基于该假设),因此不可能通过看到值r=g
k
来推断关于k的任何信息。
[0035]
进一步确保r是正确的。在本上下文中,这应当被解释为意味着r等于g
k
,其中k是由秘密共享[k]定义的唯一值k。通过验证r=g
k
是根据源自诚实参与方的[k]的至少t+1个份额计算的,进行确保r是正确的步骤,其中t表示签名方案的阈值,即,可以容许多达t个恶意的、破坏的、不诚实的或不可用的参与方。从而,当确保r的正确性时,调查参与方的诚实性,并且只有在能够证明至少t+1个参与方是诚实的情况下,才能推断r是正确的。这将在下面进一步详细描述。
[0036]
如果结果是r不正确,则可以中止签名过程。例如,可以保证每个诚实参与方或者(1)获得值r=g
k
,或者(2)在此时输出中止。即,即使多达t个参与方被破坏,剩余的n

t个参与方也将或者获得r=g
k
或者中止。这将在下面进一步详细描述。
[0037]
接下来,计算认证元w为w=g
ak
。这是在不透露a或k的情况下,通过计算r
a
而不是通过直接计算g
ak
来进行的。这可以以与计算r的方式相同的方式进行,除了代替g,使用r作为底数之外。另外,在这种情况下,通过验证w=r
a
是根据源自诚实参与方的[a]的至少t+1个份额计算的,确保w是正确的,如果情况不是这样,则可以中止签名过程。
[0038]
从而,在该过程的这个阶段,计算了正确的r=g
k
和正确的w=g
ak
,而值k和a仍然是秘密的。
[0039]
接下来,通过检查是否g
w
=w,验证[w]。这可以包括向每一方开放[w]。注意,使用共享的弱乘法来计算[w],因此只有当所有参与方都是诚实的,并且遵守协议直到现在,w才等于乘积ak。由于已知w=g
ak
是正确的,因此验证g
w
=w确保w=ak。此时,w、g和w为所有参与方已知,从而任何参与方都可以以这种方式验证其值w的正确性。此外,这可以在不透露a的情况下,以及在不透露k的情况下进行。
[0040]
从而,在该过程的这个阶段,已经确保由所述至少两个参与方中的每个诚实参与方计算出了w的正确值。
[0041]
上述所有步骤可以在不知道要签名的消息m的情况下进行。因而,可以在预处理过程中,例如,在非峰值时段期间进行这些步骤。这可以均衡处理设备上的负荷,并且增加在峰值时段期间可以进行的事务的数量,并且可以减少从呈现消息m到计算出消息m上的签名为止的响应时间。
[0042]
最后,通过计算[k
‑1]=[a]
·
w
‑1,计算[x
·
k
‑1]=[x]
·
[k
‑1],并且作为m、r、[k
‑1]和[x
·
k
‑1]的函数,生成至少两个参与方之间的共享[s],对消息m签名。
[0043]
m的dsa或ecdsa数字签名通常由一对(r,s)组成,其中r=f(g
k
)和s=k
‑1(h(m)+rx)。该对(r,s)可以被透露并使用公共密钥y来验证。生成的共享[s]是签名对的后一部分s的共享。该对的第一部分r可以被生成为r=f(r),其中f是最初由ecdsa提供和指定的函数之一。如下生成共享[s]:首先计算k的倒数的共享为[k
‑1]=w
‑1[a]。由于w已经被验证为等于ak,因此这产生k
‑1的正确共享,因为w
‑1[a]=[aw
‑1]=[a(ak)
‑1]=[(aa
‑1)k
‑1]=[k
‑1]。此外,共享[x
·
k
‑1]被计算为[x]
·
[k
‑1]。随后例如通过首先计算[a]=h(m)[k
‑1],[b]=[k
‑1][x],最后计算[s]=[a]+r[b],可以计算共享[s]。
[0044]
此外,在按照本发明的方法中,在对过程的正确性有任何疑问的情况下允许中止,即,不提供终止保证,即使这是许多现有技术方法中的要求。这样的疑问可能例如归因于参与方中的一方或多方受到损害或者是恶意的,或者可能仅仅归因于在参与方之间的通信期间的分组丢失。中止该过程将会简单地导致该过程被重新启动,以尝试提供正确的签名。
[0045]
提供终止保证的签名方法通常通过假设同步网络,即保证分组延迟的上限的网络来实现终止保证。使用固有地是异步的开放通信网络(比如因特网)应用这样的方法要求每个参与方都必须具备本地时钟,并且如果参与方按照本地时钟,在某一固定超时内没有接收到预期的消息,则它将简单地将发送方视为被破坏。
[0046]
这导致两难的局面。如果超时较小,那么存在在因特网上经常出现的分组延迟将很快导致比协议所能容许的更多的参与方(例如,超过n个参与方中的n/2或n/3)被视为被破坏,从而秘密签名密钥可能泄露的高风险。为了避免这一点,超时必须被设定得很高。但是这具有这样的缺点,即它允许单个恶意参与方通过有意地延迟它发送给其它参与方的每个消息(即,它可以将消息保留到直到超时发生时才结束)在系统中引入非常高的时延。按照本发明的方法通过允许协议中止,避免了这种两难的局面。这允许使用相当小的超时,在系统中只产生较小的总体时延。这是可能的,因为该方法被设计成确保即使当所有消息都被延迟时,可能发生的最坏情况也只是协议中止,而不是像在以先前公开的一些方法中那样秘密签名密钥泄漏。
[0047]
计算值r的步骤可以包括以下步骤:
[0048]

所述至少两个参与方中的每一方计算值r的份额r
j
为r
j
=g
k_j
,并将该份额分发给每一个其它参与方,和
[0049]

根据份额r
j
计算值r,并且
[0050]
确保r是正确的步骤可以包括以下步骤:
[0051]

每个参与方基于从其它参与方接收的份额r
j
,检查r是正确的。
[0052]
回顾一下,每个参与方p
j
持有秘密k的份额k
j
。按照本实施例,所述至少两个参与方按照以下方式计算值r。所述至少两个参与方中的每一方计算r的份额r
j
,其中r
j
表示由参与方j计算的r的份额。r
j
被计算为r
j
=g
k_j
,其中k_j表示由参与方j持有的[k]的份额。从而,每个参与方基于自身的[k]的份额,计算份额r
j

[0053]
所述至少两个参与方中的每一方随后将自身的r的份额r
j
分发给每一个其它参与方,即,透露份额r
j
。然而,归因于离散日志假设,份额k_j仍然是秘密的,从而秘密的随机数k仍然是秘密的。
[0054]
随后从透露的份额r
j
计算值r。例如,这可以包括“在指数中”插值份额r
j
。例如,值r可以由所述至少两个参与方计算和/或它可以被集中计算。在本上下文中,术语“在指数中插值”应被解释为意味着其中重构“指数中的”秘密(例如从g
k_1
、g
k_2
等计算g
k
)的多项式插值。
[0055]
最后,所述至少两个参与方中的每一方基于从其它参与方接收的份额r
j
,检查r是否正确。
[0056]
按照该方法的一个实施例,份额可以是shamir份额,并且存在至少三个参与方(即n≥3),且安全阈值t满足t<n/2。在该实施例中,所述至少三个参与方中的每一方可以通过检查从其它参与方接收的每个份额r
j
是否与由前t+1个份额唯一地限定的t次多项式f一
致,来验证r是否正确。例如,这可以通过比较每个份额r
t+2
、r
t+3
、...、r
n
和预期份额来进行,所述预期份额可以使用例如指数中的拉格朗日插值,从前t+1个份额r1、r2、...、r
t+1
来计算。如果在所有情况下,接收的份额都等于预期份额,则可以推断所有接收的份额r
j
都正确。因为已知至少t+1个份额r
j
接收自诚实参与方,从而是正确的,因此可以推断这一点。如果任何一方发现一些份额r
j
缺失或者与由前t+1个接收的份额确定的多项式不一致,则该参与方可以中止协议。
[0057]
按照该方法的备选实施例,份额可以是加法份额,安全阈值可以多达t=n

1。在该实施例中,每个参与方p
i
的份额g
k_i
可以包括零知识证明,例如,非交互式零知识证明,从而p
i
向其它参与方证明份额r
i
是正确计算的,而不透露关于k
i
的任何信息。在该备选实施例中,验证r的正确性可以包括从另一参与方接收份额r
j
的参与方验证零知识证明,并且如果该证明无效则中止。
[0058]
按照一个实施例,可以通过以下方式确保r的正确性。假设存在三个参与方,n=3,并且可以容许一个受到损害或者不可用的参与方,即,t=1。这种情况下,可以根据源自两个或更多个诚实参与方的份额r
j
,计算r的正确值。所述三个参与方中的每一方随后可以基于他们各自的k的份额,计算其r的份额,并将计算的r的份额分发给其它两个参与方中的每一方,如上所述。每个参与方随后将拥有r的三个份额,即,自己计算的份额和从其它两个参与方接收的两个份额。如果所有三个参与方都是诚实的,则根据这些份额中的任意两个的组合,可以正确地计算r。因而,参与方基于可用份额中的可能的任意两个的组合(在本例中,共计三种组合,即,(r1,r2),(r1,r3)和(r2,r3))来计算r。如果所有三种组合都产生r的相同值,则可以推断所有三个参与方都是诚实的,并且r是正确的。如果基于所述组合中的至少一个组合计算的r的值不同于基于任意其它组合计算的r的值,则可以推断至少一个参与方不诚实。然而,无法判定哪个参与方不诚实,于是,不可能确定r的哪个计算值是正确的。这种情况下,仅仅判定r是不正确的,并且可以中止签名过程。这可能延迟签名过程,但是不会透露秘密。
[0059]
计算值r的步骤和检查r是否正确的步骤可以以相反的顺序进行,即,参与方可以在计算值r之前,检查接收的份额r
j
是否正确。这种情况下,只有当发现接收的份额r
j
正确时,才可以计算值r。
[0060]
计算值r的步骤和计算认证元w的步骤可以使用相同的协议来进行。例如,计算认证元w的步骤可以基本上以上面关于值r所述的方式来进行,不过使用r作为底数而不是g。从而,在这种情况下,至少两个参与方中的每一方计算认证元w的份额w
j
为w
j
=r
a_j
,并将该份额分发给每个其它参与方,从份额w
j
计算认证元w,并且每个参与方例如以上述方式,基于从其它参与方接收的份额w
j
,检查w是否正确。
[0061]
该方法还可以包括在揭示r或w不正确的情况下,中止签名过程的步骤。从而确保秘密密钥不被透露给恶意参与方。然而,在签名过程被中止的情况下,可以证明重新启动该过程以便再次尝试获得有效签名是安全的。
[0062]
所述方法还可以包括在验证w的步骤揭示g
w
≠w的情况下中止签名过程的步骤。如果结果是g
w
≠w,则可以推断w≠ak,从而不能基于[w]获得有效签名。在这种情况下,试图计算和透露签名值s可能会通过向恶意参与方透露关于秘密密钥x的信息,从而潜在地损害机密性。于是,如果情况是这样,则类似于上述情况中止签名过程,并且签名过程可以被重新
启动。
[0063]
对消息m签名的步骤可以通过开放[w]和计算[s]=mw
‑1[a]+rw
‑1[a][x]+[d]+m[e]来进行,其中r=f(r),m=h(m),并且[d]和[e]是零的随机共享(所谓的“掩蔽(blinder)共享”)。
[0064]
对于某些类型的秘密共享方案,一旦计算了乘积[ax]=[a][x],开放共享[ax]是不安全的,因为[ax]的份额可能透露过多关于秘密a和x的信息。
[0065]
例如在我们的方法的第一实施例中情况就是这样,其中份额是shamir份额,并且其中参与方的[ax]的份额是通过每个参与方将其[a]和[x]的份额相乘而获得的。这种情况下,[ax]的份额不再是随机的,并且在开放[ax]时可能泄漏关于a或x的信息。为了避免这一点,参与方首先计算已知具有随机份额的零的共享[0],并且作为替代开放[ax]+[0]。增加[0]不改变结果,但确保值ax是在开放[ax]时透露的唯一信息。
[0066]
从而,[s]首先被计算为mw
‑1[a]+rw
‑1[a][x]。注意,由于此时已知w是正确的,并且假设[a][x]是正确的,这意味着[s]=[k
‑1(m+rx)],即,[s]是由dsa或ecdsa定义的正确签名值s的共享。但是在开放[s]之前,增加零共享[d],即,开放[s]+[d]。将d加到s上不会改变s的值,因为d=0。
[0067]
假定w的正确性是强制规定的,如上所述,在一些实施例中,可以从数学上证明,即使在乘法[a][x]是可能不正确的弱乘法的情况下,透露如上计算的签名(r,s)也不会泄漏比正确计算的签名更多的关于秘密密钥x的任何信息。如果[a][x]不正确,唯一会发生的事情是结果值(r,s)将不是有效签名。这可以由每个参与方通过使用消息m和公共验证密钥y,简单地验证签名(r,s)来确定。如果无效,则参与方可以重新启动签名过程。
[0068]
在一些实施例中,开放[s]+[d]可以被证明是安全的,但是证据假设诚实参与方最初同意要签名的消息m。如果他们不同意m,则关于秘密密钥x的非预期信息可能泄漏。因此,在一些实施例中,例如本文中所述的第一实施例中,参与方可以改为计算并开放[s]+[d]+m
·
[e],其中[d]和[e]都是零的随机共享,并且其中m=h(m)。在这些实施例中,开放该共享可以被证明是安全的,即使不是所有诚实参与方都使用相同的值m。如果它们同意m,则[d]+m
·
[e]将变成确保结果[s]可以被开放而不透露关于x的信息的零共享。相反,如果一些参与方持有不同的m值,则将[d]+m
·
[e]加到[s]上,将[s]变成完全随机的共享,这使得协议中止,但是不泄露任何关于x的信息。从而,我们实现了参与方不必在他们开放[s]之前首先确保他们使用相同的m值的性质。这在实践中可能是重要的,因为这意味着参与方不必在他们开放[s]之前花费额外的一轮交互来确保他们同意m的值。
[0069]
在该方法的备选实施例中,份额可以是加法份额,可以使用诸如paillier加密方案之类的加法同态加密方案来实现乘法[ax]=[a][x]。这里,为了能够安全地透露乘积[ax]=[a][x]的份额而不泄露关于a或x的信息,可能需要在计算[ax]的过程中包括零知识证明,例如非交互式零知识证明。例如,在使用paillier加密时,在过程中包括这样的零知识证明是可由本领域技术人员应用的公知技术。
[0070]
至少生成密钥x,生成随机秘密共享[a]和[k],计算值r和计算认证元w的步骤可以在消息m的生成之前通过预处理来进行。按照该实施例,一些步骤,例如包括生成密钥对([x],y),计算r和w,确保r或w的正确性,生成零共享[d]和[e],计算共享[w],开放[w],验证g
w
=w和/或计算[ax]=[a][x]可以在要签名的消息m为参与方所知之前进行。如上所述,这
减少了在提供数字签名时要进行的步骤的数量,从而降低了处理需求和响应时间。
[0071]
许多类型的秘密共享,比如例如shamir秘密共享,具有以下性质:已知两个共享,例如[a]和[x],可以在不需要参与方之间的任何交互的情况下计算这两个秘密之和的共享[a+x]。此外,如果所有参与方都知道给定的公共值c,则参与方可以不需要交互地计算乘积[c
·
x]的共享。这样的秘密共享方案被称作

线性’秘密共享方案。
[0072]
按照本发明的其中使用这种线性秘密共享的一些实施例,通过在知道要签名的消息m之前,在预处理阶段中生成[x]、[a]、y、r、w、[ax]和w,并且验证r和w的正确性,则一旦m为参与方所知,参与方就可以生成r和[s],而不需要任何彼此的交互。这是因为通过使用在预处理中已经生成和验证的共享和值,r可以由每个参与方本地计算为r=f(r),此外仅仅通过共享的相加和共享与公共常数的相乘,即可以计算[s]。
[0073]
此外,按照一些实施例,通过利用预处理来进行一些步骤,一旦m为参与方所知,则最终签名(r,s)就可以在单轮交互中被透露给接收方,其中每一方将r以及其[s]的份额发送给接收方。
[0074]
此外,按照一些实施例,通过利用预处理来进行一些步骤,一旦m为各个参与方所知,则最终签名(r,s)就可以在单轮交互中被透露给接收方,其中只有一些参与方将他们的[s]的份额发送给接收方。例如,在第一实施例中,[s]是2t次shamir共享,从而2t+1个参与方在单轮交互中将他们的份额发送给接收方就足够了。
[0075]
按照其中使用线性秘密共享的一些实施例,通过进行附加的预处理步骤,在给定m的情况下,最终签名(r,s)可以在单轮交互中被透露给接收方,其中只有t+1个参与方将r及他们的[s]的份额发送给接收方。例如,在其中[ax]是2t次shamir共享的一些实施例中,通过使用从安全多方计算领域已知的标准技术,可以在预处理步骤中将[ax]的次数降低到t。这样,[s]的次数也变成t,从而接收方仅仅基于[s]的t+1个份额即可重构s。
[0076]
此外,按照本发明的实施例,可以进行附加的预处理步骤来确保共享[ax]是值ax的正确共享。这可以利用来自安全多方计算领域的标准技术来进行。这样,实现了以下性质:如果在预处理步骤期间过程没有中止,则即使多达t个恶意参与方试图阻止有效签名的开放,也能够保证一定数量的诚实参与方,例如2t+1或t+1个诚实参与方,能够开放有效签名(r,s)。
[0077]
像这样简化通信,例如,通过使一旦要签名的消息m为参与方所知就需要的交互轮数以及重构s所需的份额数降至最小,可以在多方签名方案的实际应用中带来好处。
[0078]
该方法还可以包括计算公共密钥y为y=g
x
,并向至少两个参与方中的每一方透露y的步骤。按照该实施例,生成采取秘密密钥[x]和公共密钥y=g
x
形式的密钥对。该密钥对用于生成数字签名。
[0079]
该方法还可以包括使用公共密钥y来验证签名的步骤。例如,这可以包括检查是否r=f(g
m/s
·
y
r/s
)。可替选地或另外地,该步骤可包括检查是否r
s
=g
m
·
y
r

[0080]
例如,这可以包括至少两个参与方中的每一方使用公共验证密钥y来验证签名的正确性。例如,这可以包括检查是否r
s
=g
m
·
y
r
。如果某一参与方发现情况是这样,则该参与方接受签名(r,s),并将其作为结果输出。如果否,则它可以中止签名过程。
[0081]
在该方法的另一个实施例中,应该接收作为结果的签名(r,s)的不是参与方本身,而是外部方。这种情况下,每个参与方p
j
如上所述计算r及其秘密共享[s]的份额s
j
。然后,每
个参与方将r和s
j
发送给外部方。外部方比较所有的接收值r,并且如果它们不相等则中止。然后它计算r=f(r),并通过多项式插值根据份额s
j
计算s,并且使用公共密钥y验证是否r
s
=g
m
·
y
r
。如果是,则他接受(r,s)作为最终签名。
[0082]
该方法还可以包括检查y的正确性的步骤。按照本发明的实施例,该步骤可包括以与生成随机共享[k]并开放和验证r=g
k
的正确性相同的方式,首先生成随机共享[x],然后开放y=g
x
,并检查y的正确性的步骤。
附图说明
[0083]
下面参考附图,更详细地说明本发明,附图中
[0084]
图1是图解说明使用按照本发明的第一实施例的方法的密钥生成和签名生成的方框图,
[0085]
图2是图解说明使用按照本发明的第二实施例的方法的密钥生成的方框图,
[0086]
图3是图解说明使用按照本发明的第三实施例的方法的签名生成的方框图,
[0087]
图4是图解说明使用按照本发明的第四实施例的方法的签名生成的方框图,
[0088]
图5是图解说明使用按照本发明的第五实施例的方法的密钥生成和签名生成的方框图,以及
[0089]
图6是图解说明按照本发明的实施例的方法的流程图。
具体实施方式
[0090]
图1是图解说明使用按照本发明的第一实施例的方法的密钥生成和签名生成的方框图。该方法涉及三个参与方p1、p2和p3的使用,在参与方p1、p2、p3中的一方可用的信息对其它参与方p1、p2、p3来说可能不可用的意义上,参与方p1、p2、p3是单独的或分开的。例如,参与方p1、p2、p3可以是物理上分离的硬件服务器的形式。在这个例子中,安全阈值(t)为1,即,如果参与方p1、p2、p3中的一方是恶意的,则该参与方将不能获知关于x的任何信息,或者不能用秘密密钥x对消息m签名,除非其它(诚实)参与方同意对m签名。
[0091]
客户端1向每个参与方p1、p2、p3发送请求keygen,请求参与方p1、p2、p3生成包含秘密密钥[x]和公共密钥y的密钥对([x],y)。客户端1被布置在围绕包括三个参与方p1、p2、p3的系统的环境中,即,客户端不构成要生成密钥和签名的系统的一部分。
[0092]
响应请求keygen的接收,三个参与方p1、p2、p3生成密钥[x],作为三个参与方p1、p2、p3之间的随机秘密共享。这可以包括参与方p1、p2、p3之间的几轮交互,并且它可以例如以下面参考图2所述的方式来进行。因此,每个参与方p1、p2、p3持有秘密密钥x的份额x1、x2、x3,但是参与方p1、p2、p3都不拥有整个秘密密钥x。
[0093]
三个参与方p1、p2、p3还计算公共密钥y为y=g
x
。在每个参与方p1、p2、p3都拥有y的意义上,并且在y由每个参与方p1、p2、p3传送到客户端1的意义上,公共密钥y是被公开的。从而使y=g
x
公开或

开放’,但是x仍然是秘密的。
[0094]
在参与方p1、p2、p3都不是恶意的或者都未被破坏的情况下,由每个参与方p1、p2、p3传送到客户端1的公共密钥y将是相同的,即客户端1将从三个参与方p1、p2、p3接收三个相同版本的y。从而,如果客户端1接收到三个相同版本的y,则它可以推断参与方p1、p2、p3都不是恶意的或者都未被破坏,即,所有参与方p1、p2、p3迄今为止都行动正确。另一方面,
在从三个参与方p1、p2、p3接收的三个版本的y彼此不同的情况下,可以推断参与方p1、p2、p3中的至少一方是恶意的或者被破坏。这种情况下,客户端1使过程中止。
[0095]
当生成了密钥对([x],y)时,客户端1通过向每个参与方p1、p2、p3发送请求sign和和要签名的消息m,发起应用所生成的密钥对([x],y)的签名过程。
[0096]
响应请求sign和消息m的接收,参与方p1、p2、p3参与签名生成过程,该过程可能需要参与方之间的几轮交互,并且其中每个参与方p1、p2、p3应用其[x]的份额x1、x2、x3,而不向其它参与方透露份额x1、x2、x3。在签名生成过程结束时,每个参与方p1、p2、p3拥有值r和[s]的份额s1、s2、s3。签名生成过程例如可以按照下面参考图3所述的方式进行。
[0097]
每个参与方p1、p2、p3随后将r及其[s]的份额s1、s2、s3返回给客户端1。响应于此,客户端1例如使用插值从接收的份额s1、s2、s3计算s。此外,客户端1计算r=f(r),并且只有当从三个参与方p1、p2、p3中的至少两个参与方接收到相同版本的r时,才接受(r,s)作为有效签名。此外,客户端1可以进行附加的验证检查,例如验证r
s
=g
m
·
y
r
,以便使它接受签名(r,s)作为有效签名。
[0098]
图2是图解说明使用按照本发明的第二实施例的方法的密钥生成的方框图。图2中图解所示的密钥生成例如可以作为图1中图解所示的方法的一部分来应用。
[0099]
在图2中图解所示的实施例中,三个参与方p1、p2、p3合作计算密钥对([x],y),其中[x]是三个参与方p1、p2、p3之间的秘密共享形式的秘密密钥,而y是公共密钥。按照该实施例,份额是shamir秘密份额,安全阈值为1,即,t=1。
[0100]
在参与方p1、p2、p3之间的第一轮交互中,作为参与方p1、p2、p3之间的随机t次shamir秘密共享,生成秘密密钥[x]。为此,每个参与方p1、p2、p3产生三个随机值,一个给自己,每个其它参与方p1、p2、p3各一个,并将产生的值转发给相应的其它参与方p1、p2、p3。从而,参与方p1生成值x1,1并自己保持该值,生成值x1,2并将其转发给参与方p2,和生成值x1,3并将其转发给参与方p3。类似地,参与方p2生成值x2,1并将其转发给参与方p1,生成值x2,2并自己保持该值,并生成值x2,3并将其转发给参与方p3。最后,参与方p3生成值x3,1并将其转发给参与方p1,生成值x3,2并将其转发给参与方p2,和生成值x3,3并自己保持该值。
[0101]
从而,在参与方p1、p2、p3之间的第一轮交互结束时,每个参与方p1、p2、p3拥有三个随机值,即由它自己生成的值和从每个其它参与方p1、p2、p3接收的值。基于这三个值,每个参与方p1、p2、p3生成[x]的份额x1、x2、x3。
[0102]
在参与方p1、p2、p3之间的第二轮交互中,参与方p1、p2、p3计算公供密钥y。为此,每个参与方计算yi=g
xi
,其中g是循环群g的生成元,yi是由参与方pi生成的值,xi是由参与方pi持有的[x]的份额。此外,每个参与方p1、p2、p3将值yi传送给每个其它参与方p1、p2、p3。从而,参与方p1计算y1=g
x1
,并将y1传递给参与方p2和p3等。因而,每个参与方p1、p2、p3现在拥有三个值y1、y2和y3中的每一个。
[0103]
每个参与方p1、p2、p3随后检查从其它两个参与方接收的值yi是否可信。例如,这可以包括在指数中进行插值。在参与方p1、p2、p3中的一方推断从其它参与方中的至少一方接收的值yi不可信的情况下,该参与方p1、p2、p3输出

中止’信号,从而中止签名过程。
[0104]
在没有参与方p1、p2、p3如上所述输出

中止’的情况下,允许签名过程继续,并且每个参与方p1、p2、p3基于值y1、y2和y3并使用插值来生成公共密钥y。按照dsa/ecdsa标准,y=1是非法公共密钥,从而如果情况是这样,则应当中止该过程。应注意的是,如果协议中
止,则它可以被重新启动,导致生成另一个密钥对。如果发现y≠1,则作为参与方p1、p2、p3之间的第三轮交互的一部分,每个参与方p1、p2、p3向每个其它参与方p1、p2、p3转发

ok’信号。每个参与方p1、p2、p3只有当它从每个其它参与方p1、p2、p3接收到“ok”信号时,才接受它自己版本的y。否则,签名过程将被中止。
[0105]
在如上所述从其它参与方p1、p2、p3接收到“ok”信号的情况下,输出公共密钥y。
[0106]
图3是图解说明使用按照本发明的第三实施例的方法的签名生成的方框图。和图2中一样,秘密共享是shamir共享,并且安全阈值为1(t=1)。该过程在图3a中开始,并在图3b中继续。图3中图解所示的签名生成例如可以作为图1中图解所示的方法的一部分来应用。
[0107]
在图3中图解所示的实施例中,三个参与方p1、p2、p3通过使用呈三个参与方p1、p2、p3之间的秘密共享形式的秘密密钥[x],合作生成用于消息m的签名(r,s)。例如,可以按上面参考图2说明的方式,作为t次shamir共享地生成秘密密钥[x]。
[0108]
在图3a中图解所示的参与方p1、p2、p3之间的第一轮交互中,各个参与方生成随机的t次秘密共享[k]和[a]。这基本上是以上面关于[x]的生成,参考图2说明的方式进行的。参与方还生成三个随机的2t次零共享[b]、[d]和[e],即掩蔽共享。从而,在参与方p1、p2、p3之间的第一轮交互结束时,每个参与方p1、p2、p3持有[k]、[a]、[b]、[d]和[e]每一个的份额,并且参与方p1、p2、p3都不拥有关于秘密a和k的任何信息。
[0109]
接下来,在也在图3a中图解所示的参与方p1、p2、p3之间的第二轮交互中,每个参与方p1、p2、p3计算值ri为ri=g
ki
,其中g是循环群g的生成元,ri是由参与方pi计算的值,而ki是由参与方pi持有的[k]的份额。从而,参与方pi计算r1=g
k1
,参与方p2计算r2=g
k2
,而参与方p3计算r3=g
k3

[0110]
此外,每个参与方p1、p2、p3计算值wi为wi=ki
·
ai+bi,其中wi是由参与方pi计算的值,而ki、ai和bi分别是由参与方pi持有的[k]、[a]和[b]的份额。从而,参与方p1计算w1=k1
·
al+b1,参与方p2计算w2=k2
·
a2+b2,而参与方p3计算w3=k3
·
a3+b3。如果所有参与方都正确地进行规定的动作,则参与方持有的份额w1、w2、w3形成2t次shamir共享[w],其中w等于ak。
[0111]
每个参与方随后向每个其它参与方透露计算的值ri和wi。从而,每个参与方p1、p2、p3现在拥有三个值r1、r2和r3中的每一个,以及三个份额wl、w2和w3中的每一个,因而r=g
k
和w=k
·
a+b现在为每个参与方p1、p2、p3所知,即使k和a都仍然是秘密的。这可以被称作“开放”r和w。共享[b]可以被称为“掩蔽共享”,因为将它加到[ak]中并不改变秘密,但是“掩蔽(blind)”共享[ak]的各个份额,从而使得除了乘积ak之外,不可能从看见[ak]的份额导出关于a或k的任何信息。
[0112]
在参与方p1、p2、p3之间的第二轮交互结束时,每个参与方p1、p2、p3检查r的正确性。这是基于接收的值r1、r2和r3并使用指数中的插值进行的。在参与方p1、p2、p3中的至少一方发现r不正确的情况下,该过程被中止。否则,该过程继续。
[0113]
接下来,在图3b中图解所示的参与方p1、p2、p3之间的第三轮交互中,每个参与方p1、p2、p3计算值wi为wi=r
ai
,其中wi是由参与方pi计算的值,ai是由参与方pi持有的[a]的份额。此外,每个参与方p1、p2、p3向每个其它参与方p1、p2、p3透露计算的值wi。因而,每个参与方p1、p2、p3现在拥有值w1、w2、w3中的每一个,并且通过在使用指数中的插值,每个参与方p1、p2、p3可以计算w=r
a
,而值a仍然是秘密的。这可以被称作“开放”w。
[0114]
在参与方p1、p2、p3之间的第三轮交互结束时,每个参与方p1、p2、p3基于接收的值w1、w2、w3,并且通过使用指数中的插值,检查w的正确性。这是使用值wi,以与在第二轮交互中使用值ri来检查r的正确性相同的方式进行的。在参与方p1、p2、p3中的至少一方发现w不正确的情况下,中止该过程。否则,继续该过程。
[0115]
最后,在参与方p1、p2、p3之间的第四轮交互中,每个参与方p1、p2、p3基于值w1、w2和w3,并使用插值来计算w。
[0116]
此外,每个参与方p1、p2、p3通过检查是否w=g
w
来验证w。如上所述,强制规定w=r
a
并且r=g
k
。如果情况不是这样,则该过程在先前就会被中止。由此得出w=g
ka
。从而通过检查是否g
w
=w,确保w=a
·
k。应注意的是[w]不是被计算为[a][k],而是被计算为[a][k]+[b],不过由于[b]是0的共享,即,[b]=[0],因此增加[b]对该检查没有影响。
[0117]
在参与方p1、p2、p3中的至少一方发现w≠g
w
的情况下,则中止签名过程。否则继续该过程,并且每个参与方p1、p2、p3计算共享[s]的份额si为:
[0118]
si=m
·
hi+r
·
hi
·
xi+m
·
di+ei
[0119]
其中:
[0120]
hi=ai
·
w
‑1,
[0121]
r=f(r),其中f是预先定义的函数,和
[0122]
m=h(m),其中m是要签名的消息,h是预先定义的函数。
[0123]
xi、di和ei分别是由参与方pi持有的[x]、[d]和[e]的份额。当每个参与方如上所述计算其份额si时,这意味着参与方共同进行计算[s]=m[k
‑1]+r[k
‑1][x]+m[d]+[e]。如果所有参与方都进行规定的动作,则这导致[s]=[k
‑1(m+rx)],即,dsa或ecdsa所要求的s=k
‑1(m+rx)。
[0124]
每个参与方p1、p2、p3向每个其它参与方p1、p2、p3透露份额si,并且每个参与方p1、p2、p3基于接收的份额s1、s2和s3,使用插值计算s,然后通过使用公共密钥y验证消息m上的签名,即,通过检查是否r=g
m
·
y
r
来检查s的正确性。如果s的正确性被确认,则接受签名(r,s)作为消息m的最终签名。
[0125]
图4是图解说明使用按照本发明的第四实施例的方法的签名生成的方框图。图4中图解所示的过程包括三个参与方p1、p2、p3之间的六轮交互。参与方p1、p2、p3之间的前三轮交互与图3中图解所示并且上面说明的前三轮交互相同。
[0126]
在参与方p1、p2、p3之间的第四轮交互中,只有参与方p1以上面参考图3说明的方式计算s1,即:
[0127]
s1=m
·
h1+r
·
h1
·
x1+m
·
d1+e1.
[0128]
p1随后将s1转发给参与方p2,并且在参与方p1、p2、p3之间的第五轮交互中,参与方p2以上面参考图3说明的方式计算s2,并且将s1和s2转发给参与方p3。
[0129]
在参与方p1、p2、p3之间的第六轮交互中,参与方p3以上面参考图3说明的方式计算s3,并且基于三个份额s1、s2和s3且使用插值计算s。参与方p3随后检查s的正确性,如果s是正确的,则参与方p3接受签名(r,s)作为消息m的最终签名(r,s)。
[0130]
从而,在图4中图解所示的实施例中,签名(r,s)仅由参与方p3接收,而在图3中图解所示的实施例中,每个参与方p1、p2、p3都接收签名(r,s)。像这样的实施例可能是实用的,因为在在线阶段,每个参与方p1、p2、p3只需要向一个参与方发送单一消息,而在图3的
实施例中,每个参与方必须向每个其它参与方发送消息。
[0131]
图5是图解说明使用按照本发明的第五实施例的方法的密钥生成和签名生成的方框图。图5中图解所示的实施例与图1中图解所示的实施例非常相似,于是这里不再对其进行详细说明。
[0132]
然而,在图5中图解所示的实施例中,过程由参与方之一,即参与方p1发起,而不是由外部客户端发起。从而,参与方p1进行在图1的实施例中由客户端进行的步骤,以及在图1的实施例中由参与方p1进行的步骤。
[0133]
图6是图解说明按照本发明的实施例的方法的流程图。该过程开始于步骤2。在步骤3,定义循环群g和该循环群g的生成元g。此外,定义函数f和h。g、g、f和h均由将用于生成数字签名的数字签名算法(dsa)或椭圆曲线数字签名算法(ecdsa)指定。
[0134]
在步骤4,在至少两个参与方之间生成随机的秘密共享[x],其中x是秘密密钥。
[0135]
在步骤5,在所述至少两个参与方之间生成随机的秘密共享[a]和[k]。
[0136]
在步骤6,参与方计算[w]=[a]
·
[k],然后在步骤7,参与方计算值r=g
k
。例如,r可以通过每个参与方计算份额r
j
为r
j
=g
k_j
并根据份额r
j
计算值r来计算,其中k_j是由参与方j持有的[k]的份额。
[0137]
在步骤8,研究r是否正确。如果情况不是这样,则该过程转到步骤9,在步骤9,签名过程被中止,然后该过程返回步骤5,以便生成新的秘密共享[a]和[k]。
[0138]
在步骤8揭示r是正确的情况下,允许签名过程继续,并且过程转到步骤10,在步骤10,参与方计算认证元w=g
ak
。这是通过计算r
a
来进行的。
[0139]
在步骤11,研究w是否正确。如果情况不是这样,则过程转到步骤9,在步骤9,签名过程被中止,然后该过程返回步骤5,以便生成新的秘密共享[a]和[k]。
[0140]
在步骤11揭示w是正确的情况下,过程转到步骤12,在步骤12,研究是否g
w
=w。由于w=r
a
并且r=g
k
,则w=g
ak
。由于w=a
·
k,因此如果w已被正确地计算,则g
w
=w。从而,如果可以验证g
w
=w,则可以推断w已被正确地计算。从而,在步骤12揭示g
w
≠w的情况下,过程转到步骤9,在步骤9,签名过程被中止,然后该过程返回步骤5,以便生成新的秘密共享[a]和[k]。
[0141]
在步骤12中,验证g
w
=w的情况下,过程转到步骤13,在步骤13,在参与方之间生成共享[s],并且签名被应用于消息。最后,该过程在步骤14结束。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1