國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
36
4.5 A Translator based Protocol development Tool
研究的議題是放在算術計算上,所以必須要提供使用者一個使用的介面,這裡就要 提出一種語法,使得使用者可簡單寫出簡單的 script,且是以熟悉的方式來撰寫,其中 的四則運算表達式,主要是以“+”、“-”、“×”、“÷”為運算符號 ,如此一來,
就可簡單的寫出運算式來。且還支援一般程式可用到的迴圈及 if 判斷式,增加了此語法 的表達能力。使用者用此種語法寫出來的 script 將稱之為 user code。至於說要如何轉換 為 secure multi-party computation 可接受的 SMC code,則是此翻譯工具工作。
Translator 主要是針對四則運算在做轉譯的動作,而寫程式常用到 loop 以及 if 當然也 必須提供轉換上的支援,對於 loop 的使用上,目前還不支援迴圈內的條件判斷式以多 方安全計算之 protocol 來實作,所以說,這點必須使用者設計 script 時要多注意。
且關於 if 的使用,使用者設計 script 時也要知道,由於是多方安全計算的關係,會將 if 內的兩個 branch 皆執行過,才會跟據條件判斷式得出最後的結果,所以說,如何減少 多餘的計算則必須靠調整使用者寫 script 的邏輯來幫忙。
4.5.1 Translation Tool
Secure Multi-party Communication System 使用 Ruby 為開發的語言,Ruby 提供了不少 Algorithm: float division
1 M = (M1 × 224 )÷ M2 mod 248 2 M = M.to_a
3 Flag = (MSB of M is 0)? 1 : 0
4 M = (MSB of M is 0) ? (shift-left(M[1, 24]).to_i) : (M[0,24].to_i) 5 S = (S1 + S2) mod 2
6 E = (E1 - E2 + flag) mod 28 7 Return (S, M, E)
‧
須先安裝 ruby 的 plug-in,安裝方法為使用指令 gem install ParseTree,來安裝所需的 ruby parser 工具,此工具可將以 ruby 語法所寫的程式碼轉換成以 S-expression 表達的 AST 結構。接著使用指令 gem install ruby2ruby,來安裝 Ruby2Ruby 這個 plug-in,此工具 是用來將一個 S-expression 的表達式還原成以 Ruby 為語法的程式碼。也就是說,我們可 利用這兩個工具來幫忙解析使用者寫的 script,並將得到的 AST 結構做修改後,還原成 SMC 可接受的程式碼。如此一來使用者就不必寫複雜的 SMC code,而只需要寫簡單的 script,就可自行設計出新的安全多方運算協定程式碼。
4.5.2 Operation Statement Translation
使用者所使用到的多方安全運算裡所用到的 protocol 在處理以 S-expression 表達的 AST 結構時,需要找出使用到“+”、“-”、“×”、“÷”等等運算符號的運算式,接
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
38
4.5.3 Constant Number Translation
當有必要執行 public 型態的數和 secret 型態的數做運算時,由於 public 型態的數是 公開的,也就是說各個執行者 SMC client 皆知曉其內容,所以說其實可以自行做運算即 可,但是當各執行者皆做了同樣的運算時,會造成 public 型態的數重複被計算,以至於 結果會出錯。例如說當有一個 secret 型態的變數 X 其分持為(x1+x2) mod d,當要執行 X+1 這個運算時,由於 1 是 public 型態的常數,所以說 SMC client 皆同時做了分持加 1 的動 作,即(x1+1)和(x2+1),這樣的後果導致其值((x1+1)+(x2+1))mod d 並不等同於原本的要求,
應該要改成只有其中一方要做加 1 的動作,其餘的只需做加 0 的動作即可,如(x1+1)和 (x2+0),其值((x1+1)+(x2+0))mod d 同於原本的要求。其概念類似於將原本的 private 型態 變數轉換為 secret 型態的方法,此為將原本 public 型態變數轉換為 secret 型態。
而要利用 translator 來幫助產生 SMC code,可以在處理 Operation Statement 轉換時就 一併處理,使得只需判斷有關 secure multi-party computation 的輸入參數部分是否為常 數,並做數值代換即可。
4.5.4 If Statement Translation
處理 If statement 時,要注意到執行順序的問題。首先執行 condition block,接著再處 理 then block 以及 else block。而在處理前,須先找出 block 內是否含有被 assign 值的變 數,且此變數為外部的變數,亦即執行此 If statement 前就已存在之變數。接著就是將 此三個 block 內有被 assign 到的變數先另外重新取名字,並於以執行,之後再根據被取
Example 1 + x plus(1, x) for SMC client1
plus(0, y) for SMC client2 y×1 multiply(y, 1) for SMC client1
multiply(y, 0) for SMC client2
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
39
代的名稱將其值給 assign 給原始名稱的變數。這樣做的目的,是為了保證當執行 then block 以及 else block 時,其中所使用到的變數有重複,並且其值有被修改的情況下,其 所取得的輸入變數內容保持一致,而不致於造成後執行的資料蓋過前執行後的資料,導 致資料內容錯誤的情形發生。
因為安全多方運算的特性,為了保持資料的秘密性,使得任何人無法透過運算結果 推估出原始的運算輸入資料的內容,所以說必須讓 IF statement 中的兩個運算分支路徑 皆被執行,最後再經由條件判斷式的運算結果來決定輸出的內容,而由於條件判斷式的 結果本身是不公開的資料,也就是說無法直接由 IF statement 的運算結果得出條件判斷 式的值。
如此一來,當我們在改寫 IF statement 時,必須確保以上所述的特性存在,所以必須 再多加上一些必要的運算來輔助完成。像是增加了記錄 input data 的步驟以及記錄中間 運算的產物,還有運算 IF statement 最後的執行結果等。
以下為一個簡單的 script 轉換範例。
Format translate From To If condition_block then ([cond_block _var_asgn]
… then_block … cb = (… modified cond_block …)
else [restore cond_block var_asgn]
… else_block … …then_block_var_asgn…
end …else_block_var_asgn…
tb = (… modified then_block …) eb = (… modified else_block …)
…if_then_else block…
If_then_else(cb, tb, eb))
‧
t1_y = minus(15, t1_x) t1_y = product(t1_x, t1_y) t1_x = division(t1_y, t1_y) t1_x = shift_left(t1_x, 1) t1_y = shift_right(t1_y, 1) t1_b = less_than(t1_x, t1_y) t1_b = greater_than(t1_x, t1_y))) else_block = (t2_x, t2_y = 15, 25) b = if_then_else(cond_block, t1_b, b) x = if_then_else(cond_block, t1_x, t2_x) y = if_then_else(cond_block, t1_y, t2_y)if_then_else(cond_block, then_block, else_block))
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
41
五、實驗與評估
此系統的撰寫是以 ruby 為主要的程式語言,利用 ruby 語言的開發方便性,增加開發 的速度,且 ruby 程式語言的易讀性也較高,容易撰寫,使得撰寫出來的程式碼不但簡 潔又易維護。而使用的 ruby 版本為 ruby1.9.1,且使用到的套件管理工具為 rubygems1.9.1,
並且利用 eventmachine 這個套件作為 SMC 裡的 server 模組,這個主要是為了處理網路 程式的 socket 傳輸,使得傳輸上的處理具有較高的效率。EventMachine 是一個在 ruby 上的 event-driven networking library,主要是實作 reactor pattern 的 server 模組,使得使 用者只需專心處理程式的邏輯設計,而不需要考慮低階的網路傳輸處理,所以在實作 SMC commodity server 模組時,只需將該做的運算步驟安排好即可,使得可快速的產生 亂數資料以應付 SMC client 的 request。