
有些秘密重要到不能让一个人独占,也重要到不能因为一个人消失就丢失。
公司想要至少三个高管同时在场才能用主密钥。家庭想要账户恢复需要不止一个信封。团队想要一份备份能在某个成员失联时仍然能恢复,又不至于把整把钥匙交给任何单一个人。
Adi Shamir(RSA 中的那个 S)在 1979 年提出了一个优雅的解决方案:把秘密拆成 N 份,任意 K 份能恢复出原始秘密,少于 K 份则完全无法推出任何信息。注意是”完全无法推出”,不是”很难破解”。
核心思想一页纸就讲完。
两点确定一条直线。一个点不行——经过单一点的直线有无穷多条,每条与纵轴的交点都不同。
现在把秘密藏在某条直线与纵轴的交点。假设秘密是 7。画一条经过 (0, 7) 的随机斜率直线,斜率本身不重要——它只是用来”遮住”秘密的随机量。
给每个人这条直线上的一个点(不是直线本身)。一个人拿到一个点,他能想象出无穷条经过这个点的直线,每条都对应一个不同的”秘密”。他手里那个点,对所有可能的秘密都”兼容”,所以单独看什么都不告诉他。
两个人凑在一起,直线就唯一确定了。然后秘密就是直线在 x=0 时的 y 值。
这就是 2-of-n 方案。想要更高门槛,就换更”弯”的曲线——抛物线需要三个点确定,三次曲线需要四个点。一般地,门槛 k 对应 k-1 次多项式。
工程实现里会用有限域算术替代普通实数运算,但形状还是同一个:秘密在 x=0,随机系数遮住它,每份 share 就是多项式上的一个点。
它真正的价值不是”少于 k 份算起来很难”,而是”少于 k 份在数学上完全没有信息”——少一份,每个可能的秘密都仍然成立。

