Static Proactive Secret Sharing

Table of Contents

1. 背景介绍

使用 Shamir's Secret Sharing 方案可以把某个秘密值 s 分散地保存到 n 个节点,而只需要 t(tn) 个节点同时参与就可以还原出秘密值 s

攻击者需要攻破 t 个节点才能还原出秘密值 s ,但是如果节点的秘密值一直是不变的,则存在潜在的不安全:攻击者今天攻破了第 1 个节点,过几天再攻破了第 2 个节点,一个月后共攻破 t 个节点,这也会造成秘密值 s 的泄露。 如果有一种方案可以“刷新”每个节点保存的部分秘密,同时保持整体秘密 s 不变,则系统的安全性将提升。这种方案被称为 Share Renewal Protocol(或者 Share Refresh Protocol)。学术上把节点上的部分秘密可以刷新的 Secret Sharing 称为 Proactive Secret Sharing。 如果刷新后,门限值 t 维持不变,则称为 Static 方案;如果刷新后,门限值 t 可以改变,则称为 Dynamic 方案。

注:如果我们有一个可信赖的第三方(“trusted dealer”),则这个事情将很简单:节点把各自的“部分秘密”发送给“trusted dealer”,“trusted dealer”恢复出原始秘密值 s ,再执行一次 Shamir's Secret Sharing 过程就可以实现各节点“部分秘密”的刷新了。不过,“trusted dealer”是掌握了完整秘密值 s 的单点,它的存在会降低系统的安全性。所以我们考虑的是刷新过程中不存在“trusted dealer”的情况。

2. Herzberg's Method

1995 年,Herzberg 在论文 Proactive Secret Sharing Or: How to Cope With Perpetual Leakage 提出了 Share Renewal Protocol 和 Share Recovery Protocol,下面将介绍它。

假设,已经通过 Shamir's Secret Sharing 方案,设置门限为 t=3 ,把秘密值 s=5 分散给了 n=4 个参与者 Alice/Bob/Carol/Dave,如图 1 所示,原始的多项式 f(x)=x24x+5 ,Alice 分配到的“部分秘密”为 f(1)=2 ,Bob 分配到的“部分秘密”为 f(2)=1 ,Carol 分配到的“部分秘密”为 f(3)=2 ,Dave 分配到的“部分秘密”为 f(4)=5

f(1) = 2      # Alice's share
f(2) = 1      # Bob's share
f(3) = 2      # Carol's share
f(4) = 5      # Dave's share

而秘密值 s=f(0)=5 ,由于门限 t=3 (多项式次数是 2),Alice/Bob/Carol/Dave 中任意 3 个人都可以利用拉格朗日插值得到 f(x) ,从而恢复出秘密值 s

static_pss_1.svg

Figure 1: Shamir's Secret Sharing

2.1. Share Renewal Protocol

接着前面的例子,如何实现刷新 Alice/Bob/Carol/Dave 的“部分秘密”,但同时保持秘密值 s=5 不变呢?

第 1 步、随便某个人(比如 Alice),随机地生成一个 满足条件 g(0)=0 的 2 次多项式 g(x) ,假设为 g(x)=x22x ,计算出 g(1),g(2),g(3),g(4) ,如图 2 所示,分别给 Alice/Bob/Carol/Dave:

g(1) = -1     # Alice 自己留着
g(2) = 0      # 发送给 Bob
g(3) = 3      # 发送给 Carol
g(4) = 8      # 发送给 Dave

static_pss_2.svg

Figure 2: g(x) 是随机的 t1 次多项式,但要满足 g(0)=0

第 2 步、Alice/Bob/Carol/Dave 分别把各自保存的部分秘密 f(1),f(2),f(3),f(4) 加上 g(1),g(2),g(3),g(4) ,作为新的部分秘密:

f'(1) = f(1) + g(1) = 1      # Alice's new share
f'(2) = f(2) + g(2) = 1      # Bob's new share
f'(3) = f(3) + g(3) = 5      # Carol's new share
f'(4) = f(4) + g(4) = 13     # Dave's new share

由于生成 g(x) 时满足了条件 g(0)=0 ,所以这个变换后, f(0)=f(0)+g(0)=f(0)=5 ,这样维持了整体秘密 s 不变。Alice/Bob/Carol/Dave 中任意 3 个人都可以利用拉格朗日插值得到 f(x)=f(x)+g(x)=2x26x+5 ,从而恢复出秘密值 s

上面的步骤中,只有一个参与者(Alice)随机生成了一个 2 次多项式 g(x) ,这样就可以完成了部分秘密的刷新。

当然,Alice 不应该被特殊化,也就是其他参与者都可以随机生成的一个 2 次多项式(但也要满足 x=0 处的值为 0),再计算 x=1,2,3,4 几个点的值,然后发送给其它人。比如,Bob 随机生成 h(x)=2x24x ,如图 3 所示。

static_pss_3.svg

Figure 3: Alice 生成 g(x)=x22x ,Bob 生成 h(x)=2x24x

h(1) = -2     # 发送给 Alice
h(2) = 0      # Bob 自己留着
h(3) = 6      # 发送给 Carol
h(4) = 16     # 发送给 Dave

每个节点收到 Bob 发送来的数据后,更新自己的部分秘密:

f'(1) = f(1) + g(1) + h(1) = -1      # Alice's new share
f'(2) = f(2) + g(2) + h(2) = 1       # Bob's new share
f'(3) = f(3) + g(3) + h(3) = 11      # Carol's new share
f'(4) = f(4) + g(4) + h(4) = 29      # Dave's new share

同样地,由于 h(0)=0 ,所以各自的部分秘密在刷新后并不会影响到整体秘密 s

类似地,Carol/Dave 也可以各自随机生成的一个 2 次多项式(但也要满足 x=0 处的值为 0),计算 x=1,2,3,4 几个点的值,然后发送给其它人。

2.1.1. 形式化描述

4 是 Herzberg 在论文中对 Share Renewal Protocol 的描述。

static_pss_herzberg_renewal.gif

Figure 4: Herzberg's Share Renewal Protocol

2.1.2. 演示代码

https://asecuritysite.com/encryption/pro_sss2 中有个 Python 实现的 Proactive Secret Sharing 的演示代码。

2.2. Share Recovery Protocol

接着看节 2 中的例子:

f(1) = 2      # Alice's share, but missing
f(2) = 1      # Bob's share
f(3) = 2      # Carol's share
f(4) = 5      # Dave's share

假设 Alice 保存的“部分秘密”丢失了(比如它的电脑磁盘坏了)。Bob/Carol/Dave 可以帮助 Alice 恢复出他丢失的“部分秘密”(即数字 2)吗?解决这个问题的协议被称为 Share Recovery Protocol。

有一种简单的办法,就是 Bob/Carol/Dave 直接把他们掌握的秘密发送给 Alice,Alice 可以通过拉格朗日插值还原出 f(x)=x24x+5 ,从而恢复出 f(1)=2 。但这显然有个安全问题:Alice 同时也知道了秘密值 s=5 ,这是不允许的。

其实,我们可以采用节 2.1 类似的思路来解决这个问题。

第 1 步,Bob 随机地生成一个 t1 (即 2)次多项式 r(x) ,这个 随机多项式要满足条件 r(i)=0 ,这里 i 为 Alice 的对应编号,即 i=1 。假设随机生成的多项式为 r(x)=(x1)(x+3) ,计算出 r(2),r(3),r(4) ,分别发送给 Bob/Carol/Dave:

r(2) = 5       # Bob 自己留着
r(3) = 12      # 发送给 Carol
r(4) = 21      # 发送给 Dave

第 2 步,Bob/Carol/Dave 分别把各自保存的部分秘密 f(2),f(3),f(4) 再加上 r(2),r(3),r(4) ,并把结果发送给 Alice:

f(2) + r(2) = 6         # Bob 把这个值发送给 Alice
f(3) + r(3) = 14        # Carol把这个值发送给 Alice
f(4) + r(4) = 26        # Dave 把这个值发送给 Alice

第 3 步,Alice 收到 Bob/Carol/Dave 发来的 3 个值,通过拉格朗日插值,可由 3 个点 (2,6),(3,14),(4,26) 还原出一个 2 次多项式 s(x)=2x22x+2 ,然后 Alice 自己的部分秘密就是 x=1 时的值 s(1)=2 。从而 Alice 顺利恢复出了丢失的部分秘密,这个过程中 Alice 并不知道整体秘密 s=5

注:和节 2.1 类似,除了 Bob 随机生成一个 2 次多项式外,Carol/Dave 也可以各自随机生成的一个 2 次多项式,满足 x=1 (1 是 Alice 的编号)时多项式值为 0 即可。

2.2.1. 形式化描述

5 是 Herzberg 在论文中对 Share Recovery Protocol 的描述。

static_pss_herzberg_recovery.gif

Figure 5: Herzberg's Share Recovery Protocol

3. 参考

Author: cig01

Created: <2020-11-15 Sun>

Last updated: <2020-12-06 Sun>

Creator: Emacs 27.1 (Org mode 9.4)