Skip to main content

Feldman DKG 核心 生成私钥份额

Feldman 分布式密钥生成(DKG)🇨🇳

在 Feldman 分布式密钥生成(DKG)方案中,每个参与方确实生成一个多项式。这个多项式用于生成密钥份额,并通过其系数生成验证者

  • 第一轮:每个参与者生成初始私钥份额 ui,并通过秘密共享方案生成共享份额 shares 和验证者 verifiers。这些值通过承诺广播(P2P)给其他参与者。
  • 第二轮:每个参与者生成其私钥份额的零知识证明,并将其与共享份额一起发送给其他参与者。
  • 第三轮:每个参与者验证收到的零知识证明和共享份额,然后将所有收到的共享份额相加,生成最终的私钥份额 xi。

Feldman 中几个关系 🇨🇳

  1. 私钥份额 si = 发到 i 参与者的所有共享份额 shares 的累加
  2. 私钥 s = 所有参与者私钥份额 si 的累加
  3. verifiers 用于 HashCommitment 和零知识证明
  4. {2,n}私钥份额签名累加(同态 私钥签名)

DKG 核心推理 🇨🇳

在分布式密钥生成(DKG)方案中,参与者通过累加所有收到的共享份额来生成最终的私钥份额。这一过程的关键在于确保参与者能够独立地持有一个私钥份额,并且这些私钥份额的累加能够恢复出完整的私钥。下面详细解释这一过程。

背景

DKG 方案通常基于 Shamir 秘密共享方案。Shamir 秘密共享方案的基本思想是将一个秘密分成多个份额,只有当收集到足够多的份额时才能恢复出秘密。这个方案利用了多项式插值的数学原理。

数学原理

生成秘密多项式

假设有 nn 个参与者,每个参与者 ii 生成一个秘密多项式 fi(x)f_i(x),其常数项 fi(0)=uif_i(0) = u_i 是参与者 ii 的私钥份额:

fi(x)=ui+ai1x+ai2x2++ai(t1)xt1f_i(x) = u_i + a_{i1} x + a_{i2} x^2 + \ldots + a_{i(t-1)} x^{t-1}

生成共享份额

每个参与者 ii 计算多项式 fi(x)f_i(x) 在不同点 x=jx = j 处的值 fi(j)f_i(j),这些值作为共享份额发送给其他参与者 jj

si,j=fi(j)s_{i,j} = f_i(j)

累加共享份额生成最终私钥份额

每个参与者 jj 将所有收到的共享份额 si,js_{i,j} 累加,得到最终的私钥份额 xjx_j

xj=i=1nsi,jx_j = \sum_{i=1}^{n} s_{i,j}

si,js_{i,j} 的表达式代入上式:

xj=i=1nfi(j)x_j = \sum_{i=1}^{n} f_i(j)

公共多项式

所有参与者的多项式 fi(x)f_i(x) 的累加形成了一个公共多项式 P(x)P(x)

P(x)=i=1nfi(x)=(i=1nui)+(i=1nai1)x+(i=1nai2)x2++(i=1nai(t1))xt1P(x) = \sum_{i=1}^{n} f_i(x) = \left( \sum_{i=1}^{n} u_i \right) + \left( \sum_{i=1}^{n} a_{i1} \right) x + \left( \sum_{i=1}^{n} a_{i2} \right) x^2 + \ldots + \left( \sum_{i=1}^{n} a_{i(t-1)} \right) x^{t-1}

恢复秘密

最终的私钥 xx 是所有最终私钥份额 xjx_j 的累加值:

x=j=1nxjx = \sum_{j=1}^{n} x_j

xjx_j 的表达式代入上式:

x=j=1n(i=1nfi(j))x = \sum_{j=1}^{n} \left( \sum_{i=1}^{n} f_i(j) \right)

交换累加顺序:

x=i=1n(j=1nfi(j))x = \sum_{i=1}^{n} \left( \sum_{j=1}^{n} f_i(j) \right)

由于 fi(x)f_i(x) 是一个多项式,且所有多项式 fi(x)f_i(x) 的累加形成了公共多项式 P(x)P(x),最终的私钥 xx 就是公共多项式在 x=0x = 0 处的值:

x=P(0)=i=1nuix = P(0) = \sum_{i=1}^{n} u_i

总结

在 DKG 方案中,参与者通过累加所有收到的共享份额来生成最终的私钥份额。这一过程确保了参与者能够独立地持有一个私钥份额,并且这些私钥份额的累加能够恢复出完整的私钥。通过数学推导和代码示例,我们可以清晰地理解这一过程的原理和实现。

由多项式推导过程来看, 多项式的第一项是有用的,其他的好像没什么用

在分布式密钥生成(DKG)方案中,多项式的常数项(即第零项)确实是最重要的,因为它代表了每个参与者的私钥份额。然而,多项式的其他项(即非常数项)也有其重要作用,特别是在确保方案的安全性和抗欺诈性方面。

多项式的作用

  1. 常数项(第零项)

    • 这是多项式的最重要部分,因为它代表了参与者的私钥份额。在累加所有参与者的私钥份额后,可以恢复出完整的私钥。
  2. 非常数项(高次项)

    • 这些项确保了秘密共享方案的安全性。具体来说,它们使得每个共享份额看起来是随机的,从而防止攻击者通过截获部分共享份额来推断出私钥。

数学背景

在 Shamir 秘密共享方案中,多项式 fi(x)f_i(x) 的形式为:

fi(x)=ui+ai1x+ai2x2++ai(t1)xt1f_i(x) = u_i + a_{i1} x + a_{i2} x^2 + \ldots + a_{i(t-1)} x^{t-1}

其中,uiu_i 是常数项,代表参与者 ii 的私钥份额,其他系数 ai1,ai2,,ai(t1)a_{i1}, a_{i2}, \ldots, a_{i(t-1)} 是随机选择的。

安全性和抗欺诈性

非常数项的存在确保了以下几点:

  1. 随机性

    • 每个共享份额 si,j=fi(j)s_{i,j} = f_i(j) 都包含了随机性,因为高次项的系数是随机选择的。这使得共享份额看起来是随机的,增加了方案的安全性。
  2. 抗欺诈性

    • 多项式的高次项确保了只有至少 tt 个共享份额才能恢复出秘密。如果没有足够的共享份额,攻击者将无法通过插值来恢复出完整的多项式,从而无法恢复出私钥。

恢复秘密

当收集到足够多的共享份额时,可以通过拉格朗日插值法恢复出原始多项式,特别是其常数项。具体步骤如下:

  1. 收集至少 tt 个共享份额
  2. 使用拉格朗日插值法恢复出原始多项式 P(x)P(x)
  3. 原始多项式的常数项即为秘密 SS

总结

虽然多项式的常数项(第零项)是最重要的,因为它代表了每个参与者的私钥份额,但多项式的其他项(高次项)在确保方案的安全性和随机性方面也起到了关键作用。通过这些高次项,每个共享份额看起来是随机的,从而防止攻击者通过截获部分共享份额来推断出私钥。这一特性使得分布式密钥生成方案更加安全和可靠。