TL

白箱暗号と難読化の原理・限界

鍵をソフトウェアだけで隠したい――DRM やモバイル決済が抱えるこの難題に、白箱暗号とコード難読化がどこまで応え、なぜ原理的に破られるのかが分かる。テーブル化・iO・鍵抽出攻撃まで正確に押さえられる。

応用白箱暗号難読化iODRM鍵抽出暗号最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.白箱暗号は、攻撃者がメモリ・レジスタ・実行をすべて観測できる前提で鍵を隠す。鍵を AES のラウンド関数に焼き込み、暗号化されたルックアップテーブル列へ変換することで、鍵そのものを表に出さない。
  • 2.難読化の理論的限界は不可識別性難読化(iO)で定式化される。理論上 iO は実現可能だが現状は実用に遠く、白箱の安全性に必要な仮想ブラックボックス難読化は一般には不可能と証明されている。
  • 3.実装ベースの鍵抽出攻撃(テーブルの代数解析、DCA/DFA)が次々に成立しており、公開された白箱 AES は短時間で鍵が抜かれた。白箱は「破られない」ではなく「破るコストを上げる」遅延防御と捉えるべき。

脅威モデル:攻撃者が実行環境の中にいる

通常の暗号は、攻撃者が暗号文(と場合により平文)しか見られないブラックボックスモデルで安全性を論じます。鍵はサーバーやハードウェアの鍵保護の中にあり、攻撃者の手の届かない場所にある前提です。

白箱暗号(white-box cryptography)が想定するのはその真逆の白箱(ホワイトボックス)モデルです。攻撃者は暗号処理が動くマシンを完全に支配し、次のすべてを行えます。

  • 実行中の全メモリ・全レジスタを任意の時点で読み書きする。
  • 命令を1ステップずつ実行し、中間値をすべて観測する。
  • バイナリを逆アセンブルし、関数を好きな入力で何度でも呼ぶ。

この前提では、鍵を変数に置けば即座に読まれます。AES_encrypt(key, plaintext) のような実装は、key がメモリに載った瞬間に終わりです。白箱暗号の目標は、こうした全観測能力を持つ攻撃者からでも、鍵を抽出させないことにあります。DRM(動画・ゲームの著作権保護)、モバイル決済(HCE によるソフトカード)、ソフトウェアライセンスなど、信頼できるハードウェアを前提にできない場面が主戦場です。

なぜハードウェアで解決しないのか

白箱が必要になるのは、TEE / セキュアエンクレーブや HSM のような耐タンパハードウェアが使えない、あるいは普及していない環境だからです。多種多様な Android 端末に DRM を配る、既存の決済アプリにソフトだけで鍵保護を足す――こうした「ハードに頼れない」制約のもとで、ソフトウェア単独で鍵を守ろうとするのが白箱の動機です。裏返せば、ハードウェア保護が使える環境ではそちらが本筋であり、白箱は次善策です。

テーブル化:鍵を関数に溶かし込む

白箱 AES の基本アイデア(Chow ら 2002)は、鍵を独立した値として保持せず、暗号アルゴリズムそのものに焼き込むことです。AES の各ラウンドは「SubBytes(S-box 置換)→ ShiftRows → MixColumns → AddRoundKey(ラウンド鍵 XOR)」から成りますが、このうち鍵が登場するのは AddRoundKey だけです。

そこで、鍵が固定されている点を利用します。固定鍵に対して AddRoundKeySubBytes を合成した関数 T[x] = SubBytes(x XOR roundkey) を考えると、これは入力1バイトから出力1バイトへの写像にすぎず、256 エントリのルックアップテーブルとして事前計算できます。鍵はテーブルの中身に溶け込み、もはや独立した値としては現れません。

通常:   状態 ──XOR(ラウンド鍵)──> SubBytes ──> ...   ← 鍵がメモリに載る
白箱:   状態 ──T_lookup[状態]──> ...                  ← 鍵はテーブルに焼き込み済み
        (T は固定鍵から事前計算した置換表。鍵という変数は存在しない)

ただしテーブルをそのまま置けば、攻撃者は既知の AES 構造と照合して T[x] = SubBytes(x XOR k) を逆算し、鍵 k を復元できてしまいます。これを防ぐのが内部エンコーディングです。各テーブルの入出力に、ランダムな全単射 fg(バイト単位の置換やビット混合)を被せ、T'[x] = g(SubBytes(f_inv(x) XOR k)) の形に変形します。隣り合うテーブル間でエンコーディングが打ち消し合う(前段の出力 g を後段の入力 f_inv がほどく)よう連鎖させるので、全テーブルを通せば正しい AES になるが、個々のテーブル単体を見ても鍵も中間値も読めないという状態を作ります。MixColumns の線形変換も行列として展開し、同様にエンコードしたテーブル群(type II / type III / type IV テーブル)に分解します。

本質は「合成して隠す」

白箱化の核心は、(1) 固定鍵を前提に鍵入り演算をテーブルへ事前計算し、(2) そのテーブルにランダムな可逆エンコーディングを前後で被せて中身を撹乱し、(3) エンコーディングを隣接テーブル間で相殺させて全体の関数を保つ、という三段構えです。攻撃者が見るのは「意味不明な巨大ルックアップテーブルの列」であり、鍵という名前の変数はどこにも存在しません。

理論的限界:iO と仮想ブラックボックス難読化

白箱暗号は本質的にプログラム難読化の一種です。「鍵入りの暗号化関数」というプログラムを、機能は保ったまま中身(鍵)を読めなくする――これがコード難読化そのものだからです。では難読化はどこまで可能なのか。暗号理論はこれを2つの概念で定式化します。

  • 仮想ブラックボックス難読化(VBB):難読化されたプログラムから得られる情報が、「入力を入れて出力を見る」ブラックボックスアクセスから得られる情報と等価であること。つまりコードを見ても、関数を外から叩く以上のことは一切分からない。白箱が理想とするのはこれです。
  • 不可識別性難読化(iO, indistinguishability obfuscation)同じ機能を持つ2つのプログラムを難読化した結果が、互いに区別できないこと。VBB より弱い保証です。

決定的な結果として、Barak ら(2001)は一般の VBB 難読化は不可能だと証明しました。どんな難読化器を持ってきても、それを破る(ブラックボックスでは得られない情報を漏らす)プログラムを構成できる、という反例による不可能性です。これは白箱暗号にとって痛烈です。「コードを見ても鍵が一切漏れない」という理想は、一般には数学的に達成不可能だからです。

一方 iO は、Garg ら(2013)以降、多重線形写像や格子仮定にもとづいて理論上は実現可能だと示され、2020 年には標準的な仮定からの構成も与えられました。iO があれば多くの暗号プリミティブが導けるため「暗号の中心的目標」と呼ばれます。しかし現状の iO 構成は、1回の難読化に天文学的な時間とサイズを要し、実用には程遠い段階です。

iO は白箱を救わない

「iO が実現可能なら白箱も安全では」と早合点しがちですが、二重に注意が要ります。第一に、白箱が欲しいのは VBB 相当の保証であり、それは不可能だと証明済みです。iO の弱い保証では、鍵が漏れないことを直接は意味しません。第二に、たとえ iO で安全な白箱を構成できたとしても、現行の iO は実装が非現実的に重く、DRM や決済のような実運用には載りません。理論上の可能性と、実装可能な防御の間には大きな隔たりがあります。

実装ベースの鍵抽出攻撃

理論の不可能性に加え、現実に公開された白箱実装はことごとく破られてきました。攻撃は大きく代数的解析と自動解析の2系統です。

代数的解析(BGE 攻撃):Billet ら(2004)は、Chow らの白箱 AES のテーブル構造を代数的に解析し、内部エンコーディングを剥がして鍵を復元する手法を示しました。エンコーディングは可逆な小さな全単射の合成にすぎないため、テーブルの入出力関係を方程式として解くと、撹乱を打ち消して元の SubBytes(x XOR k) 構造へ還元できます。設計を完全に知っていれば、原理的に鍵まで到達できることを示した結果です。

さらに強力なのが、設計を知らなくても効く自動解析です。これらはサイドチャネル攻撃の発想を、物理デバイスではなくソフトウェア実行のトレースに適用します。

  • DCA(差分計算解析):実行中にアクセスされたメモリアドレスや中間値の系列を計算トレースとして記録し、多数の平文について集める。鍵バイトの候補ごとに「この鍵ならこの中間ビットはこうなる」という予測を立て、トレース中のどこかのビットと統計的相関を取る。物理 DPA のソフトウェア版で、エンコーディングの詳細を知らずに鍵が抜ける。
  • DFA(差分故障解析):実行の途中で中間状態のバイトを意図的に書き換え(フォールト注入)、正常な出力と故障出力の差分から鍵を導く。攻撃者がメモリを書き換えられる白箱前提では、フォールト注入は容易に行える。
公開白箱の実績:すべて陥落

白箱暗号の難読化コンテスト(CHES の WhibOx など)に投稿された多数の実装は、DCA や DFA によって短時間で鍵を抽出されてきました。商用 DRM の白箱も、十分な動機を持つ攻撃者には破られています。白箱は「鍵を絶対に守る」ものではなく、鍵抽出のコストと時間を引き上げる遅延防御として理解すべきです。秘密の設計に頼る(隠蔽によるセキュリティ)点も、公開鍵暗号の原則と相容れません。

整理:何が原理で何が運用か

白箱は数学的保証を欠き、攻撃が成立する。使えるならハードウェア保護が本筋で、白箱はそれが不可能な環境の妥協策。
観点白箱暗号ハードウェア保護(HSM / TEE)
脅威モデル実行環境を完全に支配する攻撃者ハードの耐タンパ境界の外にいる攻撃者
鍵の所在テーブルに焼き込み(変数として存在しない)保護境界の内側に隔離
理論的保証VBB は不可能・iO は実用外物理的隔離と構成証明で裏打ち
代表的攻撃BGE / DCA / DFA による鍵抽出サイドチャネル・フォールト(物理アクセス前提)
位置づけコストを上げる遅延防御本筋の鍵保護

実務での向き合い方は明確です。第一に、白箱だけに鍵の安全を委ねないこと。可能ならハードウェアの鍵保護や TEE を使い、白箱はそれが届かない環境の追加の壁に留めます。第二に、遅延防御として使うなら、鍵ローテーションやデバイスバインディング、改ざん検知、サーバー側のリスク判定と組み合わせて多層化し、単一の白箱が破られても被害を限定する設計にします。第三に、自前で白箱を実装しないこと。公開アルゴリズムが軒並み破られている領域であり、内部エンコーディングの設計は専門性が極めて高く、独自実装はほぼ確実に弱くなります。

試験・面接で問われる要点

(1) 白箱モデルは攻撃者がメモリ・レジスタ・実行をすべて観測できる前提に立つ。(2) 白箱 AES は固定鍵をテーブルに焼き込み、内部エンコーディングで撹乱して鍵という変数を消す。(3) 理想の VBB 難読化は一般に不可能(Barak ら)、iO は実現可能だが実用外。(4) BGE(代数解析)/ DCA / DFA で実装から鍵が抽出され、公開白箱は破られてきた。(5) 白箱は「破られない」ではなく鍵抽出コストを上げる遅延防御であり、ハードウェア保護が使えるならそちらが本筋。

セキュリティ Article

白箱暗号と難読化の原理・限界を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

白箱暗号

比較で見る軸

難易度: advanced / カテゴリ: セキュリティ / タグ数: 6

導入後に効く点

難読化の理論的限界は不可識別性難読化(iO)で定式化される。理論上 iO は実現可能だが現状は実用に遠く、白箱の安全性に必要な仮想ブラックボックス難読化は一般には不可能と証明されている。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
セキュリティ
タグ数
6

判断チェックリスト

  • 自社の用途が「白箱暗号 / 難読化」に近いか確認する。
  • 強みである「白箱暗号は、攻撃者がメモリ・レジスタ・実行をすべて観測できる前提で鍵を隠す。鍵を AES のラウンド関数に焼き込み、暗号化されたルックアップテーブル列へ変換することで、鍵そのものを表に出さない。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

白箱暗号難読化iODRM鍵抽出白箱暗号難読化iO