当前位置:   article > 正文

安全多方计算(MPC)从入门到精通:经典案例

多方安全计算案例

简介:在上一节《安全多方计算(MPC)从入门到精通:JUGOIDESDK中,已经介绍了JUGOIDESDK相关的内容,本节也是本系列的最后一篇文章,我们将介绍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. 1. #parties 2
  2. 2. #input 1 uint32
  3. 3. #input 2 uint32
  4. 4. #output 1 uint32
  5. 5. function void main()
  6. 6. {
  7. 7. /* 数据比较电路 (output1=1 && input1>input2)*/
  8. 8. output1 = input1/input2;
  9. 9. if(output1>0)
  10. 10. {
  11. 11. output1 = 1;
  12. 12. }
  13. 13. } 

2.服务端代码

1)初始化节点

  描述

  引入JUGO平台SDK库;

  初始化节点,启动节点监听(包括发起方节点和接收方节点);

  JUGO的节点初始化是以异步形式进行返回。

  代码参考:

  1. 1. compare = new Compare(SystemProperties.getDefault().getCompare(), SystemProperties.getDefault().getNode1UserName(), SystemProperties.getDefault().getNode1Password(), mode,SystemProperties.getDefault().getNode1Endpoint(), null, argsAttach);
  2. 2. //设置返回的callback对象,处理结果返回数据
  3. 3. compare.setOutputCallback(new OutputCallback<Uint32>(Uint32.class){
  4. 4. @Override
  5. 5. public void onResult(String taskId, String algorithmId, int resultCode, Uint32 result) {
  6. 6. logger.debug("获取到结果:任务ID:{},算法ID:{},错误码:{},值:{}",
  7. 7. taskId, algorithmId, resultCode, result.getValue().toString());
  8. 8. //根据返回值进行判断结果
  9. 9. if(resultCode == 0){
  10. 10. resultMapper.insertData(id, "获取最终结果,返回数据结果:我方值大于等于对方值,任务id:" + taskId, new Date(),Const.getType_one());}
  11. 11. else{
  12. 12. resultMapper.insertData(id, "获取最终结果,返回数据结果:对方值较大,任务id:" + taskId ,new Date(), Const.getType_one());}
  13. 13. }
  14. 14. @Override
  15. 15. public void onFailure(Throwable e) {
  16. 16. e.printStackTrace();
  17. 17. }
  18. 18. });
  19. 19. // 邀请方定义输入参数。对于输入发起方调用setInputCallbackForORG方法,被邀请方调用setInputCallbackForDST方法。
  20. 20. compare.setInputCallbackForORG(new InputCallback<Uint32>() {
  21. 21. @Override
  22. 22. public Uint32 onInput(String taskId, String algorithmId, String[] args) {
  23. 23. resultMapper.insertData(id, "准备参与计算参数,发起计算,任务id:" + taskId, new Date(),Const.getType_one());
  24. 24. //初始化后台输入参数
  25. 25. return new Uint32(BigInteger.valueOf(3));
  26. 26. }
  27. 27. @Override
  28. 28. public void onFailure(Throwable e) {
  29. 29. e.printStackTrace();
  30. 30. }
  31. 31. }); 

2)节点启动任务

  描述:

  如果是被邀请方,无需启动任务

  如果是发起方,需要进行启动任务

  JUGO的节点初始化是以异步形式进行返回

  代码参考:

  1. 1. //初始化计算双方
  2. 2. List<String> takerList = Arrays.asList(new String[] { "admin01", "admin02" });
  3. 3. //初始化接收结果的参与方
  4. 4. List<String> resulReceiverList = Arrays.asList(new String[] { "admin01" , "admin02"});
  5. 5. //启动节点任务
  6. 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. 1.>nohupjava-jarMPCAcceptApp.jar&//启动接收方节点
  2. 2.>nohupjava-jarMPCStartApp.jar&//启动发起方节点

4.项目调试

  部署完毕

  在浏览器中输入

  http://ip:port/swagger-ui.html,可调试发起方接口

  在浏览器中输入

  http://ip:port/swagger-ui.html,可调试接收方接口

更多内容可以参考视频:http://edu.51cto.com/course/14087.html

产品实操请访问:https://jugo.juzix.net/home

转载于:https://www.cnblogs.com/aqjs/p/9269339.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/911902
推荐阅读
相关标签
  

闽ICP备14008679号