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


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

作者 | Rosetta技术团队
责编 | 晋兆雨
出品 | AI科技大本营
本文中 , 我们将介绍为了保护用户的隐私数据 , 在隐私 AI 框架的计算任务全流程中 , 数据是如何以密文形式流动 , 同时仍正确完成加法、乘法等计算步骤的 。
隐私 AI 系统存在的目的就是赋能 AI , 使得各种 AI场景下对用户隐私数据的使用都是安全的 。 那么 , 这样的系统就需要提供充分的保障 , 从理论到工程实现的每一个阶段都应该是经得起推敲、抵抗得住各种 攻击的 。 不能简单的认为只需要各方先在本地自己的数据上计算出一个模型 , 然后将模型结果交换一下 计算下其模型参数的平均值 , 就不会泄露各方的隐私数据了 。 现代密码学(Cryptography)是建立在严格的数学定义、计算复杂度假设和证明基础之上的 , 其中MPC (Multi-Party Computation)方向是专门研究多个参与方如何正确、安全的进行联合计算的子领域 , Rosetta、TFEncrypted等隐私 AI框架都采用了 MPC技术以提供可靠的安全性 。 下面我们就结合具体案例看的看下在 Rosetta中隐私数据是如何得到安全保护的 。
|隐私数据在隐私AI框架中的安全流动
本文插图

案例
Alice,Bob和 Charley三人最近需要在他们的 AI系统中引入对数据的隐私保护能力 。 他们很重视安全性 , 所以他们想通过一个简单的例子 —— 乘法(multiply) , 来验证下隐私 AI 框架是否真正做到了隐私安全 。
他们约定:Alice的输入为 1.2345;Bob 的输入为 5.4321;而 Charley拿到相乘的结果 。 他们按照Rosetta提供的教程 , 快速编写了如下代码(脚本名为 rosetta-mul.py):
#!/usr/bin/env python3import latticex.rosetta as rttimport tensorflow as tfrtt.activate(''SecureNN'')x = tf.Variable(rtt.private_console_input(0, shape=(1,))) # Alice's input y = tf.Variable(rtt.private_console_input(1, shape=(1,))) # Bob's inputz = tf.multiply(x, y) # z = x * ywith tf.Session as sess:sess.run(tf.global_variables_initializer)res = sess.run(rtt.SecureReveal(z, receive_party=4)) # 'b0100' means Charleyprint('z:', res)rtt.deactivate接着 , 他们各自打开一个终端 , 分别进行如下操作:
Alice ( P0) 在终端敲下如下命令行 , 并根据提示输入自己的私有数据:
$ python ./rosetta-mul.py --party_id=0please input the private data (float or integer): 1.2345Bob ( P1) 执行同样的操作 , 输入的也是只有自己才知晓的私有数据:
$ python ./rosetta-mul.py --party_id=1please input the private data (float or integer): 5.4321Charley ( P2) 在终端敲下如下命令行 , 等一会儿就可以得到所期望的计算结果:
$ python ./rosetta-mul.py --party_id=2 z: [b'6.705910']注:
对于 Charley来说 , 由于没有数据 , 故不会提示输入 。
Alice和 Bob的本地输出都会是 z:[b'0.000000'], 而不会拿到正确的结果 。
可以看出 , Charley 拿到的最终结果与逻辑上明文结果(6.70592745)相比 , 误差(0.00001745)可以忽略不计 。 系统的正确性得到了验证 。
如果想让误差更小 , 可以通过配置提升精度 , 或使用128-bit 的数据类型 。
上面短短的几行代码 , 虽然结果是正确的 , 但是他们三人对于系统安全性方面仍有一些困惑: