ペネトレーションテスト&バグバウンティ
頻度解析で置換暗号を解読します。「Crypto」カテゴリの中でも「Substitution Cipher(置換暗号)」は、古典的でありながら奥深い問題が多く出題されるそうです。
ここでは、置換暗号の基本から攻略法や、Pythonによる頻度解析まで、分かりやすく解説します。
Substitution Cipherとは(サブスティテューション サイファー)
Substitution Cipher(置換暗号)とは、アルファベットを別の文字に一対一で置き換える暗号方式です。
たとえば
平文: A B C D E ...
暗号: Q W E R T ...
このように「A → Q」「B → W」…のような対応関係によって、文章が暗号化されます。
シーザー暗号との違いと難易度
よく似た暗号に「Caesar Cipher(シーザー暗号)」がありますが、違いは以下の通りです。
項目 |
Caesar Cipher |
Substitution Cipher |
仕組み |
一定の文字数ずらす |
ランダムな文字置換 |
通り数(パターン) |
26通り |
26!(約4×1026)通り |
攻略法 |
総当たり |
頻度解析+推測 |
つまり、シーザー暗号みたいに簡単ではないと言うことです。
Substitution Cipher(置換暗号)を解く方法
どうやって解くのか
英語には「よく使われる文字」があります。
英文字の頻出ランキング:E > T > A > O > I > N ...
暗号文の中で、一番多く出現する文字は「E」である可能性が高いという考え方を使うのが、頻度解析(Frequency Analysis)です。
CTFでの典型的な出題形式
暗号化されたテキスト:
"ZHOFRPH WR WKH ZRUOG RI FUBSWRJUDSKB"
英語に見えるけど意味不明ですね。でもよく見ると、何度も出てくる文字があるのです。
→ 頻度解析をして、出現回数の多い文字を「E」などに対応させて推測していきます。
攻略手順:暗号文の観察から推測へ
攻略のステップは次の通り。
1.暗号文を読み取る
2.各文字の出現回数を数える(Counter)
3.英語の文字頻度と比較
4.対応関係表(マッピング)を仮作成
5.読めそうな単語をもとに調整する
Pythonで頻度解析をしてみよう
1.ターミナルを開いてnanoエディターを立ち上げてファイルを作成します。
nano substitution_cipher.py
2.以下のPythonコードをコピー&ペーストします。
# Python標準ライブラリの'collections'モジュールから、'Counter'という便利なクラスを読み込みます。'Counter'は、文字や単語の出現回数を自動で数えてくれる命令です。
from collections import Counter
# 解読対象の暗号化された文字列です。
ciphertext = "ZHOFRPH WR WKH ZRUOG RI FUBSWRJUDSKB"
# 暗号文から「空白(スペース)」除いた文字列に対して、'Counter'を使って各文字の出現回数を数えます。
counter = Counter(ciphertext.replace(" ", ""))
# 出現回数が多い順に並べて表示します。
print("頻度順:", counter.most_common())
3.書き終えたら、以下の手順で保存してエディタを終了します。
Ctrl + O → Enter(保存)
Ctrl + X(終了)
4.ファイルを保存したら、次のように実行します。
python3 substitution_cipher.py
5.実行結果
実行結果から、たとえば「R」が一番多い。もしかして「E」かも。というように仮置換して推測します。
頻度順: [('R', 5), ('H', 3), ('W', 3), ('U', 3), ('Z', 2), ('O', 2), ('F', 2), ('K', 2), ('B', 2), ('S', 2), ('P', 1), ('G', 1), ('I', 1), ('J', 1), ('D', 1)]
手動マッピングのコツ
頻度解析のあとに必要なのは、人間の目での調整です。
・「WKH」は「THE」かも。
・「ZRUOG」は「WORLD」かなと考える「観察力&想像力」が必要になります。
応用問題(多層暗号や日本語の置換)
CTFでは、Substitution Cipherがさらに別の暗号と組み合わされることもあります。
Base64 + Substitution
平文 → Base64エンコード → 文字をランダムに置換 → 暗号文
Caesar + Substitution + Reverse
平文 → Caesar暗号(例:3文字ずらす)
→ 文字をさらにランダムに置換(Substitution)
→ 文字列を逆順にする(Reverse)
→ 暗号文
日本語(ひらがな)や記号の置換
「ひらがな一文字ずつを、別のひらがなに置き換える」暗号です。元の文字→置き換え文字
"あ"→"た"
"い"→"け"
"う"→"く"
"え"→"し"
"お"→"も" など
こういった場合でも、まずは1文字の対応を探るのが第一歩になります。
ハッカーは、CTFでSubstitution Cipher(置換暗号)の基本から攻略法を学ぶのまとめ
CTFで「読む力」と「観察力」を鍛えましょう。
Substitution Cipherは、英語を「読む力」と「観察力」で問われるパズルのような問題です。
最初は難しいですが、頻度とパターンを見つけて少しずつ仮説を立てていくと面白くなると思います。