安全多方计算之使用秘密分享求逆

秘密分享

假设有 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 t1次的秘密多项式 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++ct1xt1,其中 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 ab1modp. 我们可以使用扩展的欧几里得算法求逆。

逆元存在的条件是 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++ct1,ixt1. 然后计算 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 rs的秘密分享值。也就是 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 rs,由于 r ′ r^\prime r是一个谁都不知道的随机数,所以 r ′ s r^\prime s rs不会泄露任何关于 s s s的信息。

第五步,如果 r ′ s r^\prime s rs为0,那么重复第一至第四步。当然这里的 s s s不能为0,否则, r ′ s r^\prime s rs就一直为0,用户就知道了 s s s为0. 然后使用扩展欧几里得算法求 r ′ s r^\prime s rs的逆元 ( r ′ s ) − 1 (r^\prime s)^{-1} (rs)1。并将这个逆元分享给所有的用户。这里的重建 r ′ s r^\prime s rs和计算逆元,可以由其中一个用户计算得到。然后将计算结果 ( r ′ s ) − 1 (r^\prime s)^{-1} (rs)1广播给所有用户。

第六步,每一个用户 P i P_i Pi计算最后的结果 b i = ( r ′ s ) − 1 z i b_i=(r^\prime s)^{-1} z_i bi=(rs)1zi. 显然,使用多项式插值后得到的结果 b = ( r ′ s ) − 1 r ′ = s − 1 b=(r^\prime s)^{-1} r^\prime =s^{-1} b=(rs)1r=s1.

参考文献

[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.

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值