Secret Sharing 最早是 1979 年由 Adi Shamir 和 George Blakley 提出来的。很早看十万个为什么数学板块的时候,红楼梦里的王熙凤将百宝箱上了四把锁,将钥匙分为四份,每个人拿着两份,只有任意 2 个人一起来开箱子才能够把箱子打开(如下图),这应该也是一种(2-4)秘密分享的技术吧!但是这与现代的秘密分享还有不同。
秘密分享是将秘密分散到一群参与者/秘密享有者手中,每个参与者都持有秘密的一部分(之后我们称为秘密碎片),但只有足够量的秘密碎片组合在一起才能够组合成有用的秘密信息,单个的秘密部分对于整个秘密来说是没用的。如果一个系统将秘密信息分为 n 份,只要其中任意 t 份秘密或者更多就可以恢复出完整的秘密,而如果少于 t 份秘密碎片则不能得到关于秘密的任何信息,我们称其为一个 (t-n) 阈值方案(有时写为 (n-t) 阈值方案)。
秘密分享出现解决了加密的一个弊端,就是单个密钥的保存问题,秘密加密后仅有一个密钥,当只保存单个密钥时存在着丢失的风险,但分开保存多个密钥副本时,又存在密钥受到攻击和泄露的风险。秘密分享就很好的解决了这个问题,可以在银行账户、加密密钥和导弹发射码等重要信息的保护中应用。
许多秘密分享方案都声称具有理论上论证的安全性并且也的确如此,但是这样的方案因其特殊性也有诸多弊端:
- 每一个秘密碎片都至少和秘密大小(长度)相同,这点可以根据信息论知识简单可知,如果 (t-n) 方案中只有 t-1 个秘密碎片时得不到秘密的任何信息,那么另外一个秘密碎片一定具有了秘密的所有信息(这点和我们前面王熙凤分钥匙有些不同)。
- 所有的秘密分享方案一定采用了大量的随机比特。这是因为要分散一个比特的秘密到 t 个分享者手中必须使用 t-1 个随机比特,这样如果秘密信息长度是 k 的话,那么需要 k*(t-1) 长度随机比特。
为了避免这些问题,许多方案放弃了这种绝对安全而采用一种更有效率的方式,比如对每个碎片采用足够强度的算法加密。下面给出了一些常见的 secret sharing 方案: