PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。
CTF・セキュリティ学習

【Base・XOR・エンコーディング編】CTF頻出ウォームアップを瞬殺する|CTF思考フレームワーク #51

かも次郎とアンペンが「Base・XOR」を解説するマスコットイラスト
安全に生きたい編集部

こんにちは、アンペンです!

今回はCTF暗号カテゴリのウォームアップ定番、Base系エンコーディング・XOR・各種エンコを扱います。厳密には『暗号』ではなく『データ表現の変換』ですが、CTFでは最初に必ず通る関門です。

『これは暗号?それともただのエンコーディング?』を一瞬で見分けられるようになると、瞬殺できる問題が一気に増えます。

なぜ見分けが大事かというと、勘違いすると無駄な遠回りをするからです。ただのBase64を『難しい暗号だ』と思い込んで、頻度分析だ総当たりだと何時間も格闘する——これはCTF初心者あるある。逆に『あ、これはエンコーディングだ』と見抜ければ、ボタン一発で中身が出てきます。“戦う前に相手の正体を知る”、それだけで勝負はほぼ決まるんです。

Base64って『暗号化』なんでしょ?解読難しそう。

違うよ、Base64は『バイナリを文字に変換する規格』。暗号化じゃなくて、ただの『書き方の変換』。鍵もいらないし、誰でも復元できる。

Base64の文字列って、ランダムな英数字がズラッと並んでいて、いかにも『暗号です』という顔をしていますよね。でも——実はこれ、暗号でもなんでもありません。ただの“書き方の変換”、いわば翻訳です。この『暗号っぽいけど暗号じゃない』を一瞬で見抜けるかどうかが、CTFのウォームアップを瞬殺できるかの分かれ目。今日はその“見分けの目”を養いましょう。

まず結論

Base系・Hex・URL encode は『暗号』ではなく『バイナリ↔文字の変換規格』。鍵不要で誰でも復号できます。一方、XOR は鍵があれば暗号として使えますが、単一バイトXORは256通り総当たり繰り返しXORは既知平文攻撃で破られます。CTFでは『見た目で形式判別→CyberChefで一発復号』が定石。守る側は『機密保護にエンコーディングを使わない』が結論です。

この記事で分かること

  • Base64/32/16・Hex・URL encodeの見分け方
  • XOR単一バイト/繰り返しの破り方
  • CTFで使う定石ツール(CyberChef/xortool)
  • エンコーディングを暗号と勘違いしない
難易度:初級向け 所要時間:10分 体験:CyberChefで様々なエンコを試す おすすめ:#50の後

📖 はじめてのWebセキュリティ #51|Base・XOR・エンコーディング編
CTF頻出ウォームアップを瞬殺する手法を扱います。 シリーズ一覧を見る →

⚠️ 大事なお約束
他者の通信や保護されたデータを無断で復号・解読する行為は、業務上の権限や法律に違反します。CTFや公開された練習問題のみで確認してください。

エンコーディングは『暗号』ではない

Base64やHex、URL encodeは『バイナリデータを文字として安全に運ぶための規格』です。鍵は不要で、誰でも復元できるのがポイント。これを『暗号化した』と思い込むと、CTFで時間を無駄にします。

ここを誤解しないことが、本当に大切です。『鍵が要らない』ということは、つまり世界中の誰でも、ボタン一つで元に戻せるということ。鍵という“秘密”がどこにも無いので、隠す力はゼロなんです。Base64は『箱に入れて運びやすくした』だけで、『鍵をかけた』わけではない——この区別がついていないと、あとで痛い目を見ます。

図解:見た目で判別する5パターン

『この文字列は何エンコーディング?』を見た目で当てられると、復号が一瞬で進みます。使用文字の種類と末尾の特徴で判別します。

見分けのコツは、難しく考えず“使われている文字の種類”を見るだけ。末尾に = がぶら下がっていればBase64の可能性大。数字とA〜Fだけで、しかも長さが偶数ならHex。% が混じっていればURLエンコード。大文字と2〜7の数字だけならBase32。——こんなふうに、“文字のクセ”でほぼ当てられます。まずは末尾の = と、使われている文字の範囲。この2点を見るクセをつけましょう。

Base64・Base32・Hex・URL encode・HTML entity・Base58/85の6種類のエンコーディング形式の特徴と例を2x3グリッドで示した図解
図1:6種類のエンコーディングを使用文字と末尾の特徴で見分ける
🌐 たとえるなら、外国語への翻訳

『こんにちは』を『konnichiwa』と書くのがローマ字、それをe3 81 93 e3 82 93…とUTF-8の16進で書くのがHex。意味は何も変わらず、書き方だけが変わっただけです。Base64も同じで、バイナリの『書き方』を変えているだけ。秘密にしているわけではなく、ただ別の言語に翻訳しているだけです。

こんにちはがローマ字と16進UTF-8に変換されても意味は変わらないことを示すエンコーディングのたとえイラスト
図2:『こんにちは』も書き方を変えるだけ。Base64やHexは『翻訳』

ここで覚える用語:エンコーディング vs エンクリプション
エンコーディング(Encoding)はデータ形式の変換で、鍵不要・誰でも復元可能。Base64/Hex/URL encode 等がこれ。エンクリプション(Encryption)は機密保持のための変換で、鍵が必須。XOR・AES・RSA 等がこれ。同じ『変換』でも目的が全く違うので、CTFで暗号文を見たらまず『これはどっち?』を判断しましょう。

代表エンコーディングの見分け方

Base64 / Base32 / Hex / URL / HTML

  • Base64:A-Z, a-z, 0-9, +, / + 末尾の=(or ==)パディング
  • Base32:A-Z, 2-7 のみ(0/1なし)、長めの文字列
  • Hex(Base16):0-9, A-F のみ、長さが偶数
  • URL encode:%XX 形式が混じる
  • HTML entity:& A など
  • Base58:0/O/I/l を除外、Bitcoinアドレス等
  • Base85/Ascii85:<~ ~> で囲まれることが多い

『多重エンコーディング』(Base64でくるんでさらにHexで包む等)も頻出。CyberChefで自動マジックレシピが便利です。

『多重エンコーディング』は、玉ねぎの皮むきをイメージすると分かりやすいです。Base64で包んだものを、さらにHexで包んで…と何重にもくるんである状態。あわてず、外側の皮から一枚ずつ剥いていけば、最後に中身(フラグ)が出てきます。CyberChefの“Magic”レシピは、この皮むきを自動でやってくれる優れもの。迷ったら、まずMagicに放り込んでみるのが手っ取り早いですよ。

XORは『鍵があれば暗号』『弱い使い方なら一瞬で破れる』

XOR(排他的論理和)は『2回かけると元に戻る』性質があり、シンプルな暗号として使えます。ただし使い方が弱いと一瞬で破られるのがポイント。

XORの『2回かけると元に戻る』という性質、これが暗号として使える理由です。平文に鍵をXORすると暗号文になり、その暗号文に同じ鍵をもう一度XORすると、元の平文に戻る。鍵を知っている人だけが行き来できる、というわけです。仕組みはとてもシンプルなのですが——シンプルすぎるがゆえに、鍵の使い方が雑だと、あっという間に破られてしまうんです。

単一バイトXOR / 繰り返しXOR の破り方

  • 単一バイトXOR:鍵は1バイト(256通り)。総当たりで一瞬
  • 繰り返し鍵XOR:鍵長を推定(xortool)→各位置でシーザー的に総当たり
  • 既知平文攻撃:『FLAG{』など先頭が分かれば cipher ⊕ "FLAG{" = key先頭
  • ワンタイムパッド:鍵長=平文長で1回限り使うなら理論上破れない。ただし鍵使い回しは即死

CTFで『FLAG{』が手がかりになる『既知平文攻撃』は超頻出の手筋。覚えておきましょう。

『既知平文攻撃』という名前は仰々しいですが、原理は拍子抜けするほど単純です。XORは『暗号文 ⊕ 平文 = 鍵』という関係が成り立つので、平文の一部さえ分かれば、そこから鍵を逆算できてしまう。CTFのフラグは、たいてい『FLAG{』で始まりますよね。つまり“答えの最初の数文字”が、最初からバレている。この数文字を暗号文とXORするだけで、鍵の先頭が丸見えになる——だからこそ超頻出の手筋なんです。

暗号文と既知の平文FLAGをXORすると鍵が復元できるXOR既知平文攻撃の原理を示した図解
図3:暗号文⊕既知平文 = 鍵。FLAG{先頭から鍵が見える

CTFでやってみよう:ウォームアップ瞬殺練習

やってみよう / 自分の環境・CTFのみ

CyberChefで多重エンコ→XORを段階的に解く

目的は『見た目で形式を当てる→順に剥がす』を体感することです。

  1. FLAG{warm_up_xor} を単一バイトXOR(鍵: 0x42)で暗号化
  2. 結果をHex化し、それをBase64で包む(3重)
  3. CyberChefで『From Base64 → From Hex → XOR Brute Force』レシピを組む
  4. 0x42で元の文字列が現れることを確認
  5. 応用:FLAG{…}を繰り返し鍵XORで暗号化し、xortoolを使う
他者の暗号化データに対して同じ手順を試すのは絶対にやめてください。検証は公開練習問題かCTF配布のみで。

では、守る側の視点に移りましょう。ここまでで『エンコーディングは隠す力がゼロ』『弱いXORは一瞬で破れる』と分かりました。にもかかわらず、これらを“機密保護”に使ってしまう実装が、現実にはあとを絶ちません。

守る側:『エンコ ≠ 暗号』を徹底

機密保護に Base64 や XOR を使ってしまう実装ミスは、実は珍しくありません。設計レビューで叩き潰しましょう。

なぜこんなミスが起きるのか。理由は、Base64やXORの結果が“見た目は暗号っぽい”からです。ランダムな文字列を見ると、つい『これで安全になった』と錯覚してしまう。でも、見た目がいくら複雑でも、鍵が無ければ・弱ければ、保護にはなりません。『読めない=守られている』ではない——この思い込みを設計レビューで潰すのが、守る側の大事な仕事です。

設計時のチェックポイント
  • パスワード・APIキーをBase64で『保護した』と称している → NG
  • クライアントトークンをXOR単一バイトで処理 → NG
  • 難読化と暗号化の混同を設計レビューで指摘する
  • 機密保護にはAES-GCM / ChaCha20-Poly1305などのAEADを使う
  • 署名/MACが必要ならHMAC-SHA256等を併用
  • 独自にXOR系を組まない(IVや鍵管理で必ず事故る)

Base64で隠してる気になってるサービス、結構ありそう…

残念ながらある。だから『見たら最初にBase64を疑う』癖を付けると、いろんな脆弱性に気付けるよ。次回からは本格的にRSAの世界に入るよ。

ここまでをひと言でまとめると、『まずエンコか暗号かを見分け、エンコなら一発で剥がす』。Base系やHexは翻訳なので鍵いらずで戻せる。XORは鍵しだいですが、使い方が雑なら既知平文で即死します。“正体を見抜く目”さえ持てば、ウォームアップ帯はもう怖くありません。

まとめ:『見た目で判別→CyberChef一発』

今回のポイント
  • Base/Hex/URL は暗号ではなく変換(鍵不要)
  • XOR は単一バイト/鍵使い回しで即死
  • 『FLAG{』からの既知平文攻撃は超頻出
  • 守りはエンコを暗号と勘違いしない

今日の持ち帰りは『暗号っぽい見た目に騙されない』。攻める側は“まずBase64を疑う”だけで時短でき、守る側は“エンコを暗号と呼ばない”だけで事故を防げる。同じ知識が、攻守どちらでも効く——ここがエンコーディング編のおいしいところです。

次回はいよいよ本格的な公開鍵暗号、RSA基礎編。素因数分解・小さい指数・Common Modulusといった代表的な攻撃手法を見ていきましょう。

次に読みたい記事

参考資料

記事URLをコピーしました