Skip to content

秘密共享

目的

为了防止单个用户权限过大,导致系统崩溃或被攻击,可以将一个秘密分割成多个部分,分发给不同的用户,只有当足够数量的用户合作时,才能恢复出原始秘密。

分类

  1. (t,n)(t,n) 门限:将秘密分成 nn 份,至少 tt 份才能恢复出秘密,tnt \leq n
  2. (n,n)(n,n) 门限:将秘密分成 nn 份,所有 nn 份才能恢复出秘密。

构造门限的方式

2-N

构造直线 y=ax+by = ax + b,只需其中两点即可确定一条直线。

3-N

构造二次曲线 y=ax2+bx+cy = ax^2 + bx + c,只需其中三点即可确定一条二次曲线。

t-N

构造 t1t-1 次多项式 y=at1xt1+at2xt2++a1x+a0y = a_{t-1}x^{t-1} + a_{t-2}x^{t-2} + \cdots + a_1x + a_0,只需其中 tt 点即可通过使用拉格朗日插值确定一条 t1t-1 次多项式。

只有这部分的秘密共享方案叫做Shamir秘密共享方案。

存在问题

  1. 存在对于参与者的抗欺诈性问题,既参与者可能会提供错误的份额,导致无法恢复出正确的秘密。
  2. 不能防止分发者的欺诈性问题,既分发者可能会分发错误的份额,导致无法恢复出正确的秘密。

VSS方案

这里介绍Feldman的公开验证秘密共享方案(Verifiable Secret Sharing, VSS),该方案可以解决上述问题。

参数设定

  • 选取大素数 pp 与生成元 gFpg \in \mathbb{F}_p^*,并满足离散对数难题假设。
  • 阈值参数 tt、参与者数量 nn 与 Shamir 门限方案一致。

承诺阶段

分发者随机选择 f(x)=a0+a1x++at1xt1f(x) = a_0 + a_1 x + \cdots + a_{t-1} x^{t-1},其中 a0a_0 为秘密。
计算并广播承诺 Cj=gajmodpC_j = g^{a_j} \; mod \; p0j<t0 \le j < t),同时给每个参与者 PiP_i 私下发送份额 si=f(i)s_i = f(i)

验证阶段

参与者 PiP_i 接收份额后,公开验证条件

gsi==j=0t1Cjijmodpg^{s_i} == \prod_{j=0}^{t-1} C_j^{i^j} \; mod \; p

若等式成立,则确认分发者诚实;若不成立,参与者可拒绝该份额。

恢复阶段

任意 tt 个参与者可通过 Shamir 插值恢复 f(0)=a0f(0)=a_0。由于承诺已固定多项式系数,分发者无法再事后篡改秘密,同样参与者若提交伪造份额也会在验证中被识别。