コンテンツにスキップ

case04(再構築デモ): 攻撃の設計 — 4/7

弱点の評価 で見たとおり、公表統計は個票についての制約です。これらを連立させて解く手順を設計します。これは「攻撃を推奨する」ためではなく、安易な統計公表がいかに脆いかを理解し、正しい対策(差分プライバシー等)に結びつけるための教材です。

攻撃の全体像

flowchart TD
    A["公表統計表<br/>人数・中央値・平均(14行、7行は秘匿)"] --> B
    B["① 変数を用意<br/>7人ぶんの年齢・性別・人種・配偶を未知数に"] --> C
    C["② 統計を制約に翻訳<br/>各公表行 → 人数・合計区間・中央値の制約"] --> D
    D["③ 制約充足問題を全解列挙<br/>全ての解を数え尽くす(CP-SAT)"] --> E
    E -->|解が1通り| F["再構築された個票<br/>7人の年齢・属性が確定"]
    E -->|複数解| G["曖昧さが残る<br/>(統計が少ない/粗い場合)"]

各ステップの狙い

ステップ やること ポイント
① 変数を用意 総人口の公表値(7人)から、7人ぶんの未知数(年齢・性別・人種・配偶関係)を置く 攻撃者は「人数」だけは公表から分かる
② 統計を制約に翻訳 公表された各行を、人数・合計(平均×人数)・中央値の制約に変換 秘匿された行は制約にしない(情報がないだけ)
③ 全解列挙 すべての制約を満たす個票の組合せを数え尽くす(CP-SAT) 解が1通りなら個票が確定。複数なら曖昧さが残る

なぜ『全解列挙』が必要なの?1つ見つければ十分では?

再構築で怖いのは「唯一解」の場合です。解が1つしかないなら、それは間違いなく本物の個票です。だから「1つ見つける」だけでなく「他に解が無いことを確かめる(数え尽くす)」ことが本質。このデモでは、7行の制約だけで解が1通りに決まり、伏せた7行が無くても個票が確定してしまいます。

小集団 × 多数の正確な統計 = 危険

  • 統計が少ない/粗いと解は多数残り、個票は特定できない(曖昧さがプライバシーを守る)。
  • 統計が多い/正確だと解が一意に絞られ、個票が復元される。
  • 本件は7人という小集団に、人数・中央値・平均を重ねたため、セルを半分伏せてもなお一意に決まります。

この設計が示すこと(対策への布石)

攻撃が成立する条件を裏返すと、そのまま対策になります(詳細は 結果)。

  • 統計に不確かさ(ノイズ)を残す: 公表値に数学的なノイズを加える(差分プライバシー)と、制約が「幅」を持ち、解が一意に絞れなくなる。
  • 公表する統計の量・精度を絞る: 細かいグループの統計を出しすぎない/粗く丸める。小集団の統計は特に慎重に。
  • 秘匿だけに頼らない: セルの抑制は再構築を止めないと理解し、上の対策と組み合わせる。

→ 具体的な制約の作り方は 攻撃の仕様、実行は ② 実装(Colab)、復元後の個票は 復元後テーブル