安全多方计算的研究主要是针对无可信第三方的情况下,如何保证各方数据安全的同时利用多方数据进行计算,得到预期结果。
安全多方计算不是指某一单独的协议, 而是一些关键技术集合,比如:秘密共享、混淆电路、不经意传输等等。
今天来记录一下学习Shamir 秘密共享方案 和Feldman可验证的秘密共享方案的笔记。
首先提出问题——平均工资问题
A、B、C、D 如果在不暴露自己工资的情况下,求得四人的平均工资?
最简单的方案如下:
1,A生成一个随机数,将其与自己的工资相加,用B的公钥加密发送给B
2,B用自己的私钥解密,加进自己的工资,然后用C的公钥加密发送给C
3,C用自己的私钥解密,加进自己的工资,然后用D的公钥加密发送给D
4,D用自己的私钥解密,加进自己的工资,然后用A的公钥加密发送给A
5,A用自己的私钥解密,减去原来的随机数得到工资总和
6,A将工资总和除以人数得到平均工资,宣布结果
存在问题:
该协议假定所有参与者都是诚实的不会谎报工资,A不谎报结果。
如何保证节点诚实?且A不谎报结果?
一般的解决方案是运用比特承诺协议让A向B传送他的随机数但这种方案会导致协议结束后,B知道了A的工资。
其他还有什么更好的方案吗?
秘密分享!
什么是秘密共享?
秘密共享是信息安全和数据保密中的重要手段,它在重要信息和秘密数据的安全保存、传输及合法利用中起着非常关键的作用。
秘密共享由两个算法——秘密份额的分配算法和秘密的恢复算法构成。
在执行秘密份额的分配算法时,分发者将秘密分割成若干份额在一组参与者中进行分配,使得每个参与者都得到关于该秘密的一个秘密份额;
秘密的恢复算法保证只有参与者的一些特定的子集才能有效的恢复秘密,其他子集不能有效地恢复秘密,甚至得不到关于秘密任何有用信息[1]。
最早被提出的秘密共享模型是门限类的秘密共享模型,Shamir 秘密共享方案就是一种门限秘密共享模型。
在 ( t , n ) \ (t,n) (t,n) 门限秘密共享体制中,秘密的持有者,把秘密分割成 n \ n n 个份额,分别分配于 n \ n n 个参与者,使得只要获得这 n \ n n 个份额中的至少 t \ t t个才可能有效地恢复出原来的秘密,而任何少于 t \ t t 个的份额集合都不能恢复出原来的秘密,得不到关于原秘密任何有用的信息。
Shamir秘密共享分案 算法流程
一共 n \ n n个节点( p 1 \ p_1 p1, p 2 \ p_2 p2,…, p n \ p_n pn)拥有自己的秘密值( v i \ v_i vi ),如何计算这 n \ n n个节点秘密的和,即求 v 1 \ v_1 v1+ v 2 \ v_2 v2+ v 3 \ v_3 v3+…+ v n \ v_n vn ?
基本思路: n个节点,各自将秘密分成n分,发给参与计算的其余n-1个节点,随后,节点收到来自其他节点的秘密碎片,加上自己的共n个,计算碎片的和,将所得的和再次发给其他参与计算的节点,等待收到t个来自其他节点的和之后即可得出最后结论。
步骤一:随机值的共享 ,每个节点拥有均需一份相同的 X \ X X={
x 1 \ x_1 x1, x 2 \ x_2 x2,…, x n \ x_n xn}
步骤二:各节点 p i \ p_i pi分别随机选择一个 t − 1 \ t-1 t−1 次的多项式 f i \ f_i fi ( f i ( x ) \ f_i(x) fi(x) = a i \ a_i ai x t − 1 \ x^{t-1} xt−1 + b i \ b_i bi x t − 2 \ x^{t-2} xt−2 + c i \ c_i ci x t − 3 \ x^{t-3} xt−3 +…+ v i \ v_i vi ),因此这里加上 v i \ v_i vi 在内一共产生了 t \ t t 个未知数( a i , b i \ a_i, b_i ai,bi,…),这 t \ t t 个数是只有当前节点才会知道的,且每个节点都会随机产生不同的 t \ t t 个未知数,其中