安全多方計算(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.&gt;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視頻課程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章