S-Box(4bit,全単射)
0x0〜0xF の置換を入力(重複不可)。変更すると逆S-Boxは自動生成されます。
💡 全単射 = すべての入力が異なる出力に1対1対応(重複なし・欠落なし)
対応関係の可視化
P層(ビット置換,16bit)
ビット i(0..15)を P[i] 番目へ。全単射である必要があります。
対応関係の可視化
ラウンド設定
暗号化 / 復号
ステップ詳細
なだれ効果テスト(Avalanche Effect)
学習コンテンツ
SPN(Substitution-Permutation Network)は、現代ブロック暗号の基本構造の一つです。
- Substitution(置換): S-Boxによる非線形変換で、線形解読を困難にする
- Permutation(転置): P層によるビット拡散で、局所的な変化を全体に広げる
- 鍵加算: ラウンド鍵とのXORで秘密性を付与
これらを複数ラウンド繰り返すことで、強固な暗号化を実現します。AESもSPN構造を採用しています。
S-Box(Substitution Box)は、入力を非線形的に変換する lookup テーブルです。
なぜ非線形性が必要?
古典的なヒル暗号などの線形暗号は、行列演算のみで構成されるため、既知平文攻撃に弱いという致命的な欠陥があります。S-Boxは非線形変換を導入することでこの問題を解決します。
良いS-Boxの条件
- 全単射(bijection): すべての入力が異なる出力に対応(復号可能性)
- 差分耐性: 入力差から出力差を予測しにくい
- 線形耐性: 入出力間の線形関係が少ない
- SAC特性: 入力1ビット変化で出力の約半分が変化
P層(Permutation Layer)は、ビット位置を入れ替える線形変換です。
拡散(Diffusion)とは?
平文の1ビットの変化が、暗号文全体に影響を及ぼす性質を拡散と呼びます。S-Boxだけでは局所的な変換に留まるため、P層でビットをシャッフルして影響範囲を広げます。
設計のポイント
- 全単射性: すべてのビット位置が一意に対応(可逆性)
- 遠距離混合: 近いビット同士だけでなく、遠くのビットも混ぜる
- 高速性: ハードウェア実装で配線のみで実現可能
本ツールのデフォルトP層は、ニブル単位で列方向に並び替える設計です。
マスター鍵から各ラウンドで使うラウンド鍵を生成する仕組みが鍵スケジュールです。
本ツールの簡易実装
k = rotate_left(k, (round % 5) + 1) ⊕ RC[round]
- 回転: ビットを左シフトして拡散
- ラウンド定数(RC): 各ラウンドで異なる定数とXOR
実用暗号では
AESなどでは、S-Box適用やより複雑な変換を含む強固な鍵スケジュールが使われます。関連鍵攻撃への耐性が重要です。
なだれ効果(アバランシェ効果)は、入力の小さな変化(1ビット)が出力の大きな変化(約50%のビット)を引き起こす性質です。
測定方法
- ランダムな平文を暗号化 → 暗号文C1
- 平文の1ビットだけ反転させて暗号化 → 暗号文C2
- C1 ⊕ C2 のハミング距離を計測
- 多数回試行して平均を取る
理想値
16ビットブロックの場合、平均8ビット(50%)が反転するのが理想です。これより少ないと拡散が不十分、多すぎても偏りがあります。
本ツールでヒストグラムを確認し、分布が中央(8付近)に集中しているか観察してください。
古典暗号の時代
- シーザー暗号: 単純な文字シフト(線形)
- ヴィジュネル暗号: 多表式置換だが周期性あり
- ヒル暗号: 行列演算(線形代数攻撃に脆弱)
現代ブロック暗号
- DES(1977): Feistel構造、56ビット鍵(現在は脆弱)
- AES(2001): SPN構造、128/192/256ビット鍵(現在の標準)
- その他: Blowfish, Twofish, Serpentなど
SPNとFeistel構造が現代ブロック暗号の二大潮流です。
⚠️ 注意: このツールは教育用であり、実運用には使用できません。
主な制限
| 項目 | ToySPN Builder | AES(実用暗号) |
|---|---|---|
| ブロックサイズ | 16ビット | 128ビット |
| 鍵長 | 16ビット | 128/192/256ビット |
| ラウンド数 | 8(デフォルト) | 10/12/14ラウンド |
| S-Box設計 | 任意編集可能 | 数学的に最適化済み |
| 鍵スケジュール | 単純な回転+XOR | S-Box適用含む複雑な変換 |
学習目的での使い方
- S-Boxの全単射性を崩すと復号できなくなることを確認
- P層の設計を変えてなだれ効果がどう変化するか観察
- ラウンド数を減らすと拡散が不十分になることを体験
💡 各項目をクリックして詳細を展開してください。