一、 Shamir 秘密共享 (SSS) 的数学原理
Shamir 秘密共享(Shamir's Secret Sharing)由密码学家 Adi Shamir 于 1979 年提出,它基于一个非常简单而强大的几何定理:
“在二维平面上,$k$ 个点可以唯一确定一条 $k-1$ 次的多项式曲线。”
- $1$ 个点确定无数条直线(0 次/常数或 $1$ 次);
- $2$ 个点可以唯一确定一条 $1$ 次直线($y = ax + b$);
- $3$ 个点可以唯一确定一条 $2$ 次抛物线($y = ax^2 + bx + c$);
- $k$ 个点可以唯一确定一条 $k-1$ 次多项式。
这个机制被称为 $(k, n)$ 门限方案(Threshold Scheme):将秘密切分为 $n$ 份碎片(Share),只要收集到任意 $\ge k$ 份碎片即可重构秘密;如果收集到的碎片数小于 $k$ 份,在数学上无法获得关于原秘密的任何信息。
1. 秘密切分 (Split)
假设要将一个秘密 $S$ 切分为 $n$ 份,并设定恢复门限为 $k$:
- 构造多项式:选取一个 $k-1$ 次多项式 $f(x)$,将秘密 $S$ 放在常数项上(即 $f(0) = S$),其余 $k-1$ 个系数 $a_1, a_2, \dots, a_{k-1}$ 随机生成:
$$f(x) = S + a_1 x + a_2 x^2 + \dots + a_{k-1} x^{k-1}$$
- 生成碎片:计算并分发 $n$ 个不同的点 $(x_i, y_i)$,其中 $x_i \ne 0$:
$$\text{Share}_1 = (1, f(1)), \quad \text{Share}_2 = (2, f(2)), \quad \dots \quad \text{Share}_n = (n, f(n))$$
2. 秘密重构 (Reconstruct)
如果获得了 $k$ 个不同的点 $(x_1, y_1), (x_2, y_2), \dots, (x_k, y_k)$,即可通过拉格朗日插值法(Lagrange Interpolation)计算出原多项式 $f(x)$,进而求出常数项 $f(0) = S$:
$$S = f(0) = \sum_{j=1}^{k} y_j \cdot \ell_j(0)$$
其中拉格朗日基函数在 $x=0$ 处的值为:
$$\ell_j(0) = \prod_{m=1, m \ne j}^{k} \frac{0 - x_m}{x_j - x_m} = \prod_{m=1, m \ne j}^{k} \frac{x_m}{x_m - x_j}$$
注(有限域 / Galois Field): 在实际密码学实现中,为了防止因浮点数精度丢失以及通过点的大小预测秘密范围,所有的计算(加减乘除)都会在有限域 $\text{GF}(p)$ 或 $\text{GF}(2^8)$ 上进行模运算(Modulo Operations)。
二、 Linux 命令行实践:使用 ssss 工具
在 Linux 中,最常用的 Shamir 秘密共享命令行工具是 ssss(Shamir's Secret Sharing Scheme)。
1. 安装工具
Debian / Ubuntu:
sudo apt update && sudo apt install ssssFedora / RHEL / CentOS:
sudo dnf install ssssArch Linux:
sudo pacman -S ssss
2. 密钥切分示例(生成碎片)
使用 ssss-split 命令。
假设我们要将一段强密码(例如 MySuperSecretPassphrase2026!)切分成 5 份碎片($n=5$),并且需要 至少 3 份($k=3$)才能还原:
ssss-split -t 3 -n 5
终端会提示你输入要保护的秘密(或通过管道传入):
Generating shares using a (3,5) scheme with dynamic security level.
Enter the secret, at most 128 ASCII characters: MySuperSecretPassphrase2026!
Press enter.
1-72f10d9e843110a26d7f9d...
2-39e24b7a05d8f632a0c21a...
3-a189f212bc04518e9d302b...
4-f082e66481bc92a83e0e11...
5-62b1a89c7d4133400192e5...
-t 3:设置恢复阈值(Threshold)为 3。-n 5:生成的总碎片数(Number of shares)为 5。- 输出的
1-xxx、2-xxx等即为分发给不同保管人的碎片。
3. 密钥重构示例(还原秘密)
使用 ssss-combine 命令。
假设此时仅收集到了编号为 2、3、5 的任意 3 份碎片(达到阈值 3):
ssss-combine -t 3
在交互界面中粘贴你收集到的 3 份碎片:
Enter 3 shares with valid prefixes.
Share (1/3): 2-39e24b7a05d8f632a0c21a...
Share (2/3): 3-a189f212bc04518e9d302b...
Share (3/3): 5-62b1a89c7d4133400192e5...
Resulting secret: MySuperSecretPassphrase2026!
只要碎片数量达标,原秘密就会被立刻计算并还原出来。如果只提供了 2 份碎片,系统将拒绝恢复或输出无意义的乱码。