Skip to main content

Wallet SSS Architecture 加设备

流程图

alt text

warning

方式 1: 计算--拉格朗日插值多项式计算

这里比较奇怪了,(但这种方式是最简单的)

  1. 在已有的设备生成 Share D,生成的时候,当前共享者,知道了新设备共享者的私钥份额 D, 这不符合 MPC-TSS

  2. 从这交互来看,很大可能在这个已有设备上进行了拉格朗日插值多项式计算,会导致整个私钥暴露(原因:常数项就是私钥)

方式 2: 计算--MPC 计算

如果是 MPC 的方式,需要所有共享者参与计算,这样用户操作不便,需要将所有参与者找出来与新设备交互

方式 3: 录入--user input

这种,用户直接将私钥份额手动录入了,也就直接可以用了,但是存在一个份额被多个设备共用的现象,这与 MPC-TSS 也有出入

可以不改变原有份额,增加新的份额 D?

在秘密共享方案(Secret Sharing Scheme, SSS)中,通常情况下,密钥被分割成多个份额(shares),并且需要一定数量的份额才能重建密钥。增加一个新的份额 D 而不改变原有份额的关键在于秘密共享方案的灵活性和数学特性。以下是为什么可以不改变原有份额而增加新的份额 D 的原因:

1. 基于多项式的秘密共享方案

秘密共享方案通常基于多项式插值(如 Shamir 的秘密共享方案)。在这种方案中,密钥被表示为一个多项式的常数项,份额是多项式在不同点的值

  • 多项式表示

    • 假设我们有一个秘密SS,它被表示为一个多项式 f(x)f(x) 的常数项。
    • 多项式 f(x)f(x) 的形式为 f(x)=a0+a1x+a2x2++ad1xd1f(x) = a*0 + a_1 x + a_2 x^2 + \ldots + a*{d-1} x^{d-1},其中 a0=Sa_0 = S
  • 生成份额

    • 份额是多项式 f(x)f(x) 在不同点的值,即 (xi,f(xi))(x_i, f(x_i))

2. 增加新份额的灵活性

在基于多项式的秘密共享方案中,增加新的份额并不需要改变原有的多项式或原有的份额。只需要计算多项式在新的点的值即可。

  • 增加新的份额
    • 假设我们已经有 nn 个份额 (x1,f(x1)),(x2,f(x2)),,(xn,f(xn))(x_1, f(x_1)), (x_2, f(x_2)), \ldots, (x_n, f(x_n))
    • 🌈 我们可以通过计算多项式 f(x)f(x) 在新的点 xn+1x_{n+1} 的值 f(xn+1)f(x_{n+1}) 来生成新的份额 (xn+1,f(xn+1))(x_{n+1}, f(x_{n+1}))🌈。
    • 这种计算不会改变原有的多项式形式和原有的份额。

3. 操作流程中的具体实现

在你提供的流程图中,增加新的份额 D 的具体操作如下:

  1. 用户在新设备上触发登录

    • 用户在新设备上尝试登录,并检索加密密钥(encKey)和元数据。
  2. 验证和生成新份额

    • 通过验证用户的登录和两因素认证,现有设备生成新的份额 D。
    • 新的份额 D 基于现有的多项式 f(x)f(x) 计算得出,不会影响原有的份额
  3. 存储和使用新份额

    • 新设备创建临时加密密钥并存储加密后的新份额 D。
    • 新设备解密并存储新份额 D,从而可以用新的份额 D 来重建密钥。

结论

增加新的份额 D 而不改变原有份额的关键在于秘密共享方案的数学特性。通过基于多项式的秘密共享方案,可以在不改变原有多项式和份额的情况下,计算多项式在新的点的值,从而生成新的份额。这种方法确保了密钥管理的灵活性和安全性。

新份额如何计算

info

我们可以通过计算多项式 f(x)f(x) 在新的点 xn+1x_{n+1} 的值 f(xn+1)f(x_{n+1}) 来生成新的份额 (xn+1,f(xn+1))(x_{n+1}, f(x_{n+1})) 这个如何计算?

在基于多项式的秘密共享方案(如 Shamir 的秘密共享方案)中,计算多项式 f(x)f(x) 在新的点 xn+1x_{n+1} 的值 f(xn+1)f(x_{n+1}) 是一个关键步骤。以下是详细的计算步骤和方法:

多项式表示

假设秘密 SS 被表示为一个多项式 f(x)f(x) 的常数项:

f(x)=a0+a1x+a2x2++ad1xd1f(x) = a*0 + a_1 x + a_2 x^2 + \ldots + a*{d-1} x^{d-1}

其中 a0=Sa_0 = Sdd 是多项式的度数,通常等于所需的最小份额数减去 1(即 k1k-1)。

已知份额

假设我们已经有 nn 个份额 (x1,f(x1)),(x2,f(x2)),,(xn,f(xn))(x_1, f(x_1)), (x_2, f(x_2)), \ldots, (x_n, f(x_n))

计算新的份额

为了计算多项式 f(x)f(x) 在新的点 xn+1x_{n+1} 的值 f(xn+1)f(x_{n+1}),我们可以使用拉格朗日插值法(Lagrange Interpolation)。

拉格朗日插值法

拉格朗日插值法用于通过已知的点来构建多项式。多项式 f(x)f(x) 可以表示为:

f(x)=_i=1nf(xi)i(x)f(x) = \sum\_{i=1}^{n} f(x_i) \cdot \ell_i(x)

其中 i(x)\ell_i(x) 是拉格朗日基函数,定义为:

i(x)=1jnjixxjxixj\ell*i(x) = \prod*{\substack{1 \leq j \leq n \\ j \neq i}} \frac{x - x_j}{x_i - x_j}

计算 f(xn+1)f(x_{n+1})

为了计算 f(x)f(x) 在新的点 xn+1x_{n+1} 的值 f(xn+1)f(x_{n+1}),我们将 xx 替换为 xn+1x_{n+1}

f(xn+1)=i=1nf(xi)i(xn+1)f(x*{n+1}) = \sum*{i=1}^{n} f(x*i) \cdot \ell_i(x*{n+1})

其中 i(xn+1)\ell_i(x_{n+1}) 是:

i(xn+1)=1jnjixn+1xjxixj\ell*i(x*{n+1}) = \prod*{\substack{1 \leq j \leq n \\ j \neq i}} \frac{x*{n+1} - x_j}{x_i - x_j}

具体步骤

  1. 确定新的点 xn+1x_{n+1}

    • 选择一个新的点 xn+1x_{n+1}(通常是一个未使用过的整数)。
  2. 计算拉格朗日基函数 i(xn+1)\ell_i(x_{n+1})

    • 对于每个已知份额 (xi,f(xi))(x_i, f(x_i)),计算 i(xn+1)\ell_i(x_{n+1}) i(xn+1)=1jnjixn+1xjxixj\ell_i(x_{n+1}) = \prod_{\substack{1 \leq j \leq n \\ j \neq i}} \frac{x_{n+1} - x_j}{x_i - x_j}
  3. 计算 f(xn+1)f(x_{n+1})

    • 使用已知的 f(xi)f(x_i) 和计算得到的 i(xn+1)\ell_i(x_{n+1}),计算 f(xn+1)f(x_{n+1}) f(xn+1)=i=1nf(xi)i(xn+1)f(x_{n+1}) = \sum_{i=1}^{n} f(x_i) \cdot \ell_i(x_{n+1})

示例

假设我们有两个已知份额 (x1,y1)=(1,2)(x_1, y_1) = (1, 2)(x2,y2)=(2,3)(x_2, y_2) = (2, 3),我们想计算新点 x3=3x_3 = 3 的值 f(3)f(3)

  1. 计算拉格朗日基函数

    • 1(3)=3212=1\ell_1(3) = \frac{3 - 2}{1 - 2} = -1
    • 2(3)=3121=2\ell_2(3) = \frac{3 - 1}{2 - 1} = 2
  2. 计算 f(3)f(3)

    • f(3)=y11(3)+y22(3)=2(1)+32=2+6=4f(3) = y_1 \cdot \ell_1(3) + y_2 \cdot \ell_2(3) = 2 \cdot (-1) + 3 \cdot 2 = -2 + 6 = 4

所以,新的份额是 (3,4)(3, 4)

通过这种方法,我们可以在不改变原有份额的情况下,生成新的份额。

Share D 是 “新生成的” 还是 “复制的”

在“Device Request”场景中,确实涉及到从已存在的用户设备上获取份额,并将其传递给新设备。关于 Share D(新设备上的份额)的生成方式,有两种主要的可能性:

  1. 直接复制现有份额

    • 从现有设备上直接复制一个已经存在的份额,然后将该份额传递给新设备。
  2. 生成新的份额

    • 使用现有的份额信息,通过某种计算方式生成一个新的份额,然后将新生成的份额传递给新设备。

1. 直接复制现有份额

这种方式比较简单直接。现有设备上的某个份额被复制并传递给新设备。具体流程如下:

  1. 请求份额

    • 新设备向现有设备发送请求,要求获取一个份额。
  2. 响应请求

    • 现有设备验证请求的合法性,并选择一个已经存储的份额(例如,Share A)。
  3. 传递份额

    • 现有设备将选择的份额(例如,Share A)发送给新设备。
  4. 接收和存储

    • 新设备接收到份额后,将其存储起来。

在这种情况下,Share D 实际上是现有设备上的某个份额的复制品,而不是一个新生成的份额。

2. 生成新的份额

这种方式稍微复杂一些,但更灵活和安全。通过现有的份额信息,可以生成一个新的份额,然后传递给新设备。具体流程如下:

  1. 请求份额

    • 新设备向现有设备发送请求,要求生成并获取一个新的份额。
  2. 响应请求

    • 现有设备验证请求的合法性,并使用存储的份额信息(例如,Share A、Share B 等)来计算一个新的份额。
  3. 生成新的份额

    • 现有设备使用多项式计算或其他算法生成一个新的份额(Share D)。
  4. 传递份额

    • 现有设备将新生成的份额(Share D)发送给新设备。
  5. 接收和存储

    • 新设备接收到新的份额后,将其存储起来。

在这种情况下,Share D 是通过计算生成的一个新的份额,而不是现有份额的简单复制。

安全性和灵活性

  • 直接复制现有份额:这种方法简单且快速,但如果份额数量有限,直接复制可能会导致份额重复,降低系统的安全性。
  • 生成新的份额:这种方法更为安全和灵活,因为每个新设备上的份额都是独立生成的,不会与其他设备上的份额重复。

选择哪种方式

选择哪种方式取决于具体的应用场景和安全需求:

  • 如果系统允许份额的复制,并且份额数量足够多,可以选择直接复制现有份额的方法。
  • 如果系统需要更高的安全性,避免份额重复,应该选择生成新的份额的方法。

结论

在“Device Request”场景中,Share D 可以是现有设备上的份额的复制品,也可以是通过现有份额信息生成的一个新的份额。具体选择哪种方式取决于系统的设计和安全需求。生成新的份额的方法通常更为安全和灵活,但也稍微复杂一些。

拉格朗日插值计算意味着泄漏 ⚡️

拉格朗日插值计算意味着泄漏, MPC 计算不泄漏

my ques:

如果是新生成的,那么在这个 Existing User Device 上通过拉格朗日插值多项式计算出来的?会不会有问题,会不会 2/3 中 2 个 Share 都出现在这个 Existing User Device?如果都出现了,那岂不是不安全?MPC-TSS 的方案,共享者之间是不泄漏各自的私钥份额的,但是从这个上下文来看,共享者泄漏了私钥份额

gpt:

你提出的担忧是非常合理的。在多方计算(MPC)和秘密共享(TSS)方案中,安全性是至关重要的,任何份额的泄漏都可能导致系统的安全性受到威胁。

拉格朗日插值多项式

拉格朗日插值多项式是一种常用的方法,用于从多个份额中重建秘密。在秘密共享方案中,通常需要至少 kk 个份额才能重建秘密,其中 kk 是阈值。例如,在一个 (2/3)(2/3) 的方案中,至少需要 2 个份额才能重建秘密。

安全性问题

如果在“Device Request”场景中,现有设备通过拉格朗日插值多项式计算生成新的份额,确实会面临以下问题:

  1. 份额泄漏

    • 现有设备需要知道至少 kk 个份额才能生成新的份额。如果现有设备知道这些份额,那么这些份额实际上已经泄漏给了这个设备。
  2. 安全性降低

    • 如果现有设备拥有了足够多的份额,它可以单独重建秘密,这违背了秘密共享的初衷,即没有单个设备能够单独重建秘密。

解决方案

为了避免上述问题,可以考虑以下几种解决方案:

1. 分布式生成新的份额

通过多方计算(MPC)协议,可以在不泄漏各自份额的情况下,协同生成新的份额。具体步骤如下:

  1. 发起请求

    • 新设备向多个现有设备发送请求,要求生成新的份额。
  2. 分布式计算

    • 多个现有设备通过 MPC 协议协同计算一个新的份额,而不泄漏各自的份额。
    • 每个现有设备参与计算,但不直接发送其份额给其他设备。
  3. 生成新的份额

    • 通过 MPC 协议生成一个新的份额(Share D),并将其发送给新设备。
  4. 接收和存储

    • 新设备接收到新的份额后,将其存储起来。

通过这种方式,可以确保没有单个设备能够知道足够多的份额来重建秘密,从而保持系统的安全性。

2. 使用专门的密钥管理服务(KMS)

可以使用一个专门的密钥管理服务来生成和分发新的份额。这个服务可以被设计成一个独立的、受信任的第三方,负责管理和分发份额。具体步骤如下:

  1. 发起请求

    • 新设备向密钥管理服务发送请求,要求生成新的份额。
  2. 验证请求

    • 密钥管理服务验证请求的合法性。
  3. 生成新的份额

    • 密钥管理服务生成新的份额,并将其发送给新设备。
  4. 接收和存储

    • 新设备接收到新的份额后,将其存储起来。

这种方式可以确保份额的生成和分发过程是安全的,因为密钥管理服务是一个受信任的第三方。

结论

在“Device Request”场景中,如果需要生成新的份额,直接在现有设备上通过拉格朗日插值多项式计算来生成新的份额确实会存在安全性问题。为了避免这些问题,可以使用分布式计算(MPC)协议来协同生成新的份额,或者使用专门的密钥管理服务来生成和分发份额。这样可以确保没有单个设备能够知道足够多的份额来重建秘密,从而保持系统的安全性。

新设备发送随机数到已有设备

不可以新设备生成多项式,发送多项式到已存在的设备

在秘密共享和多方计算(MPC)方案中,发送多项式确实会暴露私钥信息,这显然是不安全的。因此,发送多项式的方法不可取。

为了确保安全性,新设备在请求生成新的份额时,应该发送的信息不应包含任何可能暴露秘密的信息。发送一个随机数或其他辅助信息是更安全的选择。以下是一个基于随机数的安全方案:

MPC 这里涉及到 DKG 的计算了

alt text

基于随机数的方案

1. 新设备生成随机数

新设备生成一个随机数 rr

2. 发送请求

新设备向多个现有设备发送请求,其中包含随机数 rr

3. 多方计算协议

多个现有设备通过 MPC 协议协同计算新的份额。具体步骤如下:

  1. 接收随机数

    • 每个现有设备接收到随机数 rr
  2. 本地计算

    • 每个现有设备使用其现有份额和随机数 rr 进行本地计算。例如,假设现有设备的份额是 SiS_i,它们可以计算一个新的中间值 Vi=f(Si,r)V_i = f(S_i, r),其中 ff 是一个安全的哈希函数或其他加密函数。
  3. 协同生成新份额

    • 各设备通过 MPC 协议协同计算新的份额 SDS_D,这个过程中没有任何设备需要直接发送其份额 SiS_i 给其他设备。具体的 MPC 协议会确保各设备只需交换加密后的中间值 ViV_i,从而计算出新的份额 SDS_D

4. 接收和存储

新设备接收到新的份额 SDS_D 后,将其存储起来。

安全性分析

  1. 避免泄漏

    • 通过发送随机数 rr,新设备不会泄漏任何关于秘密的信息。
    • 各现有设备通过 MPC 协议协同计算新的份额,而不会直接交换其私钥份额 SiS_i,因此不会泄漏私钥。
  2. 分布式计算

    • MPC 协议确保计算过程是分布式的,没有单个设备能够重建秘密。这保持了系统的安全性。

示例

以下是一个具体的例子,假设使用的是基于 Shamir 秘密共享方案的 MPC 协议:

  1. 新设备生成随机数

    • 新设备生成随机数 rr 并发送给现有设备。
  2. 现有设备本地计算

    • 每个现有设备 EiE_i 计算 Vi=f(Si,r)V_i = f(S_i, r),其中 ff 是一个安全的哈希函数。
  3. 协同计算

    • 各现有设备通过 MPC 协议交换加密后的中间值 ViV_i,并协同计算出新的份额 SDS_D
  4. 新设备接收份额

    • 新设备接收到新的份额 SDS_D 并存储。

通过这种方式,可以确保新设备请求生成新的份额时,不会泄漏任何秘密信息,同时通过 MPC 协议确保计算过程的安全性。