假设有 n n n个用户 P 1 , P 2 , ⋯ , P n P_1,P_2,\cdots,P_n P1,P2,⋯,Pn. 秘密分享是说,有一个分享者将秘密 s s s分为 n n n份,分发给 n n n个用户。这样,每一个用户得到的,只是一个随机数,不能得到任何有关于 s s s的信息。但是,多个用户的秘密分享份额可以重构秘密 s s s. 一个实际的秘密分享方案是Shamir门限秘密分享。
分享者在使用 s s s构造一个 t − 1 t-1 t−1次的秘密多项式 f ( x ) = s + c 1 x + x 2 x 2 + ⋯ + c t − 1 x t − 1 f(x)=s+c_1x+x_2x^2+\cdots+c_{t-1}x^{t-1} f(x)=s+c1x+x2x2+⋯+ct−1xt−1,其中 c i c_i ci是随机数。 然后在 n n n个不同的点 x i , i = 1 , 2 , ⋯ , n x_i,i=1,2,\cdots,n xi,i=1,2,⋯,n求值,得到 f ( x i ) f(x_i) f(xi), f ( x i ) f(x_i) f(xi)就是用户 P i P_i Pi的分享份额。
Shamir门限方案在用户少于 t t t个的时候无法重建秘密,但是当用户大于等于 t t t个的时候,可以通过插值得到唯一的 f ( x ) f(x) f(x)从而恢复秘密 s s s. Shamir门限方案具有加法同态和乘法同态,也就是用户可以在重建秘密 s 1 , s 2 s_1,s_2 s1,s2的情况,可以通过在一些交互,计算出 s 1 + s 2 s_1+s_2 s1+s2和 s 1 × s 2 s_1 \times s_2 s1×s2的值。具体可以参考[1].
秘密分享通常是在有限域 Z p \mathbb{Z}_p Zp中运算,其中 p p p是一个素数。 在很多安全多方计算中,我们需要求一个数的逆元。一个数 a a a的逆元是说 a b ≡ 1 m o d p ab\equiv 1 \mod p ab≡1modp. 我们可以使用扩展的欧几里得算法求逆。
逆元存在的条件是 g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1,所以由贝祖定理,有 a b + k p = 1 ab+kp=1 ab+kp=1,也就是 a b m o d p = 1 ab \mod p=1 abmodp=1.
在使用欧几里得算法求 a , p a,p a,p的最小公因数的时候,我们就可以同步求出 b b b的值,也就是 a a a的逆元。在[2]中有详细的描述和代码实现。
现在我们来讨论用户如何在具有秘密份额时,同态计算逆元的秘密分享而不需要重建秘密。
论文[3]中给出了一种方案,通过随机数掩膜和交互来计算逆元。
假设秘密为 s s s,用户 P i P_i Pi的分享值为 ( x i , y i ) (x_i,y_i) (xi,yi),其中 y i = f ( x i ) y_i=f(x_i) yi=f(xi). 所有运算都在 Z p \mathbb{Z}_p Zp中进行。我们需要求 t t t 满足 s t m o d p = 1 st\mod p=1 stmodp=1.
第一步, P i P_i Pi产生一个随机数 r i r_i ri,然后将 r i r_i ri使用秘密分享,分享给每一个用户。即构造秘密多项式 R i ( x ) = r i + c 1 , i x + c 2 , i + ⋯ + c t − 1 , i x t − 1 R_i(x)=r_i+c_{1,i}x+c_{2,i}+\cdots +c_{t-1,i}x^{t-1} Ri(x)=ri+c1,ix+c2,i+⋯+ct−1,ixt−1. 然后计算 R i ( x j ) R_i(x_j) Ri(xj)并发给 P j , j = 1 , 2 , ⋯ , n P_j,j=1,2,\cdots,n Pj,j=1,2,⋯,n.
第二步,利用秘密分享的同态加,将所有的 r i r_i ri加起来,得到 r ′ = ∑ i = 1 n r i r^\prime=\sum_{i=1}^{n}r_i r′=∑i=1nri. 也就是, P i P_i Pi将计算新的分享值 z i = ∑ j = 1 n R j ( x i ) z_i=\sum_{j=1}^{n}R_j(x_i) zi=∑j=1nRj(xi).
第三步,利用秘密分享的同态乘,计算 r ′ s r^\prime s r′s的秘密分享值。也就是 P i P_i Pi计算 k i = z i y i k_i=z_iy_i ki=ziyi.
第四步,利用 k i k_i ki重建 r ′ s r^\prime s r′s,由于 r ′ r^\prime r′是一个谁都不知道的随机数,所以 r ′ s r^\prime s r′s不会泄露任何关于 s s s的信息。
第五步,如果 r ′ s r^\prime s r′s为0,那么重复第一至第四步。当然这里的 s s s不能为0,否则, r ′ s r^\prime s r′s就一直为0,用户就知道了 s s s为0. 然后使用扩展欧几里得算法求 r ′ s r^\prime s r′s的逆元 ( r ′ s ) − 1 (r^\prime s)^{-1} (r′s)−1。并将这个逆元分享给所有的用户。这里的重建 r ′ s r^\prime s r′s和计算逆元,可以由其中一个用户计算得到。然后将计算结果 ( r ′ s ) − 1 (r^\prime s)^{-1} (r′s)−1广播给所有用户。
第六步,每一个用户 P i P_i Pi计算最后的结果 b i = ( r ′ s ) − 1 z i b_i=(r^\prime s)^{-1} z_i bi=(r′s)−1zi. 显然,使用多项式插值后得到的结果 b = ( r ′ s ) − 1 r ′ = s − 1 b=(r^\prime s)^{-1} r^\prime =s^{-1} b=(r′s)−1r′=s−1.
[1] http://t.csdnimg.cn/SeMnv
[2] http://t.csdnimg.cn/CufYW
[3] Bar-Ilan, Judit, and Donald Beaver. “Non-cryptographic fault-tolerant computing in constant number of rounds of interaction.” Proceedings of the eighth annual ACM Symposium on Principles of distributed computing. 1989.