安全多方计算(MPC)从入门到精通:经典案例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全多方计算(MPC)从入门到精通:经典案例相关的知识,希望对你有一定的参考价值。
简介:在上一节《安全多方计算(MPC)从入门到精通:JUGO-IDE及SDK》中,已经介绍了JUGO-IDE及SDK相关的内容,本节也是本系列的最后一篇文章,我们将介绍MPC的经典案例,以及这些案例的代码及实现流程。
1.业务逻辑
该案例为经典的MPC百万富翁问题的一个演示,百万富翁问题是由华裔计算机科学家、图灵奖获得者姚期智教授首先提出的。该问题表述为:两个百万富翁Alice和Bob想知道他们两个谁更富有,但他们都不想让对方知道自己财富的任何信息。
该问题有一些实际应用:假设A希望向B购买一些商品,但她愿意支付的最高金额为x元;B希望的最低卖出价为y元。A和B都非常希望知道x与y哪个大。如果x>y,他们都可以开始讨价还价;如果z<y,他们就不用浪费口舌。但他们都不想告诉对方自己的出价,以免自己在讨价还价中处于不利地位。
2.案例介绍
本案实现了经典的百万富翁案例,用户可以在不知道对方的具体数值情况下,与对方计算出谁的数值更大。
3.操作流程
1)在页面中输入计算数据值,并向参与计算方发出计算邀请。
2)参与计算方同意并录入数据后,双方开始进行安全多方计算。
3)计算完成后将比较结果返回给双方,完成本次计算任务。
4.所用算法
该案例使用了32位比大小算法电路文件;电路文件是由Frutta语言开发、JUGO IDE编译;电路文件以与门和或门构成。
一、代码
该案例中集成了三大部分的代码。包括:1)算法代码、2)服务端应用代码。
1.算法代码
1. #parties 2
2. #input 1 uint32
3. #input 2 uint32
4. #output 1 uint32
5. function void main()
6. {
7. /* 数据比较电路 (output1=1 && input1>input2)*/
8. output1 = input1/input2;
9. if(output1>0)
10. {
11. output1 = 1;
12. }
13. }
2.服务端代码
1)初始化节点
描述
引入JUGO平台SDK库;
初始化节点,启动节点监听(包括发起方节点和接收方节点);
JUGO的节点初始化是以异步形式进行返回。
代码参考:
1. compare = new Compare(SystemProperties.getDefault().getCompare(), SystemProperties.getDefault().getNode1UserName(), SystemProperties.getDefault().getNode1Password(), mode,SystemProperties.getDefault().getNode1Endpoint(), null, argsAttach);
2. //设置返回的callback对象,处理结果返回数据
3. compare.setOutputCallback(new OutputCallback<Uint32>(Uint32.class){
4. @Override
5. public void onResult(String taskId, String algorithmId, int resultCode, Uint32 result) {
6. logger.debug("获取到结果:任务ID:{},算法ID:{},错误码:{},值:{}",
7. taskId, algorithmId, resultCode, result.getValue().toString());
8. //根据返回值进行判断结果
9. if(resultCode == 0){
10. resultMapper.insertData(id, "获取最终结果,返回数据结果:我方值大于等于对方值,任务id:" + taskId, new Date(),Const.getType_one());}
11. else{
12. resultMapper.insertData(id, "获取最终结果,返回数据结果:对方值较大,任务id:" + taskId ,new Date(), Const.getType_one());}
13. }
14. @Override
15. public void onFailure(Throwable e) {
16. e.printStackTrace();
17. }
18. });
19. // 邀请方定义输入参数。对于输入发起方调用setInputCallbackForORG方法,被邀请方调用setInputCallbackForDST方法。
20. compare.setInputCallbackForORG(new InputCallback<Uint32>() {
21. @Override
22. public Uint32 onInput(String taskId, String algorithmId, String[] args) {
23. resultMapper.insertData(id, "准备参与计算参数,发起计算,任务id:" + taskId, new Date(),Const.getType_one());
24. //初始化后台输入参数
25. return new Uint32(BigInteger.valueOf(3));
26. }
27. @Override
28. public void onFailure(Throwable e) {
29. e.printStackTrace();
30. }
31. });`
2)节点启动任务
描述:
如果是被邀请方,无需启动任务
如果是发起方,需要进行启动任务
JUGO的节点初始化是以异步形式进行返回
代码参考:
1. //初始化计算双方
2. List<String> takerList = Arrays.asList(new String[] { "admin01", "admin02" });
3. //初始化接收结果的参与方
4. List<String> resulReceiverList = Arrays.asList(new String[] { "admin01" , "admin02"});
5. //启动节点任务
6. compare.doCompute(SystemProperties.getDefault().getRoomId(), argsAttach, takerList, resulReceiverList);`
二、实现流程
1.MPC应用部署
1)准备工作
环境搭建(要求linux系统)
安装nginx
安装JDK,配置JDK环境变量
2.项目打包
1)描述:
项目依赖gradle进行构建;
可通过gradle指令进行打包,文件输出在同级build目录下;
可通过JAVA IDE打包可执行文件;
2)gradle指令:
1.>cleanbuild
3.项目运行
1)描述:
在环境中执行以下指令进行监听;
后续可通过统计目录nohup.out查看输出日志
2)指令参考:
1.>nohupjava-jarMPCAcceptApp.jar&//启动接收方节点
2.>nohupjava-jarMPCStartApp.jar&//启动发起方节点
4.项目调试
部署完毕
在浏览器中输入http://ip:port/swagger-ui.html 可调试发起方接口
在浏览器中输入http://ip:port/swagger-ui.html 可调试接收方接口
更多内容可以参考视频:安全多方计算MPC视频课程
以上是关于安全多方计算(MPC)从入门到精通:经典案例的主要内容,如果未能解决你的问题,请参考以下文章