安全求和问题

安全求和

所谓安全求和,是这样一个问题:有 n ( n > 2 ) n (n > 2) n(n>2)个数 a 1 , a 2 , ⋯   , a n a_1,a_2,\cdots,a_n a1,a2,,an,分别掌握在 n n n个人手中(为了方便,数 a i a_i ai同时也代表第i个人)。我们想要获得这 n n n个数的和,但是不会暴露其中任何一个人的值。即,公开 s u m = ∑ i = 1 n a i sum=\sum_{i=1}^{n}a_i sum=i=1nai,但是除了第 i i i个人,其他人不知道 a i a_i ai的值。

方法一:同态加法

可以采用同态加密,比如Paillier同态加密、BGV、BFV或者CKKS,对这 n n n个数进行同态加密,然后计算和,最后解密得到 s u m sum sum
这个方法很基础简单,但是,需要一个服务器 s 1 s_1 s1来产生密钥。然后,将公钥发给每一个人。所有人分别将自己手中的数加密,然后发给一另一个服务器 s 2 s_2 s2 s 2 s_2 s2计算和,然后,发送给 s 1 s_1 s1解密得到最后的结果。
值得注意的是 s 1 s_1 s1 s 2 s_2 s2是不能合谋的。否则, s 2 s_2 s2将收到的密文发送给 s 1 s_1 s1 s 1 s_1 s1就可以解密得到任何一个数的值了。

方法二:随机切分

对于 a i a_i ai,我们将其随机分成 n n n份,也就是 a i = ∑ j = 1 n b i j a_i=\sum_{j=1}^{n}b_{ij} ai=j=1nbij
最简单的方法是选取 n − 1 n-1 n1个随机数,然后用 a i a_i ai减去这 n − 1 n-1 n1个数,就得到了 n n n个和为 a i a_i ai的数。
然后将 b i j b_{ij} bij发送给第 j j j个人。
这样,每个人都收到到了 n − 1 n-1 n1个从其他人发来的数,再加上自己没有发出去或者发给自己的数 b i i b_{ii} bii,共有 n n n个数,将这 n n n个数相加得到 c i c_i ci,再分发给其他人。待收到了其他第二次发送过来的数 c j ( j ≠ i ) c_j(j \neq i) cj(j=i)后,将收到的 n − 1 n-1 n1个和与自己计算的和 c i c_i ci相加,就得到了最终的和 s u m sum sum.
对于任意一个 a i a_i ai的拥有者,我们考虑他的计算。首先他收到 b 1 i , b 2 i , ⋯   , b n i b_{1i},b_{2i},\cdots,b_{ni} b1i,b2i,,bni,然后加起来得到 c i = ∑ j = 1 n b j i c_i=\sum_{j=1}^{n}b_{ji} ci=j=1nbji
他将 c i c_i ci发送出去,并收到 c 1 , c 2 , ⋯   , c n c_1,c_2,\cdots,c_n c1,c2,,cn。然后 s u m = ∑ i = 1 n c i sum=\sum_{i=1}^{n}c_i sum=i=1nci
证明:
s u m = ∑ i = 1 n c i = ∑ i = 1 n ∑ j = 1 n b j i = ∑ j = 1 n ∑ i = 1 n b j i = ∑ j = 1 n a j \begin{aligned} sum&=\sum_{i=1}^{n}c_i\\ &=\sum_{i=1}^{n}\sum_{j=1}^{n}b_{ji}\\ &=\sum_{j=1}^{n}\sum_{i=1}^{n}b_{ji}\\ &=\sum_{j=1}^{n}a_j \end{aligned} sum=i=1nci=i=1nj=1nbji=j=1ni=1nbji=j=1naj

方法三:秘密分享

不妨设这 n n n个数的拥有者之间是有序的,即 a 1 a_1 a1的拥有者在 a 2 a_2 a2的拥有者的前面。
然后,在任意两个人 a i a_i ai a j a_j aj之间使用共享一个秘密的随机数 s i j s_{ij} sij
对于任意一个人 a i a_i ai,计算 b i = a i + ∑ u = 1 i − 1 s u i − ∑ v = i + 1 n s i v b_i=a_i+\sum_{u=1}^{i-1}s_{ui}-\sum_{v=i+1}^{n}s_{iv} bi=ai+u=1i1suiv=i+1nsiv
b i b_i bi分发给其他人,并且接受其他人发来的 b j b_j bj
最后计算 s u m = ∑ i = 1 n b i sum=\sum_{i=1}^{n}b_i sum=i=1nbi
显然,对于任意一个 s i j s_{ij} sij都被计算两遍,如果 i < j i<j i<j则加上 s i j s_{ij} sij,否则减去 s i j s_{ij} sij
这样,刚好在最终的和里抵消。

猜你喜欢

转载自blog.csdn.net/watqw/article/details/123945046