Garbled circuitを理解する
Yao's Millionaires' Problem(ヤオの富豪問題)
2人の富豪がいて、お互いの財産額を開示することなく、どちらの財産がより多いかを知るにはどうすればよいか?
1982年に提唱された有名な秘密計算の問題です。
この問題への解決策の1つがGarbled circuitです。
Garbled circuitとは
これはMPC(Multi-Party Computation)の特殊なケースである2-Party Computationでのプロトコルです。
このプロトコルは大小問題に限らず論理回路
ヤオの富豪問題は、この論理回路が
Oblivious Transferとは
Garbled circuitを理解するうえで非常に重要なのがOblivious Transfer(OT)プロトコルです。
本記事ではOTの原理については触れず、Garbled circuitの理解に必要な性質の紹介のみにとどめますが、OTを用いることで、
- 送信者が2つの値を用意したとき、受信者はそのうち片方のみを取得できる
- 送信者は、受信者がどちらを選んだかを知ることができない
という状態を満たすことができます(1-out of-2 OTと呼ばれます)。
この「2つの値のどちらかを選ぶ」という部分、01で表現されるビットと非常に相性がよいです。
つまり、お互いの入力値をビット列に分解することで、各ビットについてOTを応用したやり取りができそうです。
大小比較の論理回路
まずは入力値の秘匿を抜きにして、数値をビットに分解して大小比較をする手順を考えていきましょう。
2つの数値の大小は、最上位のビットから順に見ていって、最初にビットの異なるものを見つければ判定できます。
たとえば5と7であれば、2ビット目が異なるため、より大きい数値は7であることが分かります。
5 -> 0101
7 -> 0111
^
そこで、以下のような変数を考えます。
-
:上位E_i ビットがすべて等しい(Equal)i -
:G_i である(Greater)x>y
これらの変数を用いて、
初期条件
ビット表現に変換していきます。
-
は、x = y \lnot(x \oplus y) -
は、x > y x \land \lnot y
と表現できます。
つまり、最上位ビットを
E_3 = \lnot(x_3 \oplus y_3) G_3 = x_3 \land \lnot y_3
今回は4ビットなので0-indexedで
これは最上位ビットにおける単純な比較に対応しています。
漸化式
ビット
E_i = E_{i+1} \land \lnot(x_i \oplus y_i) G_i = G_{i+1} \lor (E_{i+1} \land (x_i \land \lnot y_i))
つまり上位のbitから見ていって、
論理ゲートの構築
具体的にすべての01のパターンについて列挙してみましょう。
最上位ビット
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
数値が同じなのにどちらかが大きくなることはありえないため、
以降のビット
さて、それ以降のビットは
1 | 0 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 1 | 0 |
0 | 0 | * | * | 0 | 0 |
0 | 1 | * | * | 0 | 1 |
結果の判定
最終的に得られた
結果 | ||
---|---|---|
1 | 0 | x = y |
0 | 0 | x < y |
0 | 1 | x > y |
入力値マスクの必要性
以上のように、
また、上で列挙した通り、論理ゲートの入出力パターンは限られているため、
しかし、このままでは結果の判定のためにお互いの入力を知る必要があります。
お互いに入力値を知らずに結果を得るために、Aliceは論理ゲートにガーブル化と呼ばれる暗号化を施します。
論理ゲートの生成
まず、論理ゲートのどちらが0でどちらが1であるかを判別できなくするために、Aliceはラベルを生成します。
入力値
同様に、下記のようにラベルを定義します。
y\rightarrow(K^0_y, K^1_y) E\rightarrow(K^0_E, K^1_E) G\rightarrow(K^0_G, K^1_G)
このように01の代わりにラベルを用いることで、0と1のどちらが0でどちらが1であるかを判別できないようにします。
次に、入力に対する出力値の対応がわかってしまうと値が判別できてしまうため、論理テーブルの入力
(ここでのEncryptは、
これを、論理ゲートの表に当てはめると以下のようになります。
(ここで、
これで、論理ゲートを見ても01のどちらが0でどちらが1であるかを判別できないようになりました。
しかし、この表を生成したAliceは値の対応関係を知ってしまっています。
そのため、AliceがBobの入力値を知らずに次のゲートに進めるようにOTを利用します。
OTによる入力値のやり取り
Aliceは、
OTでは、Bobは
すると、BobはAliceが選択したビットに対応する
これらを用いて、論理ゲートの出力を復号します。
Bobが持っているのは、Aliceの入力値に対応する
したがって、論理ゲートのうち1行のみが復号できます。
この一連の工程をビットごとに行います。
いま、Bobの手元には前回の論理ゲートの出力があり、Aliceはどれが出力されたかを知りません。逆に、Bobは得た出力がどのビットに対応するかを知りません。
これを繰り返すことで、お互いの入力値を知らないまま、Bobは
結果の復号
最後に、Aliceは最終結果の対応表だけをBobに送信します。
結果 | ||
---|---|---|
x = y | ||
x < y | ||
x > y |
Bobは、自身の手元にある
まとめ
以上のようにしてヤオの富豪問題を解くことができました。
Garbled circuitは非常に強力な手法ですが、実用化にあたっては計算・通信コストの高さが課題とされてきました。特に、ビットごとにゲートを暗号化・評価する必要があり、計算規模が大きくなるほど負荷が増大します。
このような課題に対し、近年ではさまざまな最適化技術が提案されています。中でも、OT extensionは、少数のベースOTから多数のOTを効率的に拡張する手法で、計算・通信コストの削減に大きく寄与しています。
このOT extensionを効果的に活用しているプロトコルの代表例がMASCOTです。
実はこの記事もMASCOTを調べている過程でOTやGarbled circuitが出てきたことがキッカケでした。
OTについては、こちらの記事でも紹介しているので、ご興味のある方はそちらもぜひご覧ください。
Discussion