共享随机数
本次科普主要介绍多方比较的实现方法。回忆一下,之前介绍过的Shamir(t,n)秘密分享协议可以实现秘密分享,Shamir(t,n)协议主要基于拉格朗日插值,也可以通俗地理解成个方程求解个未知数。
BGW协议可以实现单比特分享,本次要介绍另一个比特分享方式。利用比特分享的方式,可以对比特的一个数按比特进行多方分享,之后可以据此实现多方比较。多方比较则可以用来构造安全多方计算的基础模块,无论是隐私保护的机器学习还是隐私保护的DNA比较等,都需要用到多方比较模块。
按比特分享
如有一个比特串\( =__{-1}…_1 \),\( _1 \)到\( _ \)分别是组成的各个比特,即的值为\( a=\sum {_{i=1}^{l}} 2^{i-1} a_{i} \)。对进行比特分享即对的各个比特进行分享,每个参与者拿到\( _1,…,_ \)的个子秘密。将参与者\( _ \)拿到的\( _ \)的子秘密记为\( _{,} \),则对比特长的进行比特分享后参与者\( _ \)能够获得\( _{1,},_{2,},…,_{,} \)。
首先简要介绍一个多个参与者共同产生同一个随机数的方式:假设有个参与者\( _1,…,_ \),每个参与者\( _ \)都产生一个随机数\( _ \),并通过Shamir(t,n)秘密分享机制将\( _ \)进行分享,记\( _{,} \)为参与者\( _ \)获得的\( _ \)的子秘密。因此当每个参与者都产生随机数并分享后,参与者\( _ \)可以获得\( _{1,},…,_{,} \)。
多方随机数生成
参与者\( _ \)获得子秘密\( _{1,},…,_{,} \)之后,将它们进行累加,将累加结果记为\( {_}' \),\( r_{i}^{\prime}=\sum{_{j=1}^{n}} r_{j, i} \)。用符号表示\( _1,…,_ \)之和,即\( r=\sum{_{i=1}^{n}} r_{i} \),则\( {_}' \)就是的一个子秘密。
因为\( _{1,} \)是\( _1 \)的一个子秘密,\( _{,} \)是的一个子秘密,由于Shamir(t,n)具有可加性(在第二次科普中介绍过)。假设参与者\( _1 \)的\( _1 \)的秘密分配函数是\( _1() =_{t-1}^{t-1}+⋯+_1+_1 \),参与者\( _2 \)的\( _2 \)的秘密分配函数是\( _2()=_{t-1}^{t-1}+⋯+_1+_2 \),则参与者\( _1 \)和\( _2 \)分配给参与者\( _ \)的子秘密分别为\( _{1,}=_1() \)和\( _{2,}=_2() \),二者相加为:
\( _{1,}+_{2,}=_1()+_2()=(_{t-1}+_{t-1})^{t-1}+⋯+(_1+_1)+_1+_2 \)
即\( _{1,}+_{2,} \)也是\( _1+_2 \)的一个子秘密,\( _{1,1}+_{2,1},_{1,2}+_{2,2},…,_{1,}+_{2,} \)也是\( _1+_2 \)的子秘密。
同理\( {_}'=_{1,1}+⋯+_{,1}, {_2}'=_{1,2}+⋯+_{,2}, {_}'=_{1,}+⋯+_{,} \)是\( r=\sum{_{i=1}^{n}} r_{i}=r_{1}+\cdots+r_{n} \)的子秘密。
注意此时每个参与者\( _ \)都不知道其他参与者产生的随机数\( _ \),因此参与者\( _ \)也无法计算出的具体值,但是他通过计算\( r_{i}^{\prime}=\sum{_{j=1}^{n}} r_{j, i} \)可以计算出的一个子秘密\( {_}' \)。通过每个参与者都产生一个随机数并进行秘密共享,所有参与者共同协作产生了一个随机数\( r=\sum{_{i=1}^{n}} r_{i} \),但是每个参与者\( _ \)都不知道的具体值,都只掌握的一个子秘密\({_}' \)。
随机单比特分享(Joint Random Bit Sharing)
在学习了多方共同产生随机数后,可以利用此来实现多方的随机单比特分享,每个参与者拿到一个随机比特的Share,在重构之前每个参与者都不知道该随机比特的具体值。首先所有参与者利用上节所讲述的共享随机数生成方式共同生成一个随机数,将其记为,将参与者\( _ \)拿到的的子秘密记为\( {_}' \)(保持与上节的符号统一),用[]表示处于被分享成子秘密的状态,[]由\( {_1}',…,{_}' \)组成。
之后通过第二次科普介绍的Shamir多方乘法,计算\( [^2] \),参与者\( _ \)能够计算出\( ^2 \)的一个子秘密。之后所有参与者分享自己计算出的\( ^2 \)的子秘密,即公开\( [^2] \),每个参与者通过公开的\( [^2] \)都可使用拉格朗日插值法重构出\( ^2 \),若重构出的\( ^2=0 \)则各方再重新生成随机数。
参与者\( _ \)在计算出\( ^2 \)后,计算\( r=\sqrt{r^2} \) ,由于这些操作都是在有限域内进行,因此0<<,此时能够计算出两个′′,′′=−或′′=。则\( (′′)^{-1} \)的逆乘上有两种结果,\( (′′)^{-1}=^{−1} \)或者\( (′′)^{-1}=1 \)。因为\( ′′\cdot(′′)^{-1}=1 \),当′′=时,\( (′′)^{-1}=^{-1}=1 \);当′′=−时,\( (′′)^{-1}= (−)^{-1} =(−1)\cdot^{-1}=−1 \)。 参与者可以约定选取\( 0<′′<\frac{q}{2} \),那么所有参与者就可以计算出相同的′′,参与者\( _ \)设置\( ^{-1}=(′′)^{-1} \)
对于参与者\( _ \)来说,\( _ \)掌握的子秘密\( {_}' \),\( _ \)设置\( _=2^{-1}((^{-1}){_}'+1) \),\( _ \)即为\( _ \)获得的随机比特的一个子秘密。因为参与者\( _ \)只知道,对于\( _ \)来说依旧有两种可能,分别是\( ±\sqrt{r^2} \),因此\( _ \)无法确定的值是0还是1,只有所有参与者对进行重构才能确定的值,从而计算出。是所有参与者共同产生的随机数,因此的值也是随机的,且在重构之前每个参与者都只掌握随机比特的一个子秘密,不知道的具体值。