ゼロ知識証明はもともと重要な技術なのですが、本連載で紹介してきたクラウド向けの暗号においても、不正の検出などにおいて重要な役割を果たします。例えば、第4回で紹介した「準同型暗号」を使った電子投票を考えます。
各自が0か1を暗号化して投票し、サーバー上で集計するのですが、悪意のある人が1より大きい値を暗号化して投票してしまうと、1人で何人分も投票することができてしまいます。
この場合、サーバーで暗号化された値が2以上ではないことを確認しなければなりません。ただし、当然のことながら、0か1のどちらかだと分かってしまうと投票の匿名性が無くなってしまいますので、これは避ける必要があります。このような場合に、「0と1のどちらかは分からないけれども2以上ではない」ということを検証できるゼロ知識証明の方法が、2013年、電気通信大学の坂井祐介氏らによって提案されています(参考リンク)。
このように、暗号化したままの演算において、クライアント側に不正がないか調べたい場合にも、ゼロ知識証明が威力を発揮するのです。
ところで、準同型暗号は暗号化したまま計算できるため「頑強性」を持たないのでした(第4回参照)。ということは、上述した投票の例の場合、もし途中の経路で悪意ある人が暗号文を2倍していたら、1を投票していた人たちの値が全て2になってしまい、意図せず不正をしたことになってしまいます。
このような改ざんが行われていないことを確認するには、「メッセージ認証符号(MAC:Message Authentication Code)」や署名などの技術を用います。例えば、外部の悪意ある人に対してはMAC、内部の悪意ある人に対してはゼロ知識証明というように、想定する攻撃者に応じて暗号技術を組み合わせていくことになります。
逆に、クラウド側の不正に対する手段も考えられます。例えば、準同型暗号を利用してクラウドに統計演算をさせる場合を考えます。このとき、もしかすると「準同型暗号の処理が重たい」などといって、クラウドサービス提供者がこっそり手を抜いて計算を省略しているかもしれません。正しく計算しているどうかはクライアント側で検算を行えば確認できますが、それでは計算処理をクラウド化する意味がなくなってしまい、本末転倒です。
こうしたクラウド側での不正に対しても、ゼロ知識証明などを用いて、できるだけ少ないコストで不正をチェックする方法や、サーバーが持つ秘密の数値をクライアントが知らなくても、サーバーが正しく計算していることを検証する手法などが研究されています。
例えば、サーバーが秘密情報wをもち、クライアントのクエリxに対してあるプログラムFを実行した結果、z=F(x,w)をクライアントに返すとします。このときにクライアントがwを知らなくても、xに対して正しくzが計算されていることを確認する方法が研究されています。一例を挙げると、チューリッヒ工科大学とMIT(マサチューセッツ工科大学)などの共同研究グループが開発しているライブラリ「libsnark(GitHub)」があります。ちなみに、このライブラリでは、私が開発しているペアリングライブラリが利用されています(参考リンク(GitHub))。
Copyright © ITmedia, Inc. All Rights Reserved.