# Shamir's Secret Sharing 秘密分享

Original: <https://lifelonglearn.ing/shamir-secret-sharing>

Author: [奶爸](https://lifelonglearn.ing/users/3b04650c-8231-499b-8ef0-381fc4d7efb0)

Published: 2022-10-29T16:07:07Z

Updated: 2026-09-27T06:57:43Z

Version: 1

> 作者 Shamir 是 RSA 命名中的 S。

如果你看不懂公式，可以跟着展开的简化公式一点一点跟着算来理解。​**本文是不安全的 Shamir's Secret Sharing 的简单例子，不能直接使用**​，

假设你有一些资产存放在保险库，这个保险库有设置一个密码，你想交给 `n` 个人保管，至少凑齐其中 `t` 个人才能打开保险库。

## split

1. 确定阈值，6 份密钥，至少 4 份密钥才能打开保险库，n = 6, t = 4
2. 秘密的选择打开保险库的正确密码 K，如 K=13
3. 秘密的选择 t-1 个随机数，如 a_1 = 8, a_2 = 19, a_3 = 11 （生成 t-1 个随机数的原因是解方程组要满足 **多项式数量** >= ​**未知数个数**​，达到了门限签名的目的）
4. 分别计算 P(x) = K + \sum\limits_{j=1}^{t-1}a_jx^j，6 份密钥计算分别展开 P(x) = K + a_1\cdot x^1 + a_2\cdot x^2 + a_3\cdot x^3 如下：
   P(1) = 13 + (8 \cdot 1^1) + (19 \cdot 1^2) + (11 \cdot 1^3) = 13 + 8 + 19 + 11 = 51
   P(2) = 13 + (8 \cdot 2^1) + (19 \cdot 2^2) + (11 \cdot 2^3) = 13 + 16 + 76 + 88 = 193
   P(3) = 13 + (8 \cdot 3^1) + (19 \cdot 3^2) + (11 \cdot 3^3) = 13 + 24 + 171 + 297  = 505
   P(4) = 13 + (8 \cdot 4^1) + (19 \cdot 4^2) + (11 \cdot 4^3) = 13 + 32 + 304 + 704  = 1053
   P(5) = 13 + (8 \cdot 5^1) + (19 \cdot 5^2) + (11 \cdot 5^3) = 13 + 40 + 475 + 1375 = 1903
   P(6) = 13 + (8 \cdot 6^1) + (19 \cdot 6^2) + (11 \cdot 6^3) = 13 + 48 + 684 + 2376  = 3121
5. 将 P(i) 作为密钥交给第 i 个人，不要被其他人看到

## recover

只要知道 4 个人的密钥和他们在所有人中的位置，即可还原出原始秘密 K。

1. 假设集齐了 P(2), p(3), P(5), P(6)
2. 接下来就是方程组求解了，我们知道 P(2), p(3), P(5), P(6)，求 K 和 a_j，方程组：
   K+ a_1\cdot 2^1 + a_2\cdot 2^2  + a_3\cdot 2^3 = 193
   K+ a_1\cdot 3^1 + a_2\cdot 3^2  + a_3\cdot 3^3 = 505
   K+ a_1\cdot 5^1 + a_2\cdot 5^2  + a_3\cdot 5^3 = 1903
   K+ a_1\cdot 6^1 + a_2\cdot 6^2  + a_3\cdot 6^3 = 3121
3. 使用 [四元一次方程组计算器](https://lifelonglearn.ing/r/go?url=aHR0cDovL3d3dy45OWNhbmthby5jb20vYWxnZWJyYS91bmtud240LnBocA==) 最终可解得：K=13, a_1 = 8, a_2 = 19, a_3 = 11

![image.png](https://lifelonglearn.ing/upload/204caa37-553d-e027-0c51-c87ab75591e2.png)

实际的要复杂一些，后面可能会去搞懂，毕竟这篇文章也是写在实际应用一年之后了。念念不忘，必有回响。
