跳转至

01 秘密共享

约 2475 个字 预计阅读时间 12 分钟

数学建模的第一个例子

Question

11名科学家正在进行一个秘密项目。他们希望把文件锁在一个柜子里,只有当6名或更多的科学家在场时,柜子才能被打开。问:需要的最小锁数是多少?每个科学家必须携带的最小钥匙数量是多少?

秘密共享-组合数学

首先,你想到了高中学过的组合数学!你决定先从基数比较少的情况入手,即只有5名科学家的情况。

特殊情况

问题背景

5人在保险柜内存放秘密文件,只有3人及以上在场才能打开,至少几把锁?每个人至少要带多少钥匙?

分析

  • 两个人过来的时候,必然至少有一把锁不能被打开。
    • 因为我们此时考虑最少锁的情况,所以取任意二人组合不能打开锁的数量为 \(1\)
    • 所以每把锁与一对(没有钥匙的)两人组合对应,要有\(C_{5}^{2}=10\)把锁
      • 为什么不能是两对?
      • ——因为两对都不能打开同一把锁的情况下,三个人过来的时候,就不能打开保险柜了。
  • 三个人过来的时候,必然能打开其中的一把锁。

    • 所以每人拥有他不在的两人组合对应的锁的钥匙,每人有\(C_4^2=6\)把钥匙
  • 记录如下:

A B C D E 谁没有钥匙?
1 AB
2 AC
3 AD
4 AE
5 BC
6 BD
7 BE
8 CD
9 CE
10 DE

\(\therefore\) 至少要有\(10\)把锁,每人有\(6\)把钥匙。

然后我们来考虑一般情况,即有\(2n+1\)名科学家的情况。

一般情况

设相关人共有\(2n+1\)人,其中\(n\)人组成的“少数”团体不能打开安全门,任意\(n+1\)人组成的“多数”团体可以打开安全门。

少数与多数

  • 两个不同的“少数”团体联合可成为多数团体
  • 任一“少数”团体和不属该团体的任一人联合可成为多数团体

需要几把锁?需要多少钥匙?

每把锁与一个“少数”团体对应,至少要有\(C_{2n+1}^n\)把锁。

每人拥有他不在的“少数”团体对应的锁的钥匙,每人有\(C_{2n}^n\)把钥匙。

秘密共享-密码学

在密码学里,有专业术语来表示这种情况,叫做门限机制\((t,n)\): 在\(n\)人之间共享秘密,其中任意 \(t\) 人可以重构出秘密,而任意 \(t-1\) 人都不能重构出秘密。

Shamir 门限机制 \((t,n)\)

基本思想

通过秘密多项式,将秘密\(s\)分解为\(n\)个秘密,分发给持有者,其中任意不少于\(t\)个秘密均能恢复密文,而任意少于\(t\)个秘密均无法得到密文的任何信息。

分发方法

假设有秘密 \(K\) 要保护,任意取\(t-1\)个随机整数\(\{x_1,\cdots,x_{t-1}\}\),构造如下多项式:

\[ f(c)=K+x_1c+x_2c^2+\cdots+x_{t-1}c^{t-1} \]

其中,\(K \in \mathbb{Z}\),就是我们的秘密。

\(n\)个不同的整数\(\{c_1,\cdots,c_n\}\),取公开大素数\(p>n+1,K\)。计算\(b_j\equiv f(c_j)(\mod p)\),将\((c_j,b_j)\)发送给第\(j\)个持有者。

证明可行性

就是判断任意\(t\)个方程是否有唯一解,任意\(t-1\)个方程是否有无穷多解。

任意\(t\)个方程是否有唯一解

\(t\)个方程,则有解对应的行列式:

\[ \begin{vmatrix} 1 & c_1 & c_1^2 & \cdots & c_1^{t-1} \\ 1 & c_2 & c_2^2 & \cdots & c_2^{t-1} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & c_t & c_t^2 & \cdots & c_t^{t-1} \\ \end{vmatrix} \]

由于\(c_i\)互不相同,所以行列式不为零,有唯一解。

任意\(t-1\)个方程是否有无穷多解

对于任意\(t-1\)个方程,由于我们有\(t\)个未知数,所以有无穷多解。

恢复秘密

任意\(t\)个持有者联合,可以构造\(t\)个方程,从而可以恢复出秘密。

例子:Secret:\(123\); Shamir\((3,5)\)

分配步骤

  1. 首先确定 \(t\)\(n\),这里 \(t=3,n=5\)
  2. 确定秘密 \(K=123\),取模数 \(p=127\)
  3. 秘密选择 \(t-1=2\) 个随机数 \(x_1=2,x_2=3\),构造多项式:

    \[ f(c)=123+2c+3c^2 \]
  4. 选择 \(n=5\) 个不同的整数 \(c_1=1,c_2=2,c_3=3,c_4=4,c_5=5\),计算 \(b_j\equiv f(c_j)(\mod p)\),然后将 \((c_j,b_j)\) 发送给第 \(j\) 个持有者:

    \(c_j\) \(f(c_j)\) \(b_j\)
    1 128 1
    2 139 12
    3 156 29
    4 179 52
    5 208 81

恢复秘密

  1. 集齐任意\(t\)个钥匙,例如第一个人的\((c_1,b_1)\),第二个人的\((c_2,b_2)\),第五个人的\((c_5,b_5)\),则可以构造如下方程组:

    \[ \begin{cases} K+1\cdot x_1+1^2\cdot x_2\equiv 1(\mod 127) \\ K+2\cdot x_1+2^2\cdot x_2\equiv 12(\mod 127) \\ K+5\cdot x_1+5^2\cdot x_2\equiv 81(\mod 127) \\ \end{cases} \]

解得

\[ \begin{cases} K(\mod 127)=-4\\ x_1(\mod 127)=2\\ x_2(\mod 127)=3 \end{cases} \]

所以密码\(K=123\)

秘密共享-数论

线性同余方程

线性同余方程是指形如 \(ax\equiv b(\mod m)\) 的方程,其中 \(a,b,m\) 为整数,\(m>0\)

  • 当且仅当 \(gcd(a,m)|b\) 时,线性同余方程有解。
  • \(gcd(a,m)=1\) 时,方程的解为 \(a^{-1}b\),且小于 \(m\)的非负整数解唯一。
  • \(gcd(a,m)\neq 1\)的情况,例如\(6\cdot x \equiv 3(\mod 8)\),解为 \(x=3\)\(x=7\)
  • \(a^{-1}\)\(a\) 在模 \(m\) 意义下的逆元。
什么是逆?

\(a,b\) 为整数,\(m\) 为正整数,若 \(ab\equiv 1(\mod m)\),则称 \(a\)\(m\) 可逆,且 \(b\)\(a\) 在模 \(m\) 意义下的逆元,记为 \(a^{-1}\)

如何求逆?
大衍求一术

\(27^{-1}(\mod 64)\)

\[ \begin{vmatrix} 1 & 27 \\ 0 & 64 \\ \end{vmatrix} \]

其中,\(64=2\cdot 27+10\),所以

\[ \begin{vmatrix} 1 & 27 \\ 2 & 10 \\ \end{vmatrix} \]

其中,\(27=2\cdot 10+7\),所以

\[ \begin{vmatrix} 5 & 7 \\ 2 & 10 \\ \end{vmatrix} \]

其中,\(10=1\cdot 7+3\),所以

\[ \begin{vmatrix} 5 & 7 \\ 7 & 3 \\ \end{vmatrix} \]

其中,\(7=2\cdot 3+1\),所以

\[ \begin{vmatrix} 19 & 1 \\ 7 & 3 \\ \end{vmatrix} \]

所以 \(27^{-1}\equiv 19(\mod 64)\)

扩展欧几里得算法

用欧拉公式列出一系列等式,直到出现末尾的1。然后从最后一个等式开始,依次代入前面的等式,直到把\(gcd(a, b)\)写成\(sa + tm\)。其中,\(a\)的系数就是\(a^{-1}\)

例如,求\(27^{-1}(\mod 64)\)

\[ \begin{aligned} 64&=2\cdot 27+10\\ 27&=2\cdot 10+7\\ 10&=1\cdot 7+3\\ 7&=2\cdot 3+1 \end{aligned} \]

所以

\[ \begin{aligned} 1&=7-2\cdot 3=7-2\cdot (10-1\cdot 7)\\ &=3\cdot 7-2\cdot 10=3\cdot (27-2\cdot 10)-2\cdot 10\\ &=3\cdot 27-8\cdot 10=3\cdot 27-8\cdot (64-2\cdot 27)\\ &=19\cdot 27-8\cdot 64 \end{aligned} \]

所以 \(27^{-1}\equiv 19(\mod 64)\)

中国剩余定理

\(m_1,m_2,\cdots,m_k\) 为两两互质的正整数,\(a_1,a_2,\cdots,a_k\) 为任意整数,记\(M = m_1m_2\cdots m_k\),则同余方程组

\[ \begin{cases} x\equiv a_1(\mod m_1)\\ x\equiv a_2(\mod m_2)\\ \vdots\\ x\equiv a_k(\mod m_k)\\ \end{cases} \]

有小于 \(M\) 的唯一正整数解\(x=M_1M_1^{-1}a_1+M_2M_2^{-1}a_2+\cdots+M_kM_k^{-1}a_k(\mod M)\),其中\(M_i=M/m_i\)\(M_i^{-1}\)\(M_i\)在模\(m_i\)意义下的逆元。

如何求解?
  1. 计算 \(M=m_1m_2\cdots m_k\)
  2. 计算 \(M_i=M/m_i\)
  3. 计算 \(M_i^{-1}\)
  4. 解为 \(x=M_1M_1^{-1}a_1+M_2M_2^{-1}a_2+\cdots+M_kM_k^{-1}a_k(\mod M)\)

例如,求解 \(x\equiv 2(\mod 3),x\equiv 3(\mod 5),x\equiv 2(\mod 7)\)

\[ \begin{aligned} M&=3\cdot 5\cdot 7=105\\ M_1&=5\cdot 7=35,M_2=3\cdot 7=21,M_3=3\cdot 5=15\\ 35M_1^{-1}&\equiv 1(\mod 3),21M_2^{-1}\equiv 1(\mod 5),15M_3^{-1}\equiv 1(\mod 7)\\ M_1^{-1}&=2,M_2^{-1}=1,M_3^{-1}=1\\ x&=35\cdot 2\cdot 2+21\cdot 1\cdot 3+15\cdot 1\cdot 2=233\equiv 23(\mod 105) \end{aligned} \]

Asmuth-Bloom 门限机制

参数选取

记秘密为\(K\)\(n\)个人,\(t\)个人可以恢复秘密。

选取两两互素的整数\(p\)\(m_1,m_2,\cdots,m_n\),满足\(p>K\)以及\(m_1<m_2<\cdots<m_n\),且

\[ \frac{m_1\cdots m_t}{m_{n-t+2}\cdots m_n}>p \]

也就是说任意\(t\)个整数的乘积都大于\(p\)乘以任意\(t-1\)个整数的乘积。

秘密分割

为了选出一个能代表\(K\)的数\(K'<m_1\cdots m_t\),我们选取一个随机数\(r\in \mathbb{N}\),满足\(0\leq r \leq \frac{m_1\cdots m_t}{p}-1\)。记\(K'=K+rp\)

\(K'=K+rp\leq K+(\frac{m_1\cdots m_t}{p}-1)p=K+m_1\cdots m_t-p\leq m_1\cdots m_t\)

\(k_j \equiv K'(\mod m_j),1\leq j\leq n\),将秘密份额\((k_j,m_j)\)分发给第\(j\)个持有者。

秘密恢复

\(t\)个持有者联合时,由\((k_j,m_j)\),可构建方程组

\(k_j \equiv K'(\mod m_j)\)也就意味着\(K'\equiv k_j(\mod m_j)\)

\[ \begin{cases} x\equiv k_1(\mod m_1)\\ x\equiv k_2(\mod m_2)\\ \vdots\\ x\equiv k_t(\mod m_t)\\ \end{cases} \]

然后可由中国剩余定理求解\(x\)

证明可行性

判断任意\(t\)个方程可行,任意\(t-1\)个方程不可行。

为什么任意\(t\)个方程可行?

由于中国剩余定理,所以任意\(t\)个方程都有小于\(m_{k_1}m_{k_2}\cdots m_{k_t}\)的唯一解\(x\)

当我们限制了\(K'<m_1\cdots m_t\)

那么\(n\)个方程解出来有唯一解\(K'<m_1\cdots m_t \leq m_{k_1}m_{k_2}\cdots m_{k_t}\)

而对任意\(t\)个方程能解出唯一解\(x \leq m_{k_1}m_{k_2}\cdots m_{k_t}\),由于区间的限制以及解的唯一性,所以\(x=K'\)

如果\(x\neq K'\),则\(t\)个方程的解不唯一,与中国剩余定理矛盾。

K'

为什么任意\(t-1\)个方程不可行?

因为对任意\(t-1\)个方程,我们解出的那个唯一解\(x<m_{k_1}m_{k_2}\cdots m_{k_{t-1}}\)的。

\(m_{k_1}m_{k_2}\cdots m_{k_{t-1}}<q*m_{k_1}m_{k_2}\cdots m_{k_t}\)

所以在\(m_{k_1}m_{k_2}\cdots m_{k_{t-1}}\)\(q*m_{k_1}m_{k_2}\cdots m_{k_t}\)之间,仍有数解,所以不可行。