ヒル暗号
線形代数の上に築かれた古典的なポリグラフ暗号、ヒル暗号を暗号化・復号しましょう。文字はブロックにまとめられ、数のベクトルに変換され、26 を法としてキー行列と掛け合わされます: 暗号化は C = K·P、復号は P = K⁻¹·C です。2×2 または 3×3 のキーを選び、リアルタイムの行列・その行列式・そのモジュラー逆行列を眺めながら、ブロックごとの計算過程を追えます。すべての処理はブラウザ上で実行されます。
キー (文字)
キーは 4 文字 (A=0 … Z=25) で、行列を行ごとに埋めていきます。 2×2 のキーは文字をペア (ダイグラフ) 単位で暗号化します。
上にテキストを入力すると、結果がここに表示されます。
キー行列
文字の各ブロックはベクトル (A=0 … Z=25) になり、26 を法としてキー行列と掛け合わされます。キーは、その行列式が mod 26 で可逆なときにのみ機能します。
C = K · P (mod 26)
キー行列を埋めるために、ちょうど 4 文字 (A–Z) を入力してください。
ヒル暗号 の使い方
- 1
暗号化か復号か、そして行列のサイズを選ぶ
暗号化するなら暗号化を、復号するなら復号を選び、続いて 2×2 のキー (ペア単位の文字) か 3×3 のキー (3つ組単位の文字) を選びます。
- 2
キーを文字で入力する
行列を行ごとに埋める文字を入力します — 2×2 のキーには4文字、3×3 には9文字です。リアルタイムの行列が行列式を表示し、キーが mod 26 で可逆かどうかを教えてくれます。
- 3
テキストを入力または貼り付ける
メッセージを入力すると、入力すると同時に変換されます。計算過程パネルが、各ブロックをベクトルとして、行列の掛け算、そして結果のブロックを示します。
- 4
キー行列と逆行列を確認する
キー行列パネルを開くと、キー・その行列式・そして — キーが有効なときは — 復号に使われるモジュラー逆行列を見られます。
- 5
コピー・ダウンロード・共有する
結果をコピーしたり、テキストファイルとしてダウンロードしたり、あなたのテキスト・キー・サイズ・方向をそのまま整えてツールを開き直すリンクで共有したりできます。
ヒル暗号を理解する
ヒル暗号とは何ですか?
ヒル暗号は、アメリカの数学者 Lester S. Hill によって 1929 年に考案された古典的なポリグラフ換字式暗号です。1文字ずつ置き換えるのではなく、文字のブロック全体をひとまとめに暗号化します — ブロックを数のベクトルとして扱い、それを秘密のキー行列と、26 を法として掛け合わせるのです。これは一度に3つを超える記号を扱える初めての実用的な暗号であり、線形代数を暗号学の真ん中へと持ち込みました。
出力の各文字がそのブロック内のすべての入力文字に依存するため、ヒル暗号は、より単純な暗号を裏切る単一文字の頻度を隠します。2×2 のキーは文字をペアでかき混ぜ、3×3 のキーは3つ組でかき混ぜ、より大きな行列はさらに大きなブロックをかき混ぜます。この拡散は現代のブロック暗号の基礎にあるのと同じ考え方であり、それゆえヒル暗号は格好の教材になっています — もっとも、線形な暗号であるがゆえに、少しの既知平文があれば簡単に破られてしまいますが。
ヒル暗号の仕組み
まず、A=0、B=1、… Z=25 として文字を数に変換します。キーはそうした数からなる n×n の行列で、ここでは行列を行ごとに埋めていく文字の並びとして入力するため、2×2 のキーは4文字、3×3 のキーは9文字を必要とします。平文は n 文字のブロックに分割され、それぞれが列ベクトルとして書かれます。
ブロック P を暗号化するには、C = K · P (mod 26) を計算します: キー行列をベクトルに掛け、各要素を 26 を法として簡約し、その数を文字として読み戻します。復号するには、キー行列のモジュラー逆行列 K⁻¹ が必要で、P = K⁻¹ · C (mod 26) を計算します。逆行列は、行列式が 26 を法として可逆なとき — つまり 26 と共通因数を持たないとき — にのみ存在し、これがキーを選ぶ際の最も重要な唯一の規則です。
有効なキー行列を選ぶ
どんな行列でもヒル暗号のキーになれるわけではありません。復号が機能するには、キーの行列式を 26 を法として取ったものが、26 と互いに素でなければなりません。26 = 2 × 13 なので、行列式は奇数で、かつ 13 の倍数であってはなりません。許される値は、1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25 という12個の数です。行列式が偶数か 13 に等しい場合、モジュラー逆行列は存在せず、暗号文を一意に復号できません。
このツールはあなたの代わりに行列式を計算し、キーが可逆なときは緑のバッジを、そうでないときは赤のバッジを、復号に使う逆行列とともに表示します。キーが拒否されたら、1文字か2文字を変えて、行列式が有効な値に落ち着くまでその更新を眺めてください。このリアルタイムのフィードバックは、本来は手間のかかるヒルのキーを手で選ぶ作業を、素早く視覚的な演習へと変えてくれます。
2×2 の実例で見る
キー DDCF を取り上げましょう。これは 2×2 の行列を、上の行に 3, 3、下の行に 2, 5 という数で埋めます。その行列式は 3×5 − 3×2 = 9 であり、9 は 26 と互いに素なのでこのキーは有効です。では HELP を暗号化しましょう。最初のブロック HE はベクトル (7, 4) です: 掛け合わせると (3×7 + 3×4, 2×7 + 5×4) = (33, 34) となり、mod 26 で簡約すると (7, 8) = HI になります。
2番目のブロック LP は (11, 15) で、(3×11 + 3×15, 2×11 + 5×15) = (78, 97) = (0, 19) = AT を与えます。こうして HELP は HIAT に暗号化されます。復号するには、ツールがキーを (15, 17 / 20, 9) に反転させ、各暗号ブロックにそれを掛けて HELP を復元します。上でキーとして DDCF を入力すると、すべての手順がリアルタイムの計算過程パネルに現れるのを見られます。
3×3 の実例で見る
古典的な 3×3 の例はキー GYBNQKURP を使い、行列を1行目に 6, 24, 1、2行目に 13, 16, 10、3行目に 20, 17, 15 で埋めます。トリグラフ ACT — ベクトル (0, 2, 19) — を暗号化すると、簡約前は (67, 222, 319) となり、これが 26 を法として (15, 14, 7)、すなわち POH になります。
この行列の行列式は 26 を法として 25 であり、これは 26 と互いに素なので有効なキーであり、そのモジュラー逆行列は行列 (8, 5, 10 / 21, 8, 21 / 21, 12, 8) です。暗号ブロック POH にその逆行列を掛けると ACT が返ってきます。サイズ選択を 3×3 に切り替えて GYBNQKURP を入力すると、この教科書的な例を再現し、ツールが導く逆行列を確認できます。
埋め草・文字・書式
ヒル暗号は A–Z の26文字しか知らないため、スペース・数字・句読点は暗号化の前に取り除かれ、復号しても戻ってきません。メッセージは固定されたブロックで処理されるため、長さがブロックサイズの倍数でない平文は、最後のブロックを完成させるために文字 X で埋められます。したがって、復号されたメッセージは1文字か2文字の余分な文字で終わることがあります。
文字の大小は保たれません — すべてが大文字として扱われます。これらの制約はこのツールではなく古典的な暗号そのものに固有のものであり、ヒル暗号がその同時代の暗号と同様に、自由に流れる文章ではなく短い戦術的なメッセージに使われた理由の一部でもあります。リアルタイムの内訳は、あなたのテキストがどのようにブロックへとまとめられ、埋められるかを正確に示します。
安全性と暗号解読
ヒル暗号の強みは、同時に致命的な弱点でもあります: それが線形だということです。各暗号ブロックは平文ブロックの固定された線形関数なので、十分な数の平文・暗号文のブロックの組を手に入れた攻撃者は、線形方程式の系を立てて解き、キー行列を直接復元できます。n×n のキーに対しては、およそ n 個の既知ブロックがあれば普通は十分であり、これにより暗号は既知平文攻撃に素早く陥落します。
また、ブロック間の拡散も、線形なかき混ぜを超える撹乱も提供しないため、同一の平文ブロックは常に同一の暗号ブロックに暗号化されます。現代の基準では安全ではなく、本当の情報を守るのに決して使ってはいけません — 代わりに AES のような査読を経たアルゴリズムを頼ってください。とはいえ、行列・モジュラー算術・ブロック暗号化がどう組み合わさるかを明快に手を動かして示す例として、ヒル暗号は学ぶに値する最良の古典暗号の一つであり続けています。
よくある質問
ヒル暗号とは何ですか?
ヒル暗号はどう動きますか?
有効なヒル暗号のキーはどう選べばよいですか?
ヒル暗号の実例を見せてもらえますか?
ヒル暗号はどうやって復号しますか?
2×2 と 3×3 のヒル暗号の違いは何ですか?
なぜキーが可逆ではないと表示されるのですか?
スペース・数字・句読点はどうなりますか?
ヒル暗号は安全ですか?
ヒル暗号は誰が考案しましたか?
行列のモジュラー逆行列とは何ですか?
入力したテキストはサーバーに送信されますか?
関連ツール
こちらの便利なツールもどうぞ