Oblivious Transferを理解する
Oblivious Transferってなんだ
秘密計算について調べているとOblivious Transfer(OT)がよく出てきます。
日本語だと「紛失通信」あるいは「忘却送信」と呼ばれるらしいですが、日本語版のWikipediaだと詳しい内容が書かれていないので調べた内容を記しておこうと思います。
ちなみに、現在よく実用されているOTはk-out of-n OTと呼ばれるものですが、今回はその中で最もプリミティブな1-out of-2 OTについて書こうと思います。
というのも、1-out of-2 OTを拡張するとk-out of-n OTが構築できるらしい1ので、まずは1-out of-2 OTを理解しないと何も始まらないからです。
さて、1-out of-2 OTは以下のようなプロトコルです。
- 送信者が2つのメッセージを送信する
- 受信者はそのうち片方のみを受信することができる
- 送信者は、受信者がどちらを受け取ったかを知ることができない
実現内容はシンプルですが、直感的に難しそうに見えます。
どうやって実現するか
Alice:送信する値の用意
まず、送信者のAliceは2つの値
これをそのままBobに送ってしまうと片方だけ読めるという要件を満たさなくなってしまうので、代わりの手段を用意する必要があります。
Alice:選択肢の提示
そこで、Aliceはメッセージの代わりに公開鍵
これは特になんの意味もない乱数なので2つとも受け取ってしまっても問題ありません。
また、
Bob:選択の通知
さて、Bobはメッセージを選ぶ代わりに
しかし、この選択結果をそのままAliceに送ってしまうと、Aliceがどちらを受け取ったかを知ることができてしまいます。
そこで、Bobはどちらを選んだかわからないように、新たな乱数
Alice:復号
AliceはBobから受け取った
このとき、Aliceにとって未知の値となる
そこで、Aliceは両方のケースを計算します。
ここで、
このとき、Aliceは
Alice:メッセージのマスクと送信
Aliceは、得られた
c_0 = m_0 + y_0 c_1 = m_1 + y_1
このとき
Bob:復号
Bobは、Aliceから受け取った
このとき、もう一方の値
となり、復号不能です。
したがって、Bobが知ることができるのは片方の値のみである要件を満たします。
また、一連のやり取りの中で、AliceもBobがどちらの値を受け取ったかを知ることができず、OTの要件を満たしていることがわかります。
なぜ途中でEncryptを使ったのか
Bobは途中で新たな乱数
選んだ値をマスクするだけならば、
なぜ、わざわざ
調べてみると、これはAliceに悪意があった場合、
であれば、
そのため、
まとめ
以上のようにして、1-out of-2 OTを実現することができました。
ちなみにこのプロトコルは、Garbled circuitの理解において非常に重要な役割を果たします。
Garbled circuitについては以下の記事で触れていますので、ぜひご覧ください。
-
カジュアルに
のような形で「暗号化の結果に数値を足す」操作をしていますが、これはどんな暗号方式でも可能というわけではありません。Enc_{pk}(x) + r_b
ここでは、加法準同型な性質を持つ公開鍵暗号を前提にしています。RSAや一般的な楕円曲線暗号(ECDSAやECDHなど)ではこのような操作は定義されておらず、本記事で紹介したプロトコルとは異なる方法でOTを実現する必要があります。 ↩︎
Discussion