基于挂锁的(k,n)门限
有这样的一条新闻,某小区业主使用66把锁串联锁住了小区大门,保证只有小区住户才能打开其中一把锁,打开大门。

这种将锁串联的操作实现了一种可以理解为“或”的逻辑。从另一种角度理解,这可以被看作一种(1,n)门限方案,即小区的n个业主中,只要有一位同意,即可开锁。
进一步的,通过将锁并联,我们可以构造出“与”逻辑,从而实现(k,n)门限方案。
例如,当k=2,n=3时,记参与的三方为A,B,C,一个简单的方案如下(假设锁可以复制):
方案一:
A B
A C
B C
(其中横向表示串联,纵向表示并联) 可以看到,该方案需要6把锁,每一方需要1把钥匙。然而,我们还有另一种方案:
方案二:
a
b
c
其中,A携带钥匙bc,B携带钥匙ac,C携带钥匙ab。如此以来,我们只需要使用3把锁,但代价是每一方需要携带2把钥匙。
下面的证明可略过
假设锁不可复制,但是钥匙可以复制。我们接下来研究(k,n),k≥2门限问题中需要的锁的最小数量以及每个参与者需要携带的钥匙数量。我们需要保证:
假设锁数量为s,这些锁构成了一个集合L。将第i组k−1个参与者不能打开的锁记为ui。从必要性条件我们有∣ui∣>0。从充分性条件知U={u1,u2,...}构成L的一个划分,且∣U∣=Cnk−1。为了得到最小需要的锁的数量,取∣ui∣=1,因此s最小为Cnk−1。
进一步的,对于一个参与者A,我们从剩下的n−1名参与者中挑出一组k−1名参与者,从上述必要性条件知A至少拥有一把他们没有的钥匙。同时由充分性条件知任意两组k−1个参与者至少缺少两把钥匙。因此A至少要有Cn−1k−1把钥匙。即每一位参与者所需要的最少的钥匙数量为Cn−1k−1。
在Shamir的论文中,他提到一个(6,11)的门限方案需要至少462把锁,每个参与者需要携带252把钥匙,这是不切实际的。
拉格朗日插值
拉格朗日插值是Shamir秘密共享的核心。对于给定的k个点(x1,y1),(x2,y2),...,(xk,yk),拉格朗日插值法能够计算出通过这些点的多项式。利用该方法给出的k阶多项式形式如下:
L(x)=i=1∑kyili(x) 直觉上来看,为了让该多项式在x=xi时取值为yi,我们需要保证
li(x)={10,x=xi,x=xi 因此我们可以构造li(x)如下:
li(x)=j=1,j=i∏kxi−xjx−xj 可以看到,当x=xi时,每一项都为1,否则总有一项分子为0,该构造满足上述要求。我们构造出的多项式L(x)被称为拉格朗日多项式。
可以证明,对于k个点,我们可以构造出一个唯一的k−1阶拉格朗日多项式。
Shamir协议
协议描述
Shamir对之前提到的(k,n)门限方案给出了更严格的限制:假设要共享的秘密为D,将D分为n份D1,D2,...,Dn,该方案应当能保证
可以从D1,D2,...,Dn中的任意k份数据简单的计算出D
即使持有D1,D2,...,Dn中的任意小于k份数据,也无法得知任何关于D的信息
通过将上述拉格朗日插值的过程倒转过来,我们很容易得到Shamir秘密共享的基本思想: 给定一个k−1阶多项式
L(x)=D+a1x+a2x2+...+ak−1xk−1 其中D为要共享的秘密。计算D1=L(1),...,Di=L(i),...,Dn=L(n),将(i,Di)分别分发给秘密共享的参与方,那么只要其中k方合作,即可唯一确定该拉格朗日多项式L(x),并可以简单地求出D=L(0)。
协议安全性证明
在实际应用中,该多项式可以被定义在素域Fp上,其中多项式的每一个系数是从素域中随机选取的非零且不等元素。假设一位攻击者拥有k−1部分数据,且
D=L(0)=i=1∑kDili(0),where xi=i 因此
Dklk(0)=D−i=1∑k−1Dili(0),where lk(0)=j=1∏k−1k−xj0−xj 注意上式中,只有黄色的部分不是常量。由于我们的操作在素域上进行,上式给出了一个D和Dk之间的一对一映射关系。因此通过这些数据生成的多项式共有p个,且由它们得到秘密D的可能性相等,攻击者无法获得任何关于D的信息。
参考资料
Shamir1979 - How to share a secret
https://crypto.stackexchange.com/questions/64082/formal-proof-of-shamirs-secret-sharing-scheme-security