準同型暗号と秘密計算(MPC)の原理
データを暗号化したまま計算し、複数者が入力を隠したまま協調処理する――医療・金融のデータ共有を阻む「見せたくないが計算したい」の矛盾を、準同型暗号と MPC がどう解くかを原理から理解できます。
- 1.準同型暗号(HE)は復号せずに暗号文どうしの演算ができる暗号。加算だけ・乗算だけの部分準同型から、任意回数の加算と乗算を許す完全準同型(FHE)まであり、FHE は格子(LWE)上のノイズ付き暗号文を bootstrapping でノイズ除去して実現する。
- 2.MPC は複数者が各自の入力を秘匿したまま関数の出力だけを共同計算する技術。秘密分散ベース(Shamir/加法的、BGW・GMW)と Garbled Circuit(2者・Yao)が二大系統で、誰も単独では入力も中間値も復元できない。
- 3.FHE は単一サーバーへの計算委託、MPC は複数者間の協調計算に向く。プライバシー保護機械学習・秘匿照合・閾値署名などで実用化が進むが、FHE は数千〜数万倍の計算オーバーヘッドが依然ボトルネック。
解きたい問題:「見せずに計算する」
通常、データを計算するにはまず復号して平文に戻す必要があります。クラウドに重い計算を委託するなら、サーバーは平文を読める。複数の病院が患者データを持ち寄って統計を出すなら、互いに生データを見せ合う。これがプライバシーと有用性のトレードオフで、医療・金融・行政のデータ連携を阻む最大の壁です。
この矛盾を暗号で解くのが準同型暗号(Homomorphic Encryption, HE)と秘密計算(Secure Multi-Party Computation, MPC)です。両者は「平文を一切露出させずに計算結果だけを得る」という同じゴールを、異なる前提で達成します。HE は1 人がデータを暗号化して 1 つのサーバーに計算を委ねる形、MPC は複数者が各自の秘密入力を持ち寄って協調計算する形に向きます。基礎となる公開鍵暗号の考え方は 暗号の基礎 を前提とします。
準同型暗号:暗号文のまま演算する
準同型とは、平文に対する演算と暗号文に対する演算が「対応する」性質です。暗号化関数を Enc、復号を Dec とすると、ある暗号文上の演算 ⊙ が存在して次が成り立ちます。
Dec( Enc(a) ⊙ Enc(b) ) = a + b # 加法準同型
Dec( Enc(a) ⊙ Enc(b) ) = a × b # 乗法準同型
つまり復号鍵を持たない者が、暗号文だけを操作して、平文の和や積に対応する暗号文を作れる。サーバーは中身を一切知らないまま計算を代行できます。どこまでの演算を許すかで、HE は三段階に分かれます。
| 種類 | 許される演算 | 代表例 | 用途 |
|---|---|---|---|
| 部分準同型 (PHE) | 加算 または 乗算の一方だけ・無制限 | RSA(乗算)・ElGamal(乗算)・Paillier(加算) | 電子投票の集計・秘匿集約 |
| やや準同型 (SHE/leveled) | 加算と乗算の両方だが回数に上限 | BGV・BFV・CKKS(回数制限版) | 決まった深さの計算 |
| 完全準同型 (FHE) | 加算と乗算を任意回数(任意の関数) | Gentry系・TFHE・CKKS | 任意計算の委託 |
部分準同型の代表が Paillier 暗号で、Enc(a)・Enc(b) mod n^2 = Enc(a + b) という加法準同型を持ち、電子投票の票集計や秘匿統計で実用されています。教科書的 RSA も Enc(a)・Enc(b) = Enc(a × b) という乗法準同型を持ちますが、片方の演算しかできないため任意計算には使えません。
完全準同型(FHE):ノイズとの戦い
加算「と」乗算を両方とも任意回数できれば、論理ゲート(AND/XOR は乗算と加算で表せる)を組めるので、原理的にどんな計算も暗号文上で実行できます。これが FHE で、2009 年に Craig Gentry が初めて構成可能性を示しました。
現代の FHE はほぼすべて**格子問題 LWE(Learning With Errors)を土台にします。LWE 暗号文は意図的に小さなノイズ(誤差項)**を含む形で作られ、このノイズの存在が安全性の源です(詳細は ポスト量子暗号 の LWE 解説を参照)。問題は、暗号文を演算するたびにこのノイズが増大することにあります。
加算: ノイズはおおむね足し算で増える(緩やか)
乗算: ノイズはおおむね掛け算で増える(急激)
→ 演算を重ねるとノイズが許容上限を超え、復号すると正しい平文が得られなくなる
ノイズが閾値を超える前なら正しく復号できる――この「許容回数の範囲内」で止めるのが**やや準同型(SHE / leveled HE)**です。あらかじめ計算の深さ(乗算の段数)が分かっているなら、それに合わせたパラメータを選べば FHE を使わずに済み、実務では SHE のほうが高速で広く使われます。
Gentry のブレークスルーが bootstrapping です。ノイズが溜まった暗号文を、復号回路そのものを準同型に評価することでリフレッシュします。鍵となるのは「復号鍵を暗号化したもの(bootstrapping key)」を公開しておき、それを使って暗号文の中で復号を実行する点です。結果としてノイズの少ない新しい暗号文が得られ、平文は一度も露出しません。これにより演算回数の上限が外れ、任意回数=完全準同型が達成されます。代償は重さで、bootstrapping は FHE 最大の計算コスト要因です。
FHE スキームには用途別の系統があります。BGV / BFV は整数の厳密な演算(剰余演算)に向き、CKKS は実数・複素数の近似演算を許す代わりに機械学習のベクトル計算に適し、TFHE はビット単位のブール回路評価と高速 bootstrapping に強みがあります。SIMD バッチング(1 つの暗号文に多数の平文スロットを詰めて並列演算する)も性能の要で、CKKS が機械学習で好まれる理由の一つです。
FHE は理論的には何でもできますが、平文計算に比べ**数千〜数万倍(用途により百万倍)**の計算量と、暗号文の肥大化(1 ビットの平文が数 KB の暗号文になる)を伴います。bootstrapping を含む深い計算は依然として重く、CKKS の近似演算は誤差管理が必要です。「任意計算が可能」と「実用的な速度で可能」は別問題で、現状は秘匿推論など限定的な計算で実用化が進む段階です。
MPC:複数者で秘密を持ち寄る
HE が「1 人のデータを 1 つのサーバーに委ねる」のに対し、MPC(Secure Multi-Party Computation)は複数の参加者が各自の秘密入力を持ち寄り、関数の出力だけを全員で計算する枠組みです。古典的な例が百万長者問題――2 人がどちらが裕福かを、互いの正確な資産額を明かさずに判定する、というものです。
MPC が満たすべき安全性は次の二点に集約されます。プライバシー=各参加者は最終出力から推測できること以外、他者の入力を一切学習しない。正当性=出力は正しい関数値になる。攻撃者モデルとして、プロトコルに従いつつ盗み見る semi-honest(honest-but-curious) と、勝手に逸脱する malicious を区別し、後者に耐えるには追加コストがかかります。MPC には大きく二つの系統があります。
秘密分散ベースの MPC
一つ目が**秘密分散(Secret Sharing)**を土台とする方式です。秘密を複数の「シェア」に分割し、各参加者(またはサーバー)に配ります。シェア単体からは秘密が一切漏れず、規定の数だけ集めて初めて復元できます。
代表が Shamir の秘密分散で、秘密 s を定数項に持つ次数 k-1 の多項式 f(x) を作り、f(1), f(2), … を各人のシェアとします。k 個未満の点からは次数 k-1 の多項式が一意に定まらず秘密は完全に隠れ、k 個集めればラグランジュ補間で f(0) = s を復元できます。これが (k, n) 閾値方式です。より単純な加法的秘密分散では、s = s_1 + s_2 + … + s_n(mod 大きな素数)となるようランダムに分割し、全シェアを足さない限り何も分からない形にします。
加法的秘密分散(3者の例):
秘密 s を s = s1 + s2 + s3 (mod p) に分割
各サーバーは s_i だけを持つ → 単独では s が全く分からない
加算: 各自が自分のシェアを足すだけでよい(通信不要)
a = a1+a2+a3, b = b1+b2+b3 のとき
各 i が (a_i + b_i) を持てば、合計は a+b のシェアになる
乗算: シェアの単純な積では次数が合わず、参加者間の通信
(Beaver triple などの事前計算)が必要
ここが秘密分散ベース MPC の本質です。加算はローカルで完結する(通信不要)が、乗算には参加者間の対話が要る。この非対称性のため、計算(回路)の乗算段数がそのまま通信コストを決めます。BGW プロトコルは Shamir 分散の上で任意の算術回路を評価し、不正者が一定数(semi-honest なら n の過半数が正直、すなわち t < n/2)以下なら安全に計算できます(悪意ある攻撃者に耐える場合は t < n/3 とさらに厳しくなる)。GMW はブール回路版にあたります。
秘密分散の直接応用が閾値暗号・閾値署名です。秘密鍵を n 個のシェアに分け、k 個が協力したときだけ署名や復号ができる構成にすれば、単一の鍵保管者という単一障害点を排除できます。一部のシェアが漏れても k 未満なら鍵は安全で、暗号資産のウォレットや認証局の鍵管理で実用化されています。鍵そのものを一度も 1 か所に再構成せずに署名を生成できる点が重要です。署名方式の基礎は 署名スキーム を参照してください。
Garbled Circuit:2 者間の秘匿計算
二つ目の系統が Garbled Circuit(ガーブル回路、Yao のプロトコル)で、主に2 者間の秘匿計算に使われます。発想は「論理回路の真理値表を暗号化して相手に渡す」ことです。
一方(Garbler)が計算したい関数をブール回路に変換し、各ワイヤの 0 / 1 に**ランダムなラベル(鍵)**を割り当てます。各ゲートの真理値表は、入力ラベルを鍵として出力ラベルを暗号化した形に「ガーブル(撹乱)」され、行はシャッフルされます。相手(Evaluator)は自分の入力に対応するラベルだけを受け取り、暗号化された表を一段ずつ復号して回路全体を評価しますが、ラベルがどちらの真理値か分からないため中間値を一切知りません。
Garbler: 回路の各ワイヤに 0/1 ラベルを割当て、各ゲートを
ラベルで暗号化した「ガーブル真理値表」を作成 → 送付
Evaluator: 自分の入力ラベルだけ受け取り、表を復号しながら評価
最後の出力ラベルだけ意味(0/1)に変換 → 結果を得る
ここで核心的に必要なのが **Oblivious Transfer(OT, 紛失通信)**です。Evaluator は自分の入力ビットに対応するラベルを Garbler から受け取らねばなりませんが、Garbler には Evaluator の入力ビットを知られたくないし、Evaluator は要求していないほうのラベルを得てはならない。OT はまさにこの「2 つのうち欲しい片方だけを、どちらを選んだか相手に知られず受け取る」プリミティブで、Garbled Circuit の安全性の土台になります。OT 自体は Diffie-Hellman のような公開鍵プリミティブから構成できます。
| 観点 | 秘密分散ベース (BGW/GMW) | Garbled Circuit (Yao) |
|---|---|---|
| 参加者数 | 3者以上に自然に拡張 | 基本は2者向け |
| 計算の表現 | 算術回路(加算/乗算) | ブール回路(ゲート) |
| 通信パターン | 乗算ごとに対話・ラウンド多い | 基本1〜2ラウンドで完結 |
| コストの主因 | 乗算段数・ラウンド数 | 回路サイズ・OT 回数 |
| 向く計算 | 整数演算・統計・閾値署名 | 比較・条件分岐の多い関数 |
HE と MPC の使い分けと実用化
両者は競合ではなく前提が違うため、適材適所で使い分けます。
- 準同型暗号(HE/FHE):データ提供者は 1 人、計算は信頼できない単一サーバーに委ねたい場合。暗号化して送れば、以後の通信は不要(非対話)で、サーバーが結果暗号文を返すだけ。代償は計算オーバーヘッドの大きさ。
- MPC:複数の当事者が各自の秘密入力を持ち寄り、誰にも生データを渡したくない場合。計算は軽い(平文計算に近い演算もある)が、参加者間で何ラウンドも通信する必要があり、ネットワーク遅延がコストを支配します。
実用化が進んでいる代表領域を挙げます。プライバシー保護機械学習では、暗号化したまま推論する秘匿推論(CKKS ベースの FHE)や、複数組織がデータを集約せずモデルを学習する協調学習が研究・実装されています。**秘匿照合(Private Set Intersection, PSI)**は、2 者が持つ集合の共通要素だけを、それ以外の要素を明かさず求める技術で、連絡先マッチングや不正検知で使われます。閾値署名・分散鍵管理は前述のとおり暗号資産で広く実用化されています。
準同型暗号は復号せずに暗号文上で演算する暗号で、加算か乗算の一方だけが部分準同型(PHE, 例 Paillier 加法・RSA 乗法)、両方を任意回数許すのが完全準同型(FHE)。FHE は LWE 由来のノイズが演算で増大する問題を bootstrapping(復号回路を準同型評価してノイズ除去)で解決する。MPC は複数者が入力を秘匿したまま関数値を計算する枠組みで、秘密分散ベース(Shamir/加法的・BGW/GMW、加算はローカル・乗算は対話)と Garbled Circuit(2者・Yao、Oblivious Transfer に依存)が二大系統。HE は単一サーバーへの非対話な計算委託、MPC は多者間の対話的協調計算に向く。
まとめ
準同型暗号と MPC は、平文を一切露出させずに計算結果だけを得るという同じ目的を、異なる前提で達成します。準同型暗号は暗号文のまま演算でき、加算か乗算の一方だけの部分準同型、回数制限付きのやや準同型、任意回数の**完全準同型(FHE)**に分かれます。FHE は格子(LWE)暗号文のノイズが演算で増えていく問題を、bootstrapping で暗号文の中で復号を行いノイズを除去することで解決しますが、計算オーバーヘッドが実用化の壁として残ります。
MPC は複数者が秘密入力を持ち寄って関数値だけを計算する枠組みで、秘密分散ベース(加算はローカル・乗算は対話が必要)と Garbled Circuit(Oblivious Transfer に依存する 2 者間方式)の二系統があります。HE は単一サーバーへの非対話な計算委託に、MPC は多者間の対話的協調に向き、秘匿推論・秘匿照合・閾値署名などで実用が進んでいます。土台となる公開鍵の基礎は 暗号の基礎、根拠を見せずに正しさを示す関連技術は ゼロ知識証明、FHE が依拠する格子問題は ポスト量子暗号 と併せて押さえると、プライバシー保護計算の全体像がつかめます。
セキュリティ Article
準同型暗号と秘密計算(MPC)の原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
準同型暗号
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 6
導入後に効く点
MPC は複数者が各自の入力を秘匿したまま関数の出力だけを共同計算する技術。秘密分散ベース(Shamir/加法的、BGW・GMW)と Garbled Circuit(2者・Yao)が二大系統で、誰も単独では入力も中間値も復元できない。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 6
判断チェックリスト
- 自社の用途が「準同型暗号 / FHE」に近いか確認する。
- 強みである「準同型暗号(HE)は復号せずに暗号文どうしの演算ができる暗号。加算だけ・乗算だけの部分準同型から、任意回数の加算と乗算を許す完全準同型(FHE)まであり、FHE は格子(LWE)上のノイズ付き暗号文を bootstrapping でノイズ除去して実現する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。