開発 へ戻る
ヴィジュネル暗号 (Vigenère) encode / decode

ヴィジュネル暗号 (Vigenère) encode / decode

ポリアルファベット古典暗号「ヴィジュネル暗号」の encode / decode。鍵 (例: LEMON) を平文に重ねて文字シフトする 16 世紀発明の暗号。Mode 切替、大文字小文字保持・非アルファ素通しオプション、平文と鍵ストリームのアラインメント表示で学習にも最適。シーザー暗号より強い古典暗号として CTF や教育で定番。

使い方

**Mode** (平文 → 暗号文 / 暗号文 → 平文) を選び、入力欄に文字列と **鍵 (KEY)** を入れると、ヴィジュネル法で encode / decode します。例: 平文 **ATTACKATDAWN** + 鍵 **LEMON** → **LXFOPVEFRNHR**。鍵はアルファベットのみ使用 (英大小文字混在可、空白や記号は自動で除外)。**大文字小文字を保持** (デフォルト ON) で入力の case を維持。**アルファベット以外を素通し** (デフォルト ON) で空白・句読点・数字をそのまま出力。下の **アラインメント表** で平文・鍵ストリーム・暗号文を 1 文字ずつ縦に並べて表示するので、各位置でどの鍵文字が使われたかが一目でわかります (教育目的に最適)。

詳細解説

ヴィジュネル暗号ツールへの入力と情報の取り扱い

ヴィジュネル暗号ツールの入力は「平文」または「暗号文」のどちらかです。CTF (Capture The Flag) の問題を解くために使う場合は問題のチャレンジ文字列を、教育目的で使う場合は例文を入力することが多いため、機密情報が直接入ることは少ないです。ただし、テスト環境でのデータマスキングや、社内のレガシーシステムが使っていた古典暗号の再現・検証に使う場面では、内部コードや識別子が入力されることがあります。鍵 (KEY) フィールドに入れる文字列がシステムで実際に使われているパスフレーズである場合、その値も入力されることになります。

ヴィジュネル暗号自体は現代の暗号標準を満たさないため、本番システムのデータ保護には用いるべきではありません。ただし、教育・CTF・レガシー解析という用途では実際のデータが入力される可能性があり、それをオンラインツールに送ることにはリスクが伴います。

オンラインの古典暗号ツールが持つリスク

古典暗号ツールのオンラインサービスは、教育・CTF コミュニティの需要から多く存在します。これらのサービスの多くは SEO ページとして構築されており、入力フォームへの文字列をアナリティクスで記録する設計が一般的です。「平文 + 鍵」の組み合わせをオンラインツールに送信すると、その両方がサーバーのログに記録されます。CTF の問題文そのものは公開情報ですが、チーム内でのみ共有している鍵候補・解法途中のデコード中間値はそうではありません。

また、レガシーシステムのデータ検証のために実データを入力する場合は、システムで使われている識別子・コード体系がサーバーに届く可能性があります。古典暗号ツールという用途上、そのような入力に注意が向きにくいという点が問題です。

文字シフト演算のみによるブラウザ内処理の仕組み

ヴィジュネル暗号の計算式は C[i] = (P[i] + K[i mod len(K)]) mod 26(A=0 … Z=25)のみです。このツールは外部の暗号ライブラリを一切使わず、JavaScript の四則演算とモジュロ演算だけで実装しています。アルファベット文字の変換は charCodeAt() で ASCII コードを取得し、A(65)/a(97) のオフセットを引いて 0〜25 に正規化した上で計算します。非アルファベット文字の素通し処理は単純な正規表現テストで判別します。アラインメント表は各入力文字・鍵ストリーム文字・出力文字を対応させた配列から生成し、DOM に描画します。

Web Crypto API (crypto.subtle.encryptcrypto.getRandomValues) は一切使いません。純粋な算術演算のため、処理はすべて同期的にページのメモリ内で完結し、ネットワーク通信は発生しません。

CTF・暗号史学習・教育目的での活用と注意点

ヴィジュネル暗号の主な用途は CTF の古典暗号問題、暗号理論の授業での演習、暗号史の文脈でのデモンストレーションです。本ツールのアラインメント表は「各位置でどの鍵文字が使われたか」を視覚的に示すため、ヴィジュネル法の仕組みを理解する教育ツールとして特に有用です。鍵の繰り返し周期が目に見えるため、Kasiski 検査や Friedman 検査がどのように機能するかを説明する際の教材にもなります。

重要な注意点として、ヴィジュネル暗号は現代の暗号学的要件 (AES-256 や ChaCha20 が満たす IND-CPA / IND-CCA2 安全性・128 ビット以上の鍵強度) を一切満たしません。本ツールの FAQ に記載の通り、実際のデータ保護には絶対に使用しないでください。学習・検証・CTF 問題解答のためのツールとして位置づけてください。

ヴィジュネル方陣と「le chiffre indéchiffrable」の歴史

ヴィジュネル暗号は 1553 年にジョヴァン・バッティスタ・ベラーゾ (Giovan Battista Bellaso) が発明し、後にブレーズ・ド・ヴィジュネル (Blaise de Vigenère) の名前と混同されて定着したものです。中核の道具は ヴィジュネル方陣 (tabula recta) と呼ばれる 26×26 のアルファベット表で、各行は前の行を 1 文字ずつシフトしたものになっています。暗号化は「平文の文字を行、鍵文字を列として方陣を引く」操作で、これが C[i] = (P[i] + K[i mod len(K)]) mod 26 という代数表現と等価です。

ヴィジュネル暗号は 19 世紀まで「解読不可能な暗号」(le chiffre indéchiffrable) と呼ばれ、シーザー暗号の頻度分析耐性を継承した強さがあると考えられていました。しかし 1863 年に フリードリヒ・カシスキー (Friedrich Kasiski) が鍵長を推定する方法を発表し (Kasiski examination)、続いてアメリカの ウィリアム・フリードマン (William Friedman) が Index of Coincidence を用いた統計的アプローチ (Friedman test) を開発したことで、解読法が確立されました。本ツールのアラインメント表は、Kasiski 検査が利用する「同じ平文の繰り返しが同じ鍵位置で出会うと同じ暗号文の繰り返しになる」性質を可視化します。

古典暗号と現代暗号: 鍵空間・既知平文攻撃・OTP との関係

ヴィジュネル暗号の鍵空間は、鍵長 L のとき 26^L です。長さ 5 の鍵 (LEMON) なら 11,881,376 通りで、2025 年の家庭用 GPU で 1 秒以内に全鍵を試せる規模です。長さ 10 でも 1.4 × 10^14 通りで、専用ハードウェアなら数時間で全数探索が完了します。これに対し AES-128 の鍵空間は 2^128 ≒ 3.4 × 10^38 で、宇宙の寿命より長い時間が必要です。鍵長を増やせば総当たり耐性は上がりますが、Kasiski / Friedman の 統計的攻撃 は鍵長に対して計算量が線形でしか増えないため、長い鍵でも安全にはなりません。

ヴィジュネル暗号の唯一の安全な使い方は One-Time Pad (OTP、ワンタイムパッド) として運用することです。鍵が (1) 真の乱数、(2) 平文と同じ長さ、(3) 一度しか使われない、(4) 完全に秘匿、の 4 条件を満たすとき、シャノンが 1949 年に証明した 情報理論的安全性 が達成されます。第二次大戦中のソ連スパイ通信や、米ソ間のホットラインがこの方式を実際に使った歴史的事例です。現代の暗号 (AES-GCM、ChaCha20-Poly1305) は OTP の理論的安全性を放棄する代わりに、(a) 短い鍵で実用的な計算的安全性、(b) 認証付き暗号 (AEAD) によるメッセージ完全性保証、(c) 並列処理可能なブロック / ストリーム構造、を提供します。ヴィジュネルとこれらの違いを理解することが、古典暗号学習の最大の収穫です。同じ流れで単一アルファベット置換暗号 (シーザー暗号) の挙動と比較したい場合は caesar-cipher、CTF で連続して Base64 などのエンコードが重ねられている題材を解く場面では base64 が同じくブラウザ内で動くため、復号〜デコードまでを 1 セッションで追えます。

よくある質問

入力データはサーバーに送信されますか?
いいえ。すべてブラウザ内で完結します。文字シフト計算のみで、外部 API も使いません。
ヴィジュネル暗号の数式は?
**Encode**: `C[i] = (P[i] + K[i mod len(K)]) mod 26` (A=0, B=1, ..., Z=25)。**Decode**: `P[i] = (C[i] − K[i mod len(K)] + 26) mod 26`。鍵が平文より短い場合は鍵を繰り返し適用。例: 平文 ATTACKATDAWN、鍵 LEMON → LEMONLEMONLE と鍵を伸ばし、各位置で文字シフトを足します。
シーザー暗号との違いは?
**シーザー暗号** は全文字を同じ量シフト (例: A→D, B→E)。**ヴィジュネル暗号** は各位置で違うシフト量を使うので、頻度分析が効きにくく古典暗号としては強い。ただし鍵の長さがバレると Kasiski 検査や Friedman 検査で破られる (鍵長 = 数十文字でも現代暗号としては全く安全でない)。
鍵の長さはどれくらいがいいですか?
古典暗号として遊ぶなら **5〜10 文字** がほどよい (長すぎると Kasiski 検査で見破られにくいが、短すぎると周期が露見しやすい)。実用暗号としては **使わないでください** — 現代の暗号要件 (鍵長 128 bit 以上、IND-CPA / IND-CCA2 安全性) を全く満たしません。学習・CTF・暗号史の理解のためのツール。
アルファベット以外の文字はどう扱われますか?
**「アルファベット以外を素通し」 ON** (デフォルト): 空白・数字・記号・日本語などはそのまま出力されます (`Hello, World!` + key=`key` → `Rijvs, Uyvjn!`)。**OFF**: それらを完全に除去して、アルファベットだけ並べた暗号文に。CTF などでスペースが残ると鍵長推定の手がかりになる場合があるので、用途で使い分けてください。
鍵を空にするとどうなりますか?
鍵が空 (アルファベット以外を除外した結果として空) の場合、シフトが 0 になり入力をそのまま返します。「鍵を入力してください」と注意表示が出るので、有効な鍵を入れてください。
ヴィジュネル暗号の歴史的背景は?
**16 世紀** にイタリアの Giovan Battista Bellaso が考案、後にフランスの **Blaise de Vigenère** にちなんで命名 (本人の発明ではない)。長らく解読不能と思われ、フランス語で **'le chiffre indéchiffrable' (解読不能の暗号)** と呼ばれた。1863 年に Friedrich Kasiski が解読法を公開してから現代では古典暗号扱いに。

「送らない」を確かめるには

このツールは入力データを外部に送信しません。仕組み・監査手順・運営方針は以下で詳しく説明しています。

類似のツール

シーザー暗号 / ROT13

シーザー暗号 / ROT13

シーザー暗号 (Caesar cipher) のエンコード・デコードツール。Mode 切替で暗号化 / 復号を選び、シフト量 (1〜25) をスライダーまたは数値で指定します。ワンタップで ROT13 (シフト 13) を設定可能。アルファベット A-Z / a-z のみを回転させ、数字・記号・空白・日本語はそのまま保持します。復号モードでは、シフトが不明な暗号文を解読するための全 25 通りブルートフォース一覧も表示。すべてブラウザ内で処理され、入力はサーバーに送信されません。

開発エンコードデコード
Base64 エンコード / デコード — URL-safe 対応

Base64 エンコード / デコード — URL-safe 対応

テキストと Base64 文字列を相互変換します。エンコード時は URL-safe オプション付き、デコード時は URL-safe 形式 (- _、パディングなし) も自動受付。UTF-8 安全、ブラウザ内処理。

開発エンコードデコード
HTML エンティティ変換 — &/</> を安全に

HTML エンティティ変換 — &/</> を安全に

HTML の特殊文字 (< > & " ') を実体参照 (&amp;lt; など) に encode したり、&amp;amp; → &amp; のように decode したりします。Mode 切替で双方向、すべて非 ASCII 文字を 10 進数値参照に変換するオプション付き。ブログのコードサンプル貼り付け、XSS 対策のエスケープ確認、メール本文の HTML 化準備などに使えます。

開発エンコードデコード
URL エンコード / デコード — クエリ文字列を安全に

URL エンコード / デコード — クエリ文字列を安全に

テキストと %XX 形式の URL エンコード文字列を相互変換します。encodeURIComponent / encodeURI (decode 側も同様) を切替可能。UTF-8 ベースでブラウザ内処理。

開発URLエンコードデコード