We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
假设目前有两个节点a,b,双方各自有一个数组,分别是x,y.我想加他们相加得到结果z,然后我通过spu::kernel::hal::test::dump_public_as 函数得到解密后的结果rz,但是经过我的测试,我在a端对b节点的数组y进行spu::kernel::hal::test::dump_public_as操作,也能得到正常的结果。这样是不是会造成a,b端都可以获取对方的数据?
(这里加法是举个例子,我的意思是一些复杂操作也能获取对方的数据) 下面是我的代码:
auto hctx = MakeHalContext(parties_,parma_.rank); spu::device::ColocatedIo cio(hctx.get()); std::vector<int> vec; for(int i=0;i<10;++i) { vec.push_back(parma_.rank*10+i); } cio.hostSetVar(fmt::format("x-{}", hctx->lctx()->Rank()), vec); cio.sync(); auto x = cio.deviceGetVar("x-0"); auto y = cio.deviceGetVar("x-1"); auto z = spu::kernel::hal::add(hctx.get(),x,y); xt::xarray<int> rx = spu::kernel::hal::test::dump_public_as<int>( hctx.get(), spu::kernel::hal::reveal(hctx.get(), x)); xt::xarray<int> ry = spu::kernel::hal::test::dump_public_as<int>( hctx.get(), spu::kernel::hal::reveal(hctx.get(), y)); xt::xarray<int> rz = spu::kernel::hal::test::dump_public_as<int>( hctx.get(), spu::kernel::hal::reveal(hctx.get(), z));
The text was updated successfully, but these errors were encountered:
Hi @linjunmian ,感谢提问
SPU虚拟机提供了 reveal 方法来“揭露”密态数据。设想如果没有揭露方法,最终计算结果对所有人都不可见,计算本身也就会失去意义 :P
一个通用的流程是,多方输入数据 x, y, z,然后多方工作做计算 res = f(x, y, z),SPU可以保证整个计算过程的安全性,但最后用户需要手动 reveal(res),SPU/MPC本身并不保证结果的安全性
如果用户通过上层 API(Python)来写代码,SPU编译器和运行本身不会插入Reveal指令,所以计算过程是可以保证安全的
PS: 如果一个函数本身是“可逆”的,比如简单的加法,乘法,sigmoid,exp,那么通过结果本身是可以反推输入的,这是计算本身的性质,跟MPC无关。但是如果计算本身是不可逆的,比如 比较大小,或者是复杂的训练,预测,就无法反推输入了,这也是MPC应用的一个通用pattern
Sorry, something went wrong.
@rivertalk 谢谢回答。加法我只是举个例子,事实上我们不会提供这种可以倒推的算子(一般会有组合)
rivertalk
No branches or pull requests
假设目前有两个节点a,b,双方各自有一个数组,分别是x,y.我想加他们相加得到结果z,然后我通过spu::kernel::hal::test::dump_public_as 函数得到解密后的结果rz,但是经过我的测试,我在a端对b节点的数组y进行spu::kernel::hal::test::dump_public_as操作,也能得到正常的结果。这样是不是会造成a,b端都可以获取对方的数据?
(这里加法是举个例子,我的意思是一些复杂操作也能获取对方的数据)
下面是我的代码:
auto hctx = MakeHalContext(parties_,parma_.rank); spu::device::ColocatedIo cio(hctx.get()); std::vector<int> vec; for(int i=0;i<10;++i) { vec.push_back(parma_.rank*10+i); } cio.hostSetVar(fmt::format("x-{}", hctx->lctx()->Rank()), vec); cio.sync(); auto x = cio.deviceGetVar("x-0"); auto y = cio.deviceGetVar("x-1"); auto z = spu::kernel::hal::add(hctx.get(),x,y); xt::xarray<int> rx = spu::kernel::hal::test::dump_public_as<int>( hctx.get(), spu::kernel::hal::reveal(hctx.get(), x)); xt::xarray<int> ry = spu::kernel::hal::test::dump_public_as<int>( hctx.get(), spu::kernel::hal::reveal(hctx.get(), y)); xt::xarray<int> rz = spu::kernel::hal::test::dump_public_as<int>( hctx.get(), spu::kernel::hal::reveal(hctx.get(), z));
The text was updated successfully, but these errors were encountered: