前言
本文从数据流的角度详细介绍样本融合的实现原理
场景
![](https://imgkr2.cn-bj.ufileos.com/bce1db89-28e3-4fb9-bd5e-21fe6baa1180.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=U6S10nuECT37S1zZk6O9J9MzlAA%253D&Expires=1615952085)
弊端
用户隐私数据放在第三方存在泄漏的风险
接下来咱聊聊如何多方安全隐私计算
整体流程图
![](https://imgkr2.cn-bj.ufileos.com/e95f93af-3428-46d4-90ab-bdba493e3272.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=8Jzmo%252B6B44%252FJwTjuBpWdHWTcPc0%253D&Expires=1615952384)
数据交互过程
以上图为依据 用实际数据来验证
guest等待host发送密钥
![](https://imgkr2.cn-bj.ufileos.com/994d16d1-d181-4eb9-ab47-b9e04d0c3d22.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=zsbJR1aKxxomQqAH5IlCUtSXPUo%253D&Expires=1615952483)
密钥包含 e和n
guest原始数据集
![](https://imgkr2.cn-bj.ufileos.com/a25f1e1a-5752-4f17-9903-3445ff610467.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=rNSbsysRC%252BfTyAhdU1%252F%252FbhYmEXI%253D&Expires=1615952519)
原始数据集的id列
![](https://imgkr2.cn-bj.ufileos.com/40d4d149-a784-4988-8a6f-664cbf9c6555.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=Vih8c3rRFsiND2CbBrGVTcKpHT8%253D&Expires=1615952554)
对id列添加随机数(python代码)
pd.DataFrame(dfaid).assign(a=dfaid.apply(lambda v:random.SystemRandom().getrandbits(128),axis=1))
![](https://imgkr2.cn-bj.ufileos.com/94fb46b0-9928-43a9-8bb5-57d382332b37.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=yWpRsoNpmKXDkg1tgbWgqY2KTEI%253D&Expires=1615952636)
得到id和对应的随机数r
对每一行数据进行处理
reh=dfaidr.apply(lamdba idr: int(self.hash(idr[0]),16)*gmpy2.powmod(int(idr[1]),self.e,self.n))
idr[0]就是id值
idr[1]就是随机数r的值
对id hash计算得到int值
r ^ e mod n即随机数r的e次幂取模n
两者乘积
结果是
![](https://imgkr2.cn-bj.ufileos.com/54e8a9bf-9276-4ad1-bfb3-79852bbc1f82.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=uHsa1lOTZsMrPqVOfU3XVTOQFh4%253D&Expires=1615952684)
将上面结果命名为结果B 该值传给host
将id和r和上面结果整合在一起得到结果命名为结果A
![](https://imgkr2.cn-bj.ufileos.com/dc8413ff-b67d-4153-9910-82b0320bed6a.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=cCH7qt%252B%252Bw%252BoXbCIesKncdIGposA%253D&Expires=1615952717)
接下来介绍下host方
host方的数据集
![](https://imgkr2.cn-bj.ufileos.com/450dd973-a5a4-450a-b94e-e5a7eae4050a.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=s5r%252BAkJBWINXw3rTZk60Z6sUaa0%253D&Expires=1615952833)
获取id列
![](https://imgkr2.cn-bj.ufileos.com/0f537b58-38d1-4f4d-8961-9cfcb4fe47f8.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=PKIRx0POFpG9itJShG6DSlf97UI%253D&Expires=1615952855)
对每一个id进行处理
pd.DataFrame(dfbid).apply(lambda vv: sefl.ff2(vv,self.d,self.n),axis=1)
ff2函数:
gmpy2.powmod(int(self.hash(x[0]),16),d,n)
即
int(hash(id)) ^ d mod n
得到结果如下 命名为结果C
![](https://imgkr2.cn-bj.ufileos.com/25f8dd4c-aa91-466c-b2a8-ea15006038dd.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=x1u4zMOPhDF6d0BEY8fX6F34tmo%253D&Expires=1615952899)
host将结果C发送给guest
host得到guest发送过来的结果B
对每一行数据进行处理
froma.apply(lambda vv: self.ff1(vv,self.d,self.n),axis=1)
gmpy2.powmod(x[0],d,n)
即id加密值 ^ d mod n
得到结果命名为结果D
![](https://imgkr2.cn-bj.ufileos.com/8200e05d-e561-4350-8b83-926d9e7ab1b8.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=qxc3%252F3OLbuZ4ZYst1gdgps8T6VU%253D&Expires=1615953008)
host将结果D发送给guest
guest得到host发送过来的结果D
guest将结果D和本身的id和随机数r整合在一起 命名为结果F
![](https://imgkr2.cn-bj.ufileos.com/29db56ad-9bf9-4099-834c-9afe2fbff28c.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=sMc1cZ9lVNz1Ra%252FLfZBIsKvgF9c%253D&Expires=1615953125)
对每一行数据进行处理
dfajoin.apply(lamdba vv:self.ff3(vv,mpz(slef.n)),axis=1)
gmpy2.divm(mpz(x[2]),mpz(x[1]),n)
结果命名为结果E
![](https://imgkr2.cn-bj.ufileos.com/9ff282ee-1d59-421e-acb7-6b4adbc548c4.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=8i62tcMcI%252Bv30T20YUuOVbiKNWA%253D&Expires=1615953168)
guest将结果E和F整合在一起命名为结果G
-
前半部分数据
![](https://imgkr2.cn-bj.ufileos.com/4739aa2d-6167-4dc3-ab1f-cbc65b6f3e54.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=STQdqJBXHTLm47gEoVQj%252BMuTdx8%253D&Expires=1615953228)
-
后半部分数据
![](https://imgkr2.cn-bj.ufileos.com/6a30e0f0-3c5c-4221-b05b-a884a34f8aa6.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=E12s%252Bk4r2Dz%252BwvmDBvgYjRDlyUU%253D&Expires=1615953243)
guest取交集
pd.DataFrame(merge(za,pd.DataFrame(toa2,columns=['z']),on='z')[self.columnId])
za就是结果G
toa2就是结果E
两个数据集取交集即可得到结果H
![](https://imgkr2.cn-bj.ufileos.com/f52a8a09-b6d5-42b1-9d52-b31c3ad78a7d.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=gZw5t8XinrgWv3sRVrXwyubJr7Y%253D&Expires=1615953397)
guest将融合数据集H发送给host即可
截止目前 上面的流程图结合实际的数据 你应该对整个样本融合的流程清晰了 接下来咱们看看其中涉及到的数学知识
上述过程涉及到的数学知识点
![](https://imgkr2.cn-bj.ufileos.com/c0dfd033-ee07-416f-a1b1-2c1859ab0878.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=D0b8TII4fI4u934DdsNzcoZlAi0%253D&Expires=1615954197)
后记
接下来会揭秘特征分箱算法