Shamirの秘密計算
こんにちは.物工/計数 Advent Calendar 2019の2日目を担当する,計数工学科B4のト部蛸焼です.今日はShamirによって提案された秘密計算の手法をご紹介します.
adventar.org
🐙🍣🐙🍣🐙🍣🐙🍣🐙🍣
導入
🍣🐙🍣🐙🍣🐙🍣🐙🍣🐙秘密計算とは
秘密計算とは,簡単に言えば「自分の持っている秘密の情報をほかの人に知られないまま目的の量を計算*1する」手法を研究する分野です.秘密計算は認証・デジタル署名・秘密通信などと並んで暗号理論の一角をなす分野で,次のような場面での応用が期待されています.
- 電子投票
- 特許を申請する前に行う先行技術調査
- 秘密性の高い情報の研究
具体的な例を挙げます.いま,ある学生が所属学科の学生の平均体重のデータを研究に使いたくなったとします.彼はみんなの体重を聞き回ろうとしますが,すぐに「みんなは自分の体重を他人に教えたがらないだろう」と思い直します.果たして,学科のみんなが自分の持っている秘密の情報 (=体重) をほかの学生に知られないまま目的の量 (=平均値) を計算するなんてことは可能でしょうか.可能です.そう,秘密計算なら.
状況設定と方針
今回扱うShamirの秘密計算における状況設定は以下の通りです.以下では理解を優先してとします*5.
体には和と積の2つの演算があります.そのため,体上で秘密計算を行うためには,この2つの演算を “秘密に” 行う方法を考えればよいことになります.
Shamirは,そのために多項式を使いました.具体的には,秘密を計算に使うときに,まずそれに対応する多項式を,を満たすように一つ選びます.そして,その秘密を復元するピースとしてをプレイヤーにそれぞれ渡します.
核となる考えはこれだけです.この方法でうまくいくかはピンと来ないと思いますが,実はこれでの値を隠したまま,の値が関係する和や積が計算できます.
🐙🍣🐙🍣🐙🍣🐙🍣🐙🍣
準備
🍣🐙🍣🐙🍣🐙🍣🐙🍣🐙ここではShamirの秘密計算を理解するための数学的な準備を行います.
Lagrange補間
Lagrange補間とは,個の点が与えられたときに,それらすべての点を通る次以下の多項式を計算する方法です.具体的には次の式で計算できます.\begin{align}
f(X) &= \sum_{i \in C} f(i) \delta_{i} (X), \label{eq:lll} \\
\delta_{i} (X) &= \prod_{j \in C \setminus \{i\}} \frac{X-j}{i-j}.
\end{align}
この命題の証明は註に譲ります*6.
また,として,ベクトルをrecombination vectorと呼ぶことにします.
Lagrange補間を使うと,個以上の点での値が分かれば元の多項式が復元できます.特にでの値も復元できます.
用語の定義
以下で,は秘密計算を行うプレイヤーの人数です.\begin{align}
[a;f]_{t} := \begin{pmatrix}
f(1) \\ f(2) \\ \vdots \\ f(n)
\end{pmatrix}.
\end{align}
次の命題が成立します.証明は容易です.ここではベクトルの演算がうまく体の演算に対応することと積の場合には多項式の次元が倍増することの2つが重要です.
1. .
2. .
3. . ここで左辺の積は要素ごとの積を表す.
2. プレイヤーがを分配 (distribute) するとは,次の2つの手続きを行うこととする.
- となる次以下の多項式を乱択する.
- 各プレイヤーにを密かに送る.
3. プレイヤー全員がを保持 (hold) しているとは,プレイヤー全員が次以下の多項式に基づいて秘密のシェアを獲得していること.
4. プレイヤー全員がとを保持しているとする.このとき,プレイヤー全員がを計算 (compute) するとは,各プレイヤーが秘密のシェアと秘密のシェアからを計算することをいう.
を計算することやを計算することも同様に定義する.
いま定義した概念と演算回路を用いてShamirの秘密計算を実現する方法が,次に示すCEPS (Circuit Evaluation with Passive Security) *7です.
🐙🍣🐙🍣🐙🍣🐙🍣🐙🍣
CEPSの導入
🍣🐙🍣🐙🍣🐙🍣🐙🍣🐙CEPSの仕様を以下に示します.
……といわれてもよくわからないので,次の例題で詳細を確認しましょう.
1. 入力の共有
まず,各プレイヤーにのシェアを分配します.分配では多項式を乱択する必要がありました.ここでは次のを乱択したとしましょう.
\begin{align}
i_{1}(X) &:= 2 + X, \label{eq:x1share}\\
i_{2}(X) &:= 4 - 2X, \label{eq:x2share} \\
i_{3}(X) &:= 3 + 2X. \label{eq:x3share}
\end{align}すると各プレイヤーに渡されるのシェアは表1のようになります.
ちなみにこの表は,例えばプレイヤーはについて3,について2,について5という値を知っているということを表しています.いま読み取った値は各変数の本当の値 (=秘密の値) を復元するために使えるピースであり,一般には本当の値とは異なる値になります.
2. 計算段階
先にを計算します.表1から各プレイヤーは表2のように各変数について情報を持ちます.値をそのまま足すだけです.
次にを計算します.先ほども述べたようにただ掛けただけでは秘密を埋め込んだ多項式の次数が2倍になってしまうので,それを避ける工夫がなされます*8.とはいえまずは値の掛け算をします.その計算結果は表3のようになります.
秘密を埋め込んだ多項式の次数を落とすため,次のように多項式を選び直します.
まずは各プレイヤーが多項式を乱択します.ここでは以下を選んだとします.
\begin{align}
f_{1}(X) &:= 25-7X, \\
f_{2}(X) &:= 28-6X, \\
f_{3}(X) &:= 27+X.
\end{align}
次にプレイヤーが3人のときのrecombination vector を計算します*9.
\begin{align}
\boldsymbol{r} = \begin{pmatrix}
3 \\ -3 \\ 1
\end{pmatrix}.
\end{align}最後に,プレイヤー全員がを計算します.こうするとなぜうまくいくのかは後で4. CEPSの正当性のところで示します.これで積のゲートの処理は終わりです.
結果的には表4のようなシェアを各プレイヤーは保持したことになります.なんだかうまくいってそうです.
3. 出力の復元
計算は終わったのであとは計算結果を復元する作業に入ります.
まずプレイヤー全員がほかのプレイヤーに自分のシェアを送ります.すると,結局はプレイヤー全員がの値についてというシェアを知った状況になります.あとは先に述べたLagrange補間を行えば正しいの値が復元できます.
\begin{align}
y = \sum_{i=1}^{3} r_{i} y_{i} = \begin{pmatrix}
3 & -3 & 1
\end{pmatrix} \begin{pmatrix}
16 \\ 14 \\ 12
\end{pmatrix} = 18.
\end{align}
🐙🍣🐙🍣🐙🍣🐙🍣🐙🍣
CEPSの正当性
🍣🐙🍣🐙🍣🐙🍣🐙🍣🐙ここでは,特に2. 計算段階の積のゲートについて正しさを確かめます*10.具体的には「CEPSの仕様」で突然導入した多項式が,0での値がであるような次の多項式であることを示します.
計算します.
\begin{align}
\sum_{i=1}^{n} r_{i} [h(i); f_{i}]_{t}
&= \left[ \sum_{i=1}^{n} r_{i} h(i); \sum_{i=1}^{n} r_{i}f_{i} \right]_{t} \\
&= \left[ h(0) ; \sum_{i=1}^{n} r_{i}f_{i} \right]_{t} \label{eq:recombine} \\
&= \left[ ab ; \sum_{i=1}^{n} r_{i}f_{i} \right]_{t}.
\end{align}なお,式\eqref{eq:recombine}の等号は,recombination vectorについて
\begin{align}
h(0) = \sum_{i=1}^{n} r_{i} h(i)
\end{align}が成り立つことによります.これで目標は達成されました.
🐙🍣🐙🍣🐙🍣🐙🍣🐙🍣
CEPSの秘密性
🍣🐙🍣🐙🍣🐙🍣🐙🍣🐙ここではCEPSのプロトコルを行う過程で,プレイヤーが他の人の秘密の値を特定できないことを説明します.簡単のため*11,先ほどの例題の場合を考えます.さらに,特にプレイヤーに注目し,自分の得ている情報から他の値の組み合わせを一意に定められるか否かを試します.なお,以下ではプレイヤーにとって確定している値は青い字で表します.
まず,の計算についてです.この時点でが得ている情報は表5で全てです.
変数の値は例題によると本当は4でした.しかし,プレイヤーはこの値を知りません.これを当てるために,とりあえずいろいろな数字で試し打ちをしてみます.すると例えば表6や表7のような結果が得られます.
これから分かるのは,プレイヤーの持つ情報だけではの値を3なのか (表6),4なのか (例題),5なのか (表7) を特定できないということです*12.よっての秘密は守られたといえます.
今度はについて確かめます.最終的なのシェアも含めたの得ている情報は表8で全てです*13.
先ほどと同様に試し打ちをします.すると,表9や表10に示したものがあります.
ということはやの値の秘密性は担保されたことになります.
結局,プレイヤーは他のプレイヤーの値の情報を入手できませんでした.これで秘密性が示されました.
🐙🍣🐙🍣🐙🍣🐙🍣🐙🍣
まとめ
🍣🐙🍣🐙🍣🐙🍣🐙🍣🐙今回はCEPSと呼ばれるプロトコルを導入し,その正しさを検証しました.ところどころ註で述べましたが,CEPSの正当性や秘密性を数学的に証明するとなると,もっと複雑な手続きが必要となります.概して,暗号の分野では直観的に「安全だ」と判断することは簡単でも,それを数学的に証明しようとなると格段に難しくなります.これは今後の私の人生でやや不安なところでもあります.
ともかく,今回お伝えしたかったのは,
- 秘密計算という分野があること
- 実際に秘密計算を行う方法が存在すること
の2つです.なんとなくでもこれらが伝わっていれば幸いです.
稚拙で冗長な文章でしたが,ここまでお読みいただきありがとうございました.
明日の物工/計数 Advent Calendar 2019の記事もお楽しみに!
参考文献
- Ronald Cramer, Ivan Bjerre Damgård, and Jesper Buus Nielsen. Secure Multiparty Computation and Secret Sharing. Cambridge University Press. 2015.
- 菊池亮, 五十嵐大. 秘密計算の発展 —データを隠しつつ計算する仕組みとその発展—. https://www.jstage.jst.go.jp/article/essfr/12/1/12_12/_pdf/-char/en. 2018. (参照: 2019年11月23日).
*1:この「計算」には単なる数値の演算だけでなく文字列の一致検索も含まれます.
*2:先の例だと各学生の体重の値がとなります.
*3:とします.
*4:正確にはもう少し厳しい条件が課されます.
*5:実際に演算回路で計算を行うときには,体は有限体を考えます.
*6:証明.次の多項式には個の係数があるが,いま,であるから,上の点を全て通る多項式は一意に定まる. はその定義式から \begin{align} \delta_{i}(j) = \begin{cases} 1 & (i=j), \\ 0 & (i \neq j). \end{cases} \end{align}したがって式\eqref{eq:lll}の右辺にを代入すると \begin{align} \sum_{i \in C} f(i)\delta_{i}(j) = f(j). \end{align}
*7:passive securityとは,秘密計算のプロトコルに対する攻撃者のモデルを指します.秘密計算では,攻撃者がプロトコルに従ったまま秘密を盗聴する場合 (passive modelまたはsemi-honest model) と,攻撃者がプロトコルから逸脱して秘密を改竄しうる場合 (active modelまたはmalicious model) の2つを考えます.今回はそのうち比較的条件が緩い前者のセキュリティモデルを考え,その枠組みで安全性を考えています.
*8:なぜ避ける必要があるのでしょうか.いま,この例から少し離れて,例えばを計算する場合を考えてみます.積を単純な掛け算で終わらせてしまうと,この1回の積の計算で秘密を埋め込んだ多項式の次数はもとの2倍になります.すると,回だけこの積を繰り返すと,秘密を埋め込んだ多項式の次数はプレイヤーの人数より大きくなってしまいます.これではLagrange補間によって多項式を復元することはできません.そのため,次数を2倍にしたまま放置してはいけないのです.
*9:この計算を具体的に示します.recombination vectorの番目の成分は \begin{align} r_{i} = \delta_{i}(0) = \prod_{j \neq i} \frac{0-j}{i-j} \end{align}で与えられるので,次のようにして成分の値が求まります. \begin{align} r_{1} &= \frac{(-2)(-3)}{(1-2)(1-3)} = 3, \\ r_{2} &= \frac{(-1)(-3)}{(2-1)(2-3)} = -3, \\ r_{3} &= \frac{(-1)(-2)}{(3-1)(3-2)} = 1. \end{align}
*10:厳密には「すべてのプレイヤーが,与えられた入力に対して意図される正しい出力を,確率1で得られる」ことを示す必要があります.この性質はperfect correctnessと呼ばれます.プロトコルの途中ではたくさん乱数を選びます.そのどの選び方をしてもプロトコルは正しく機能しますよ,というのがperfect correctnessです.ちなみにここでの「perfect」は確率1で成り立つことを,「correctness」はプロトコルが正しく機能することを表しています.
*11:この部分の話を厳密にしようと思うとかなり厄介ですが,その流れだけここに簡単に記します.そもそもここでいう秘密性とは,perfect privacyという「 () 人以下の邪悪なプレイヤーからなる集合をとしたとき,プロトコルの実行過程から以上の情報を得られないこと」を意味します.その下で,まず,プロトコルを実行して分かる情報を整理します.そして「シミュレーター」と呼ばれるこのプロトコルを仮想的に再現する機構を構築して,実際にプロトコルを行って得られる情報と,そのシミュレーターの出力とを比較します.もし,この2つがある意味で一致すれば確率的に安全だと評価します.
*12:体が無限体でなくても値は確定しません.
*13:ここで,表8の上側にあるの欄についてですが,この時点でが埋め込まれている多項式は2次であるため,変数の値18が後から分かっても他の2人のプレイヤーが持っているシェアの値は特定できません.また,先の段階での値が特定できていないことにも注意が必要です.