写在前面
新人小白,仅供交流,如有错误,请留言,一定尽快更改。
论文:
Shamir, A… “How to share a secret.” Commun. ACM 22 (1979): 612-613.
论文翻译
摘要
在这篇文章中,我们展示了如何将数据
D
D
D 分成
n
n
n 份,这样它可以很容易地从任何
n
n
n 份中的
k
k
k 份重构成
D
D
D,但是与此同时,即使有
k
−
1
k - 1
k−1 份完整的知识也完全不能泄漏关于
D
D
D 的任何信息。这种技术为密码系统构建了健壮的密钥管理方案,这种方案即使不幸摧毁了一半的数据和暴露了一半的安全漏洞, 剩余的
(
2
n
−
1
)
(2n - 1)
(2n−1) 份也能安全可靠地运行。
关键词和短语:密码学、密钥管理、插值
1.介绍
在[4]中,刘考虑了以下问题:
11 位科学家正在从事一个秘密项目。他们希望将文件锁在一个柜子里,这样当且仅当有六个或更多科学家在场时才能打开柜子。最少需要多少锁?每个科学家必须携带的锁的最少钥匙数量是多少?
不难证明最小的解决方案每个科学家使用 462 把锁和 252 把钥匙。这些数字显然是不切实际的,而且随着科学家数量的增加,它们会呈指数级恶化。
译者思路:至少有6名科学家在场时才能打开柜子,求锁的最小数量,那么在某一次开柜子的事件中,有6把锁和6把钥匙,对应着6位科学家,从11位科学家选出6位的可能性有 C 11 6 = 462 C^6_{11}=462 C116=462 种。对于每一位科学家而言,其他10人都差一把钥匙,此时可能性有 C 10 5 = 252 C^5_{10}=252 C105=252 种。
在本文中,我们将问题概括为一个问题,其中秘密是一些数据 D D D (例如,安全组合)并且还允许使用非机械解决方案(操作这些数据)。我们的目标是将 D D D 分成 n n n 份 D 1 , ⋯ , D n D_1,\cdots, D_n D1,⋯,Dn ,满足: (1) 任意 k k k 个或更多个 D i D_i Di 碎片的知识使 D D D 易于计算; (2) 任何 k − 1 k-1 k−1 个或更少的 D i D_i Di 个碎片的知识使 D D D 完全无法确定(从某种意义上说,它的所有可能值都是等可能性的)。
这样的方案称为(k, n)阈值方案。
有效的阈值方案在密钥管理中非常有用。为了保护数据,我们可以加密数据,但为了保护加密密钥,我们需要一种不同的方法(进一步的加密只会改变问题,而不是解决问题)。最安全的密钥管理方案将密钥保存在一个单独的、守卫严密的位置(计算机、人脑或保险箱)。这个方案是非常不可靠的,因为某个意外就可以使信息无法访问(例如,计算机故障、人意外去世或保险箱被破坏)。一个显而易见的解决方案是将密钥的多个副本存储在不同的位置,但这提高了安全漏洞的威胁(计算机渗透、背叛或人为错误)。通过使用一个 ( k , n ) (k, n) (k,n) 阈值方案 ( n = 2 k − 1 ) (n = 2 k - 1) (n=2k−1),我们得到了一个非常健壮的密钥管理方案:即使 n n n 个碎片中 ⌊ n / 2 ⌋ = k − 1 \lfloor n / 2 \rfloor = k - 1 ⌊n/2⌋=k−1 个碎片都被摧毁了,我们也可以恢复初始密钥;同时即使安全漏洞暴露了剩余 k k k 个碎片中的 ⌊ n / 2 ⌋ = k − 1 \lfloor n / 2 \rfloor = k - 1 ⌊n/2⌋=k−1 个,我们的对手也不能重构密钥。
译者总结上方自然段:要保护数据就加密,要保护密钥就不能加密了,否则就是密钥套娃。 n n n 个密钥碎片中, k − 1 k-1 k−1 个碎片都暴露了,敌手也不能恢复密钥,但暴露了 k k k 个密钥的话,就敌手就能恢复密钥了。
在其他应用中,需要权衡的不是保密性和可靠性,而是安全性和使用方便性。例如,考虑一个公司对其所有支票进行数字签名(参见RSA[5])。如果给每个高管一份公司的秘密签名密钥副本,该系统很方便,但很容易被滥用。如果为了签署每张支票,需要公司所有高管的合作,那么这个系统是安全的,但很不方便。标准解决方案要求每张支票至少需要三个签名,并且要很容易通过 ( 3 , n ) (3,n) (3,n) 阈值方案实现。每个高管都拥有一个携带一份碎片 D i Di Di 的小磁卡,公司的签名生成设备用任意三个碎片生成(以及过后的破坏)实际签名密钥 D D D 的临时副本。设备不包含任何秘密信息,因此它不需要防止检查。不忠的高管必须至少有两名同伙才能在该方案中伪造公司的签名。
阈值方案非常适合于一些应用:一组相互怀疑、利益冲突的个体必须合作。理想情况下,我们希望合作建立在相互同意的基础上,但这一机制给予每个成员的否决权会使该组活动瘫痪。通过适当地选择 k k k 和 n n n 的参数,我们可以给出任意足够多的大多数权力来采取某些行动,期间还要给任意足够多的大少数人权力来阻止。
2.一个简单的 ( k , n ) (k,n) (k,n) 阈值方案
我们的方案基于多项式插值:给定二维平面
(
x
1
,
y
1
)
,
⋯
,
(
x
k
,
y
k
)
(x_1, y_1),\cdots,(x_k,y_k)
(x1,y1),⋯,(xk,yk) 上的
k
k
k 个点。对于不同的
x
i
x_i
xi,有且只有一个
k
−
1
k - 1
k−1 次的多项式
q
(
x
)
q(x)
q(x),使所有
i
i
i 满足
q
(
x
i
)
=
y
i
q(x_i) =y_i
q(xi)=yi。为了不失去一般性,我们可以假设数据
D
D
D 是(或可以被转化为)一个数字。为了把它分成
D
i
D_i
Di 份,我们随机选取一个
k
−
1
k-1
k−1 次多项式
q
(
x
)
=
a
o
+
a
1
x
+
⋯
+
a
k
−
1
x
k
−
1
q(x)=a_o+a_1x+\cdots+a_{k-1}x^{k-1}
q(x)=ao+a1x+⋯+ak−1xk−1,其中
a
o
=
D
a_o=D
ao=D,并计算:
D
1
=
q
(
1
)
,
⋯
,
D
i
=
q
(
i
)
,
⋯
,
D
n
=
q
(
n
)
.
D_1 = q(1),\cdots, D_i = q(i),\cdots,D_n = q(n).
D1=q(1),⋯,Di=q(i),⋯,Dn=q(n).
这段第一行的多项式可以被任意其他函数集合替代,这些函数很容易被求值和插值。
给定这些 D i D_i Di 值的 k k k 的任意子集(连同它们的识别指数),我们可以通过插值找到 q ( x ) q(x) q(x) 的系数,然后求 D = q ( 0 ) D=q(0) D=q(0)。另一方面,仅仅知道这些值的 k − 1 k-1 k−1的知识,是不足以计算D的。
为了使这个断言更精确,我们使用模运算而不是实数运算。对素数p取模的整数集构成了一个可以进行插值的域。给定一个整数数据 D D D,我们选择一个比 D D D 和 n n n 都大的素数 p p p。 q ( x ) q(x) q(x) 的系数 a 1 , ⋯ , a k − 1 a_1, \cdots,a_{k-1} a1,⋯,ak−1 是从 [ 0 , p ) [0,p) [0,p) 中的整数的均匀分布中随机选取的,并且计算 D 1 , ⋯ , D n D_1, \cdots,D_n D1,⋯,Dn 的值模 p p p。
现在让我们假设这 n n n 份碎片中有 k − 1 k-1 k−1 份被透露给了对手。对于 [ 0 , p ) [0,p) [0,p) 上的每个候选值 D ′ D' D′,他可以构造一个且仅有一个 k − 1 k-1 k−1 次的多项式 q ′ ( x ) q '(x) q′(x),这样对于 k − 1 k-1 k−1 个给定的参数满足 q ′ ( 0 ) = D ′ q '(0) =D' q′(0)=D′ 和 q ′ ( i ) = D i q '(i)=D_i q′(i)=Di。通过构造,这些 p p p 个可能的多项式是等可能的,因此对手绝对不能推导出 D D D 的真实值。
[1] 和 [3] 中讨论了用于多项式评估和插值的高效 O ( n l o g n 2 ) O(n log^2_n) O(nlogn2) 算法,但即使是简单的二次算法对于实际的密钥管理方案也足够快。如果数字 D D D 很长,建议将其分成较短的位块(短位块单独处理)以避免多精度算术运算。块不能任意短,因为 p p p 的最小可用值是 n + 1 n+1 n+1(在 [ 0 , p ) [0, p) [0,p) 中必须至少有 n + 1 n+1 n+1 个独立参数来计算 q ( x ) q(x) q(x))。然而,这并不是一个严重的限制,因为十六位模数(可以由廉价的十六位算术单元处理)足以满足多达 64,000 个 D i D_i Di 份的应用程序。
这种 ( k , n ) (k, n) (k,n) 阈值方案的一些有用属性(与机械锁和密钥解决方案相比)是:
(1)每份碎片的大小不超过原始数据的大小。
(2)当 k 保持不变时,
D
i
D_i
Di 份碎片可以动态添加或删除(例如,当高管加入或离开公司时),而不会影响其他
D
i
D_i
Di 碎片。 (只有当离职的高管使一个碎片完全无法访问,甚至对他自己也无法访问时,该碎片就会被删除。)
(3)在不改变原始数据
D
D
D 的情况下很容易改变
D
i
D_i
Di 碎片——我们只需要一个具有相同自由项的新多项式
q
(
x
)
q(x)
q(x)。这种类型的频繁更改可以大大增强安全性,因为安全漏洞暴露的碎片不能累积,除非它们都是
q
(
x
)
q(x)
q(x) 多项式的相同版本的值。
(4)通过使用多项式值的元组作为
D
i
D_i
Di 碎片,我们可以得到一个分层方案,其中确定 D 所需的片段数量取决于它们的重要性。例如,如果我们给公司总裁
q
(
x
)
q(x)
q(x) 的三个值,每个副总裁
q
(
x
)
q(x)
q(x) 的两个值,每个高管
q
(
x
)
q(x)
q(x) 的一个值,那么一个
(
3
,
n
)
(3, n)
(3,n) 阈值方案可以由任何三名高管,或任何两名高管(其中一位是副总裁)签署支票,或由总裁单独签署。
G.R. Blakley[2]最近开发了一种不同(且效率稍低)的阈值方案。