二重暗号の定義:何を「2段階」にするのか
二重暗号とは、平文(元データ)に対して暗号化を2回行う考え方です。たとえば、1回目の暗号化結果をそのまま2回目の入力にして、最終的な暗号文を得ます。ここで重要なのは「2回暗号化する」という外形だけでなく、2回それぞれで使う鍵・方式・設定(特に暗号モード)・入出力の扱いがどうなっているかです。
一般に、二重暗号は“強さが自動的に増える魔法”ではありません。安全性は、暗号方式の性質、鍵の独立性、運用(鍵管理・再利用・並行利用)、そして改ざんに対する扱い(認証や完全性の確保)に左右されます。したがって「二重にしたから安全」と断定するのではなく、何が満たされているかを確認する必要があります。
簡単なモデル:暗号化→暗号化、復号は逆順
理解のため、概念モデルとして次の流れを考えます。
- 暗号化:平文 P を使い、鍵 K1 で暗号化して中間結果 C1 を作る
- 続けて、C1 を鍵 K2 で暗号化して最終暗号文 C2 を作る
- 復号:まず C2 を K2 で復号して C1 を得る
- 次に C1 を K1 で復号して元の平文 P に戻す
この「復号は暗号化の逆順」という原理はシンプルですが、実装では細部が重要になります。たとえば、2回目の暗号化が“中間結果の形式”をどのように扱うか(そのままバイト列として扱うのか、テキスト化した上で再暗号化するのか)で、復号の前提が変わり得ます。また、暗号方式が“認証付き”であるかどうかも、全体の挙動に影響します。
主要な構成要素:鍵、方式、モード、そして完全性
二重暗号で安全性や挙動を左右しやすい要素は、次の4つに整理できます。
- 鍵の分離
- K1 と K2 が同じであったり、関係が強すぎたりすると、二重化の意味が薄くなります。
- 鍵が別々に管理され、独立して生成・保護されているかが重要です。
- 暗号方式・モードの整合
- それぞれの段で同じ方式を使う場合でも、暗号モード(例:乱数の扱い、初期化ベクトルの扱い、ブロック/ストリームでの前提)が適切に組み合わされていないと、意図しない弱点が残ることがあります。
- 完全性(改ざん検出)の扱い
- 暗号化だけでは「内容が改ざんされていないこと」を保証できないことがあります。
- そのため、認証(改ざん検出)をどう確保しているかが、二重暗号の実用上の核心になります。
- 入出力の仕様
- 2段目に渡す中間結果のフォーマット(長さ、エンコーディング、付加情報)が仕様として明確かどうか。
- 仕様が曖昧だと、復号不能や誤復号、実装差による相互運用性の問題が起きます。
制限:二重化で「何が増え、何が増えないか」
二重暗号の最大の誤解は、「2回やれば安全性が単純に上がる」という直感が、必ずしも正しくない点です。一般に、次の制限・例外が現実的な論点になります。
- 安全性は“鍵の独立性”と“適切な設定”に依存する 2回目の鍵が実質的に推測しやすい、あるいは1回目と強く結び付いていると、二重化しても効果が限定されます。
