|隐私数据在隐私AI框架中的安全流动( 三 )


p2将r发送给P0,P1 。 此时 , P0,P1都拥有一个相同的随机数r了 。
第三步 , 设置秘密分享值 。
按秘密分享 方案1的定义 ,P0 本地设置 x0 = x - r ,P1 本地设置 x1 = r 。 所以有:
P0:x0= 4f020-fdad72ecbfbefeb9 = 2528d134045f167
P1:x1= fdad72ecbfbefeb9
4f020是 323616 的十六进制表示 。
如果计算结果大于 64 bit 的空间范围 , 需要对结果取模(64 位空间) 。 下同 。
至此 , 我们获得了关于x的分享值 , share(x)=(x0,x1)=(x-r,r)=(2528d134045f167,fdad72ecbfbefeb9)
感兴趣的读者朋友可以验证一下(x0+x1)mod。
同理 , 我们对Bob的输入值进行一样的处理 。
上面三步 , 其实就是 private_console_input 的工作机制与过程 。 经过处理后 , 各方本地都存储着如下值:
我们用 Xi,Yi 表示 X,Y 在 Pi的分享值 。 (下同)
P2 为何是0呢?在本方案中 P2 作为一个辅助节点 , 不参与真正的逻辑计算 。
我们可以看到 , 在处理隐私数据输入的整个过程中 ,P0无法知道 Y 值 ,P1 无法知道 X 值 ,P2 无法知道 X 或 Y 值 。
最后 , 我们总结一下这三个主要阶段:
|隐私数据在隐私AI框架中的安全流动
本文插图

|隐私数据在隐私AI框架中的安全流动
本文插图

密文上的协同计算
这是计算的核心 。
上一步 , 我们保证了输入的安全 , 没有信息的泄漏 , 各方无法单独拿到其他节点的私有输入 。 接下来 , 看一下计算的代码 , 只有一行:
z = tf.multiply(x, y) # z = x * y在这个计算的过程中发生了什么?下面结合乘法(Multiply)算子原理进行实例讲解 。
Multiply 算子原理
乘法相对较为复杂 , 我们结合经典的 Beaver Triple方法[2]加以介绍 。 该方法是由密码学家 Donald Beaver在 1991 年提出 , 主要思想是通过乘法 。 协议基本原理如下:
输入:P0 拥有 X,Y的秘密分享值 X0,Y0;P1拥有X,Y的秘密分享值 X1,Y1 。
这里有 share(X) = (X0, X1) , share(Y) = (Y0, Y1) 。 在此案例中 , 这里的输入 , 就对接上一节所述的''隐私输入''的输出结果 。
计算步骤:
1.P2 本地生成一组随机数A,B,C , 且满足 C = A*B 。
A,B,C 的生成步骤:P2 随机生成 A0,A1,B0,B1,C0 , 令 A = A0 + A1,B = B0 + B1 , 得到C= A*B, C1 = C - C0 。 其中AI,BI,CI 是 A,B,C 的分享值 。 这些都是在 P2 本地完成的 。 这也就是 P2 做为辅助节点的作用(用于随机数生成) 。
这里 A,B,C 一般被称为三元组(Beaver'sTriple) 。
比如 , 某次生成的随机数如下:
感兴趣的读者朋友可以验证一下 。 如 A = A0 + A1 =2373eddela0e5dcd + ad483b77e4e5db41 = d0bc2955fef4390e 。 这个 A 是个随机数 。
2.将上一步生成的随机数的秘密分享值分别发送给P0,P1 。
即将A0,B0,C0发送给P0;将A1,B1,C1发送给P1 。
此时 ,P0,P1拥有如下值:
3.P0 计算 E0 和 F0;P1 计算 E1 和 F1 。 并交换 Ei,Fi 。
P0 本地计算 E0 = X0 - A0, F0 = Y0 - B0 。
P1 本地计算 E1= X1 - A1, F1 = Y1 - B1 。
此时 ,P0,P1拥有如下值:
交 换 Ei,Fi 。
P0将E0,F0发送给P1;P1将E1,F1发送给P0 。 此时 , P0,P1都拥有E0,F0,E1,F1 。
4.本地计算 得到 E和 F 。
P0,P1 各自本地计算 E = E0 + E1, F= F0 + F1 。
5.本地计算 Z0;P1本地计算 Z1 。
现在 ,P0 已经拥有 A0,B0,C0,E,F;P1已经拥有 A1,B1,C1,E,F 。 有了这些就可以计算出 Z= X*Y 的秘密分享值 Z0,Z1了 。 即:
P0 本地计算 Z0 = E * B0 + A0 * F+ C0;


推荐阅读