ヴィジュネル暗号の解読|カシスキー・テスト入門
ヴィジュネル暗号の解読|カシスキー・テスト入門
ノートと蛍光ペンだけで暗号文の反復列を追っていると、ただの文字の森だったものが、距離の公約数を拾った瞬間に急に筋道を持ちはじめます。筆者にとってヴィジュネル暗号は、その「鍵長が見える瞬間」がいちばん面白い古典暗号です。
ノートと蛍光ペンだけで暗号文の反復列を追っていると、ただの文字の森だったものが、距離の公約数を拾った瞬間に急に筋道を持ちはじめます。
筆者にとってヴィジュネル暗号は、その「鍵長が見える瞬間」がいちばん面白い古典暗号です。
この記事は、ヴィジュネル暗号を直感と式の両方でつかみたい人、そしてカシスキー・テストを手で再現したい人に向けたものです。
A=0〜Z=25 と置いたときの C = (P + K) mod 26 を短く押さえつつ、反復列、間隔、公約数、鍵長候補、列分割、頻度分析へと進む解読の流れを一本につなげます。
ヴィジュネル暗号は単純なシーザー暗号をずらして重ねた多表式換字ですが、繰り返し鍵である限り、暗号文のどこかに周期の痕跡が残ります。
そこを足がかりにすれば、鍵そのものではなくまず鍵の長さから崩せますし、短文や非反復鍵ではその足場が消えること、Friedman テストや IOC をどう併用するかまで一貫して見通せます。
ヴィジュネル暗号は何を改良した暗号なのか
単一換字式の弱点と頻度分析
ヴィジュネル暗号が改良しようとした相手は、ひとことで言えば シーザー暗号 のような単一換字式暗号です。
単一換字式では、平文の各文字が暗号文でいつも同じ文字に置き換わります。
固定3シフトなら、A は常に D、B は常に E という具合です。
仕組みは明快ですが、その明快さがそのまま弱点になります。
多表式換字という転換
そこで出てくるのが、多表式換字という発想です。
これは一枚の置換表だけで全文を処理するのではなく、複数の置換表を鍵に応じて切り替える方法です。
ヴィジュネル暗号はその代表例で、各文字を「毎回同じシーザー暗号」でずらすのではなく、鍵文字ごとに異なるシフト量を使います。
A=0 から Z=25 で数えると、暗号化は C = (P + K) mod 26 です。
平文文字 P に、鍵文字 K の値を足して、26文字で循環させるわけです。
このとき効いてくるのは、同じ平文文字が毎回同じ暗号文字にならない点です。
たとえば平文中に同じ A が並んでいても、鍵が L、E、M、O、N と切り替われば、暗号文では別々の文字に散っていきます。
単一換字式では一か所に集まっていた頻度が、複数の表に分散される。
ヴィジュネル方陣として知られる 26×26 の表は、その切り替えを目で追える形にしたものです。
各行が1文字ずつ循環シフトしているので、どの鍵文字でどの変換を使うかが一望できます。
ノートで比べた二通りの手書き暗号化でも、この差ははっきり出ました。
固定3シフトでは同じ平文文字の痕跡が暗号文の中にまとまって残るのに対して、鍵で周期的に切り替えたほうでは、よく出る文字が一文字に偏らず、ばらけて現れます。
もちろん、これで頻度分析そのものが消えるわけではありません。
けれど「全文をひとつの頻度表で眺めるだけでは崩れない」段階まで、難易度が一段上がる。
この転換こそが、ヴィジュネル暗号の改良点です。
もっとも、改良には別の足跡も残ります。
短い鍵を繰り返すなら、その周期が暗号文に染み込みます。
だから後の時代には、反復列の間隔から鍵長を探るカシスキー・テストが成立しました。
ヴィジュネル暗号は単純な単一換字式を押し広げた一歩ですが、同時に「鍵を繰り返す」という新しい弱点も持ち込んだわけです。
Bellaso 起源と19世紀の誤帰属
歴史の系譜を見ると、この暗号は突然現れたものではありません。
多表式換字の先駆けとしてまず挙がるのが、15世紀中頃に活動した Leon Battista Alberti です(刊行年については文献によって差異があり、よく「約1467年」とされます)。
彼のDe Cifrisでは多表式の考え方と暗号円盤が示され、単一の置換表だけに頼らない方向を切り開きました。
続いて Johannes Trithemius の Polygraphia は刊行年が1518年で、tabula recta を広めました。
発案時期については一部に1508年頃とする記述も見られますが、刊行年は1518年であることを明記しておきます。
この流れの中で、今日ヴィジュネル暗号と呼ばれている方式に最も近い具体的な記述を残したのは Giovan Battista Bellaso です。
Bellaso は1553年に鍵語を用いる方式を記述しました。
Blaise de Vigenère が1586年に類似の考えを示したため、19世紀にかけて命名や帰属が混線した経緯がある点に注意してください。
ヴィジュネル暗号の仕組み
直感でつかむ仕組み
ヴィジュネル暗号を直感で見るなら、
この表の見方はシンプルです。
鍵文字がどの行を使うかを決め、平文文字がどの列を使うかを決めます。
その交点にある文字が暗号文になります。
たとえば鍵が L なら、L の行を使って平文文字を読み替える、という感覚です。
平文の A は L に、T は X に変わる、といった具合に、鍵文字ごとに「その文字ぶんだけ横にずらしたアルファベット」を当てるわけです。
筆者がこの仕組みをいちばん腑に落とせたのは、方眼ノートにヴィジュネル方陣の一部を手で書いたときでした。
26×26 を全部きっちり埋めなくても、上の数行と左の数列を並べるだけで、鍵が行を選ぶ感覚が見えてきます。
そこに平文ATTACKATDAWNを縦に置き、横に鍵LEMONを繰り返してLEMONLEMONLEと合わせていくと、暗号化は表の中を視線でたどる作業になります。
L の行で A を拾うと L、E の行で T を拾うと X、M の行で T を拾うと F になる。
手でなぞっていくと、LXFOPVEFRNHRという教科書的な例が、単なる丸暗記ではなく「行を切り替えながら読む表操作」だと実感できます(この例は教育用の標準例として広く用いられており、最初に誰が用いたかという一次出典は特定しにくい点に注意してください)。
この方法の肝は、同じ平文文字でも、同じ暗号文字に固定されないことです。
A が出てきても、鍵が L の位置では L になり、鍵が E の位置では E になり、鍵が N の位置では N になります。
単一の置換ではなく、鍵に応じて複数の置換表を回しているので、多表式換字と呼ばれます。
数式で表す
表で見える操作は、数式にするともっとすっきりします。
アルファベットを a=0〜z=25 と数値化し、平文文字を P、鍵文字を K、暗号文文字を C と置きます。
すると暗号化は次の式です。
C = (P + K) mod 26
(注)本文で示すATTACKATDAWN / LEMON → LXFOPVEFRNHRの例は教科書的な例示として広く用いられているもので、最初に誰が用いたかを示す一次出典は特定しにくい点に注意してください。
復号は逆向きなので、鍵の値を引きます。
P = (C - K) mod 26
ここで mod 26 は、26 文字のアルファベットを一周したら先頭に戻る、という意味です。
たとえば z の次が a に戻る感覚を、そのまま計算にしたものです。
ATTACKATDAWNをLEMONで暗号化する例に当てはめると、この式の動きがよく見えます。
最初の文字は A と L なので、A=0、L=11 です。
したがって C = (0 + 11) mod 26 = 11 となり、11 番目の文字 L になります。
2 文字目は T=19、E=4 なので C = (19 + 4) mod 26 = 23、つまり X です。
3 文字目は T=19、M=12 なので 31 になりますが、26 を一周して 5 に戻るので F になります。
復号も同じく、引き算に置き換えるだけです。
暗号文の X=23 から鍵の E=4 を引くと、P = (23 - 4) mod 26 = 19 で T に戻ります。
ここで数式の形を覚えておくと、ヴィジュネル方陣は「見やすい表現」、mod 26 の式は「計算しやすい表現」だと整理できます。
見た目は違っても、中でやっていることは同じです。
💡 Tip
ヴィジュネル方陣で交点を読む操作は、数式では「平文に鍵を足して 26 で折り返す」と言い換えられます。表と式を往復できると、手作業でもプログラムでも迷いません。
ヴィジュネル方陣と鍵の繰り返し
ヴィジュネル暗号で見逃せないのが、繰り返し鍵です。
鍵語が平文より短いとき、鍵は平文の長さに届くまで繰り返されます。
LEMONは 5 文字なので、ATTACKATDAWNの 12 文字に合わせるとLEMONLEMONLEになります。
12 文字目まで並べると、11 文字目と 12 文字目では、鍵がまた 1 文字目、2 文字目に戻っています。
この「戻る」という性質が、鍵長を周期として暗号文に刻みます。
5 文字鍵なら、1 文字目と 6 文字目と 11 文字目は同じ鍵文字で処理されます。
2 文字目と 7 文字目と 12 文字目も同じです。
図にすると、平文の上に鍵を並べたとき、同じ鍵文字が一定間隔で縦にそろうイメージです。
だからヴィジュネル暗号は、全文をひとつの暗号として見るより、鍵長ごとに列へ分けると構造が見えてきます。
この周期性は、暗号化の仕組みを理解する段階でも役に立ちます。
ヴィジュネル方陣の各行は 1 文字ずつ循環シフトしているので、L の行は 11 文字シフト、E の行は 4 文字シフト、M の行は 12 文字シフトに対応します。
LEMONを繰り返すということは、11、4、12、14、13 というシフト列を、5 文字ごとにもう一度流すのと同じです。
表で見れば「行の並びを周期的に使い回している」、式で見れば「K の値列を周期的に足している」と表現できます。
筆者はこの並べ方をノートで試したとき、平文と鍵を上下にそろえるだけで、暗号がぐっと立体的に見えました。
文字列を一列で眺めていると複雑に見えるのに、5 文字周期で区切ると、どこで同じ鍵文字が再登場するかがはっきりします。
ヴィジュネル暗号の面白さは、表面では文字が散って見えるのに、下では鍵の周期がきっちり反復しているところにあります。
その二重構造が、暗号化の仕組みそのものであり、後の解読でも鍵長推定の手がかりになります。
暗号化と復号を具体例でたどる
例1:暗号化
ここでは、平文ATTACKATDAWNを鍵LEMONで暗号化して、暗号文LXFOPVEFRNHRになる流れを手で追います。
文字の対応を頭の中だけで回すと、どこで鍵が1周したのか見失いがちです。
筆者は紙に書くとき、平文の上に鍵を書き、そのさらに上に薄く区切り線を引いて 5 文字ごとの周期が目に入るようにしています。
LEMONの並びが1文字でも横にズレると、その先の計算が芋づる式にずれてしまうので、この下準備だけで検算の手間がぐっと減ります。
まずは平文と鍵をそろえます。
鍵長は 5 なので、12 文字の平文に合わせると鍵は LEMONLEMONLE になります。
11 文字目と 12 文字目で、鍵が 1 文字目の L、2 文字目の E に戻っているのが見て取れます。
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 平文 P | A | T | T | A | C | K | A | T | D | A | W | N |
| 鍵 K | L | E | M | O | N | L | E | M | O | N | L | E |
| 鍵の周期位置 | 1 | 2 | 3 | 4 | 5 | 1 | 2 | 3 | 4 | 5 | 1 | 2 |
| 暗号文 C | L | X | F | O | P | V | E | F | R | N | H | R |
数式では C = (P + K)mod 26 を使います。A=0、B=1、…、Z=25 で数えると、各文字の変換は次のようになります。
| 位置 | P | P値 | K | K値 | 計算 | C値 | C |
|---|---|---|---|---|---|---|---|
| 1 | A | 0 | L | 11 | (0 + 11) mod 26 = 11 | 11 | L |
| 2 | T | 19 | E | 4 | (19 + 4) mod 26 = 23 | 23 | X |
| 3 | T | 19 | M | 12 | (19 + 12) mod 26 = 31 mod 26 = 5 | 5 | F |
| 4 | A | 0 | O | 14 | (0 + 14) mod 26 = 14 | 14 | O |
| 5 | C | 2 | N | 13 | (2 + 13) mod 26 = 15 | 15 | P |
| 6 | K | 10 | L | 11 | (10 + 11) mod 26 = 21 | 21 | V |
| 7 | A | 0 | E | 4 | (0 + 4) mod 26 = 4 | 4 | E |
| 8 | T | 19 | M | 12 | (19 + 12) mod 26 = 31 mod 26 = 5 | 5 | F |
| 9 | D | 3 | O | 14 | (3 + 14) mod 26 = 17 | 17 | R |
| 10 | A | 0 | N | 13 | (0 + 13) mod 26 = 13 | 13 | N |
| 11 | W | 22 | L | 11 | (22 + 11) mod 26 = 33 mod 26 = 7 | 7 | H |
| 12 | N | 13 | E | 4 | (13 + 4) mod 26 = 17 | 17 | R |
3 文字目と 11 文字目が、手計算でつまずきやすい場所です。
31 や 33 が出たら、26 を引いてアルファベットの範囲に戻すだけです。
ここで慌てて暗算すると 31 を 4 と見間違えたり、33 を 8 と書いたりしがちなので、筆者は余白に「31→5」「33→7」と一度メモしてから文字へ戻しています。
紙の上では、このひと呼吸が効きます。
💡 Tip
手計算では、平文・鍵・暗号文を1行ずつ書くより、同じ位置の3文字を縦にそろえたほうがズレに気づけます。とくにLEMONの繰り返しは、5文字ごとに薄い補助線を入れると周期が目で追えます。
例1:復号と検算
今度は、できあがった暗号文LXFOPVEFRNHRから、同じ鍵LEMONで元の平文へ戻します。
復号の式は P = (C - K)mod 26 です。
足し算を引き算に戻しただけですが、負の数が出る場面があるので、そこだけ意識すると計算が安定します。
たとえば 1 文字目は C=L で 11、K=L で 11 です。
(11 - 11) mod 26 = 0 なので A に戻ります。
2 文字目は X=23、E=4 なので (23 - 4) mod 26 = 19 で T です。
3 文字目は F=5、M=12 なので、そのまま引くと -7 になりますが、mod 26 では 19 と同じ位置になり、T に戻ります。
ここで「負になったら 26 を足す」と覚えておくと、手が止まりません。
暗号化と復号を同じ表で並べておくと、検算が一気にできます。
| 位置 | C | C値 | K | K値 | 復号計算 P=(C-K) mod 26 | P値 | 復号結果 |
|---|---|---|---|---|---|---|---|
| 1 | L | 11 | L | 11 | (11 - 11) mod 26 = 0 | 0 | A |
| 2 | X | 23 | E | 4 | (23 - 4) mod 26 = 19 | 19 | T |
| 3 | F | 5 | M | 12 | (5 - 12) mod 26 = -7 mod 26 = 19 | 19 | T |
| 4 | O | 14 | O | 14 | (14 - 14) mod 26 = 0 | 0 | A |
| 5 | P | 15 | N | 13 | (15 - 13) mod 26 = 2 | 2 | C |
| 6 | V | 21 | L | 11 | (21 - 11) mod 26 = 10 | 10 | K |
| 7 | E | 4 | E | 4 | (4 - 4) mod 26 = 0 | 0 | A |
| 8 | F | 5 | M | 12 | (5 - 12) mod 26 = -7 mod 26 = 19 | 19 | T |
| 9 | R | 17 | O | 14 | (17 - 14) mod 26 = 3 | 3 | D |
| 10 | N | 13 | N | 13 | (13 - 13) mod 26 = 0 | 0 | A |
| 11 | H | 7 | L | 11 | (7 - 11) mod 26 = -4 mod 26 = 22 | 22 | W |
| 12 | R | 17 | E | 4 | (17 - 4) mod 26 = 13 | 13 | N |
復号結果を左からつなげると、ATTACKATDAWNにきれいに戻ります。
暗号化の表と見比べると、1 行ごとに往復しているのがわかります。
たとえば 11 文字目は、暗号化では W=22 に L=11 を足して 33、mod 26 で 7、つまり H になりました。
復号では H=7 から L=11 を引いて -4、mod 26 で 22、つまり W です。
同じ位置で往路と復路がぴたりと噛み合うので、計算ミスの発見にも向いています。
手元で確かめるときは、暗号化の結果だけを追うより、復号を並べたほうがズレを見つけやすいことがあります。
とくにLEMONを繰り返して書く場面では、6 文字目以降で 1 周目と 2 周目が混ざりやすいので、筆者は 1〜5、6〜10、11〜12 のまとまりで小さく区切って見ています。
12 文字の文に 5 文字鍵を当てると、11 文字目と 12 文字目で鍵が L、E に戻るので、その折り返しが見えているだけで検算の迷子になりません。
演習:あなたの手でやってみる
ここで一度、短い例を自分の手で回してみると、式と文字の対応がぐっと定着します。
平文をDOG、鍵をKEYとします。
鍵は平文と同じ長さなので、そのまま並べれば足ります。
| 位置 | 1 | 2 | 3 |
|---|---|---|---|
| 平文 P | D | O | G |
| 鍵 K | K | E | Y |
| 暗号文 C |
A=0〜Z=25 で数えると、D=3、O=14、G=6、K=10、E=4、Y=24 です。
暗号化は C = (P + K)mod 26、復号は P = (C - K)mod 26 で埋められます。
まず暗号化の穴埋めです。
| 位置 | P | P値 | K | K値 | 計算 | C値 | C |
|---|---|---|---|---|---|---|---|
| 1 | D | 3 | K | 10 | (3 + 10) mod 26 = ___ | ___ | ___ |
| 2 | O | 14 | E | 4 | (14 + 4) mod 26 = ___ | ___ | ___ |
| 3 | G | 6 | Y | 24 | (6 + 24) mod 26 = 30 mod 26 = ___ | ___ | ___ |
続いて、いま自分で作った暗号文を使って復号します。
| 位置 | C | C値 | K | K値 | 復号計算 | P値 | P |
|---|---|---|---|---|---|---|---|
| 1 | ___ | ___ | K | 10 | (___ - 10) mod 26 = ___ | ___ | ___ |
| 3 | ___ | ___ | Y | 24 | (___ - 24) mod 26 = ___ | ___ | ___ |
3 文字目は 6 + 24 で 30 になるので、26 を引いて 4 に戻す流れが見どころです。
復号ではその逆向きになります。
こういう短い例を 1 問だけでも紙でこなすと、ヴィジュネル暗号は「難しい表を丸暗記する技」ではなく、「文字を数に直して足し引きし、26 で折り返す遊び」だと手に残ります。
カシスキー・テストとは何か
反復列と“間隔”の意味
カシスキー・テストは、暗号文の中から3文字以上の反復列を探すところから始まります。
2文字だけだと偶然の一致が紛れ込みやすいので、目安としては 3 文字以上を見る、という発想です。
暗号文を上からなぞりながら、同じ並びがもう一度出てきたら、その開始位置どうしの間隔を取ります。
筆者が紙でやるときは、暗号文の中にTHEのような並びが二度見えた瞬間、まずその3文字を丸で囲みます。
そして左右の余白に「ここからここまでで何文字離れているか」を小さく書き込みます。
文字そのものを読むというより、反復と距離を拾っていく感覚です。
最初はただの英字の列でも、丸がいくつか増えて余白に間隔が並びはじめると、鍵の周期が輪郭を持ってきます。
なぜこの間隔が手がかりになるのか。
ヴィジュネル暗号では、短い鍵語を繰り返して暗号化するので、同じ鍵文字が一定間隔で再登場します。
もし平文の同じ語や同じ断片が、鍵の同じ位置、つまり同位相で暗号化されたなら、暗号文でも同じ列として現れやすくなります。
ここでいう同位相とは、鍵周期の中で同じ場所に乗っている状態です。
たとえば鍵周期が 5 なら、位置 1 と 6 と 11 は同じ鍵文字で処理されます。
平文の同じ3文字列が、開始位置の差 10 のところで二度現れたとします。
10 は 5 の倍数なので、両者は鍵の並びに対して同じ位置関係を保ったまま暗号化されます。
その結果、暗号文でも同じ3文字列として再出現しやすい、というわけです。
反対に、開始位置の差が鍵周期と噛み合わなければ、同じ平文断片でも別の鍵文字列が当たるので、同じ暗号文にはなりにくくなります。
もちろん、暗号文に見つかった反復列がすべて意味のある一致とは限りません。
偶然の一致も混ざります。
ただ、複数の反復列を拾っていくと、偶然のものはばらけ、本当に鍵周期に引っ張られているものは似た倍数に集まってきます。
カシスキー・テストは、その「ばらつきの中に残る周期性」を読む方法です。
公約数と鍵周期の関係
反復列の間隔がいくつか手に入ったら、次に見るのが公約数です。
ここがカシスキー・テストの核心です。
間隔そのものが鍵長とぴたり一致することもありますが、実際には鍵長の倍数になって現れることがよくあります。
そこで、複数の間隔に共通して割り切れる数を探します。
たとえば、ある暗号文で反復列どうしの間隔が 9、63、180 だったとします。
この3つに共通する公約数には 3 と 9 があります。
このとき、鍵周期は 3 か 9 のどちらかである可能性が見えてきます。
あるいは 72、66、36、30 という間隔が並んだなら、最大公約数は 6 ですから、鍵周期 6 が有力候補として浮かびます。
こうして最大公約数、または目立って繰り返し現れる公約数を、鍵長候補として扱います。
理屈を言い換えるとこうです。
同じ反復列が暗号文に現れたということは、その2か所で鍵の並びもそろっていた可能性が高い。
鍵の並びがそろうのは、位置の差が鍵周期で割り切れるときです。
だから間隔を集めていくと、その背後にある鍵周期の約数が何度も顔を出します。
間隔の列を直接読むというより、間隔の内側に隠れている「何文字ごとに鍵が一周するか」を公約数から逆算しているわけです。
ここでひとつ面白いのは、最大公約数がそのまま正解とは限らない点です。
たとえば実際の鍵周期が 5 なら、反復列の位置差が 10 や 15 や 20 になることがあります。
この場合、観測されるのは 5 そのものではなく 5 の倍数です。
それでも 10 や 15 の公約数を見ると 5 が浮かび上がります。
鍵長 5 の語を繰り返している暗号で、同じ断片の開始位置の差が 10 なら、鍵の並びはちょうど2周ぶん進んで元の位相に戻っています。
こういう「ずれているようで、周期の上では同じ場所に戻っている」感覚がつかめると、カシスキー・テストはぐっと腹落ちします。
この段階では、候補がひとつに絞れないことも珍しくありません。
3、6、9 のようにいくつも見える場合もあります。
そのときは、どの数で暗号文を列に分けると各列が単表式換字としてまとまって見えるかを後段で確かめます。
カシスキー・テストは「鍵周期を断定する魔法」ではなく、鍵周期との関係が濃い数を、公約数からあぶり出す方法だと捉えると筋道が通ります。
バベッジとカシスキーの物語
この方法はフリードリヒ・カシスキーの名で知られていますが、歴史をたどると先行して同様の原理に到達していた人物がいます。
チャールズ・バベッジは19世紀半ばにヴィジュネル系暗号の周期性を利用して鍵長を推定する発想へ到達していたとされますが、当時は広く公表されず、研究ノートなどで伝わる程度でした。
一方、プロイセンの軍人で暗号研究者でもあったフリードリヒ・カシスキーは1863年にこの手法を公表し、反復列の間隔から鍵長候補を絞る道筋を明確に示しました。
暗号史では、発見と公表が別の人物にまたがる例がしばしば見られます。
この歴史には、ヴィジュネル暗号の評価が変わっていく流れも重なっています。
かつては「解けない暗号」と呼ばれた方式でも、鍵が繰り返されるかぎり、そこには周期が生まれます。
周期があるなら、反復列と間隔が痕跡を残します。
カシスキー・テストは、その痕跡を拾うための古典的で鮮やかな道具です。
数字の操作としては地味でも、暗号文の表面に浮いた小さな反復から、見えない鍵周期を逆にたどっていくところに、この方法ならではの面白さがあります。
カシスキー・テストの実践手順
カシスキー・テストを手で進めるときは、反復列を拾って終わりではなく、その間隔を数に落としてから、公約数の偏りを見るところまでをひとつの流れとして追います。
暗号文の表面に現れた反復を、鍵周期の痕跡へ変換する作業だと考えると筋道が見えます。
歴史的にはチャールズ・バベッジが19世紀半ばに同様の原理に到達していたと指摘されますが、当時は広く公表されず研究ノート等に留まっていました。
一方で、フリードリヒ・カシスキーは1863年にこの手法を公表して広く知られるようになりました。
- 見つかった反復列ごとに、出現位置を並べます。たとえば同じ3文字列が文中の複数箇所に現れていたら、その開始位置をメモします。ここでは「どの反復列が何文字目に出たか」を崩さず残すことが欠かせません。
- 出現位置どうしの差を取り、位置差(距離)を出します。この距離が、鍵周期の倍数になっている可能性があります。鍵が繰り返される暗号では、同じ鍵文字列が再び重なる場所で同じ暗号断片が現れやすいからです。
- 距離ごとに約数を書き出し、複数の距離に共通する公約数を調べます。ここが山場です。筆者はこの段階で、距離を紙にずらっと並べて、割れる数のところに印を付けていきます。そうすると、ある数だけ何度も印が付いて、「6がやたら出る」と急に見えてくる瞬間があります。暗号文の文字列を眺めていた時間より、ここで数字の並びが意味を持ち始める感覚のほうが、むしろ鮮烈です。
- 頻出する公約数を候補鍵長にします。最大公約数がそのまま有力候補になることもありますが、必ずしもひとつに決まりません。鍵周期そのものだけでなく、その約数や倍数が混ざって見えることがあるためです。そこで 3 や 6 や 9 のように候補をいくつか残し、次の段階で確かめます。
この流れの背後にある理屈は単純です。
反復列どうしの距離が鍵周期で割り切れれば、両者は鍵の並びに対して同じ位相に戻ります。
だから間隔を集めると、鍵周期そのもの、またはその倍数が繰り返し現れます。
カシスキー・テストは、その距離の中から鍵周期との関係が濃い数を拾い上げる作業です。
反復距離の例と公約数の見方
数字だけ見ると無機質ですが、表にして眺めると候補鍵長の輪郭が一気に出ます。代表的な例を並べると、反復距離と公約数の関係がつかみやすくなります。
| 例 | 反復距離 | 見えてくる公約数 | 読み方 |
|---|---|---|---|
| MTU 例 | 72, 66, 36, 30 | 6 | 最大公約数が 6 なので、鍵周期 6 が濃い |
| Wikipedia 例 | 9, 63, 180 | 3, 9 | 3 と 9 が候補。どちらが鍵長かは次段で判定 |
72、66、36、30 という並びは見た目にはばらばらでも、全部が 6 で割れます。
このとき鍵周期 6 が浮かぶのは、各距離が 6 の倍数だからです。
もし鍵が 6 文字で循環しているなら、6文字ごとに同じ鍵位置へ戻るので、反復列が同じ暗号形で再登場しやすくなります。
9、63、180 の例では、3 と 9 の両方が候補に残ります。
ここで「公約数が多いほど正解」と短絡せず、鍵周期との関係をもう一段考えます。
9 の倍数でそろっているなら鍵長 9 の可能性が見えますし、同時に 3 でも割れてしまうので、鍵長 3 の暗号でも説明できる余地が残るからです。
こういう場面では、カシスキー・テスト単独で断定するのではなく、次の列分割でどちらが自然かを見ます。
鍵長 5 の例で考えても同じです。
開始位置の差が 10 なら、10 は 5 の倍数ですから、鍵はちょうど2周して同じ位相に戻っています。
観測できるのは 10 でも、背後にある鍵周期は 5 です。
距離そのものを読むのではなく、距離に埋まった周期を公約数から逆算するという感覚がここで効いてきます。
n列に分けて各列を頻度分析
候補鍵長が出たら、暗号文をその長さ n で区切って縦に並べ、n列 に分けます。
鍵長が正しければ、同じ列には同じ鍵文字で暗号化された文字だけが集まります。
すると各列は、実質的にひとつのシーザー暗号として扱えます。
ヴィジュネル暗号をそのまま解くのではなく、列ごとに分解して単純化するわけです。
たとえば候補が 6 なら、1文字目・7文字目・13文字目……を第1列、2文字目・8文字目・14文字目……を第2列という具合に並べます。
鍵長 9 が候補なら 9 列で同じことをします。
ここで正しい鍵周期を選べていれば、各列には共通のシフトがかかった文字群が集まるので、frequency analysis が効きます。
頻度分析では、各列の文字頻度が英語の典型的な分布、たとえば E, T, A, O などの並びに近づくかを見ます。
もちろん列が短いと揺れますが、正しい列分割では「この列だけ E が妙に多い」「こちらは T に寄っている」といった偏りが出ます。
筆者はこの段階で、列ごとの文字を数えているうちに、ある列だけ E が頭ひとつ抜けてくるのを見ると、紙の上で暗号が急にほどけ始める感覚になります。
さっきまで公約数の候補だった数字が、ここで具体的な鍵文字に変わるからです。
各列について、どのシフト量で平文らしい頻度になるかを試せば、その列に対応する鍵文字が決まります。
A=0 から Z=25 の 26 文字を使う標準的なヴィジュネルでは、各列ごとに 26 通りのシフトを検討できます。
n 列すべてでシフト量が決まれば、鍵全体が復元でき、復号へ進めます。
ここでの見どころは、カシスキー・テストが単独で完結しない点です。
反復列、間隔、公約数の段階で見えたのは、あくまで鍵長候補です。
その候補を n 列に分割し、各列を独立したシーザー暗号として読んだときに、英語らしい頻度傾向が最も素直に立ち上がるものが、本命の鍵周期です。
数字の手掛かりと文字の手触りが、この段階でひとつにつながります。
カシスキー・テストの限界と Friedman テスト
短文・偶然一致の罠
カシスキー・テストは鮮やかな手法ですが、反復列が見つかることを前提にしています。
ここでいう反復列は、ふつう 3文字以上 を探します。
2文字だと偶然の一致が多すぎて、距離を測っても意味のある 公約数 が立ちにくいからです。
3文字以上になると偶然の一致は減りますが、それでも短い暗号文では話が別です。
そもそも反復そのものが出てこないことがあり、出てきても一組だけでは統計が痩せています。
なぜ間隔から鍵長候補が見えるのかは、鍵が循環する場面を思い浮かべると腑に落ちます。
反復した平文片が、鍵の同じ位相で再び現れれば、暗号文でも同じ文字列として現れやすくなります。
そのとき二つの反復列の 間隔 は、鍵周期の 倍数 になりやすい。
だから複数の間隔を集めていくと、そこに共通して現れる 公約数 が鍵周期、あるいはその有力候補として浮かびます。
前の節で見たように、観測される数字が 10 でも、背後にある周期が 5 という読み方になるのはこのためです。
ただし短文では、この理屈がそのまま数字に育たないことがあります。
たまたま同じ3文字が並んだだけで、鍵周期と無関係な間隔が出ることもあるからです。
距離がひとつかふたつしか拾えないと、倍数なのか偶然なのかの見分けがつきません。
筆者もCTFの短い暗号文で、反復をいくら探しても手掛かりらしい3文字列が取れず、紙の上では解析が進まず数時間手詰まりになったことがあります。
あのときはカシスキーだけに固執すると前へ進めないと割り切って、後述する IOC を併用しました。
そこで「鍵長は 3 か 5 のどちらかだろう」と見当がつき、列分割を試した途端に景色が変わりました。
カシスキーは強い武器ですが、短文では単独決着を期待しすぎないほうが実戦的です。
非反復鍵とランニングキー
カシスキー・テストが効くのは、短い鍵語が何度も繰り返されるからです。
つまり、暗号文の離れた位置どうしでも、同じ鍵位置に戻る場面が何度も起こります。
この「周期に戻る」という性質が、反復列の間隔と鍵周期を結びつけています。
逆に言えば、鍵がほとんど繰り返されない方式では、この足場が消えます。
代表例が running key のような非反復鍵です。
長い文章や長い鍵列をそのまま使い、鍵を循環させないなら、ある位置と別の位置が同じ鍵位相になる保証がありません。
すると、平文側に同じ語が二度現れても、暗号文では同じ3文字列として再登場しにくくなります。
間隔を集めても、鍵周期の倍数という規則がそもそも立たないので、カシスキーは効きにくいか、事実上無効になります。
この違いは、ヴィジュネル暗号と running key 系を分ける核心でもあります。
どちらも多表式換字ですが、前者は「短い鍵を回す」方式、後者は「長い鍵を流す」方式です。
前者には周期があり、後者には周期が見えません。
ワンタイムパッド系の発想に近づくほど、この周期性は消えていきます。
カシスキー・テストがヴィジュネルでは教科書どおりに働くのに、非反復鍵では沈黙するのはそのためです。
IOC / Friedman test の活用
反復列が弱いときに頼りになるのが、Index of Coincidence です。
直感的には、「その文字列がランダムな 26 文字の並びより、どれだけ自然言語の偏りを残しているか」を見る指標です。
理想的に 26 文字が均等に分布するランダムな文字列では基準値は 約 0.038466(= 1/26) です。
英語文は E や T など特定の文字が出やすいため、この値より高くなります。
ここで鍵長候補を 3、4、5…と仮定して暗号文を列に分けると、正しい鍵長に近い分割では、各列が「同じ鍵文字で暗号化された文字群」になります。
すると列ごとの分布は、ランダム文より英語文の偏りに近づき、IOC が持ち上がります。
逆に誤った鍵長で分けると、複数の鍵位置が混ざるので、列の中身はランダム寄りに崩れます。
カシスキーが 反復列の間隔 を見るのに対して、IOC は 列ごとの偏り を見ているわけです。
見ている角度が違うので、両者を重ねると候補が締まります。
Friedman testは、この IOC を鍵長推定に使う系統の考え方です。
Kappa testと呼ばれることもあり、暗号文全体や列の一致度から、どのくらいの周期が潜んでいそうかを概念的に見積もります。
ここで覚えておきたいのは、フリードマン法がカシスキーの代用品ではなく、補助輪としてよく働くという位置づけです。
反復列が豊富ならカシスキーで有力候補が出ますし、短文で反復が乏しければ IOC 側の手掛かりが前に出ます。
筆者が実際に手を動かすときも、流れはだいたい同じです。
まず 3文字以上の反復列を拾って、間隔とその公約数から鍵周期候補を出します。
候補が 3 と 9 に割れたり、そもそも反復が少なかったりしたら、IOC で列分割の自然さを見ます。
それで 3 か 5 かのような絞り込みができたら、各列をシーザー暗号として頻度分析に回す。
この順番にすると、「反復から見えた周期」と「文字分布から見えた周期」が互いを補強し合うので、当てずっぽうの試行錯誤が減ります。
ℹ️ Note
カシスキーは「同じ形が離れて再登場する理由」を追う方法で、Friedman 系は「正しく分けた列だけ自然言語の癖が戻る」という事実を使う方法です。片方が沈黙しても、もう片方が手掛かりを残す場面があります。
歴史的にも、この流れは面白いところです。
鍵長推定の発見はチャールズ・バベッジが19世紀半ばに先行してつかんでいたとされ、公開された形で名を残したのが 1863年 のフリードリヒ・カシスキーでした。
いま「カシスキー・テスト」と呼ばれているものの背後には、公開された業績と先行発見のずれがあり、暗号史らしい少し複雑なドラマがあります。
そこへ統計的な見方として Friedman 系が重なり、ヴィジュネル解読は「反復を見る目」と「偏りを見る目」の二本立てになりました。
近縁方式(Beaufort等)との比較
ヴィジュネル系の近縁方式としては、Beaufort暗号が比較対象に向いています。
基本演算はヴィジュネルの「平文 + 鍵」とは逆向きで、「鍵 − 平文」で暗号化します。
この方式の面白いところは、暗号化と復号が同一手順になる点です。
計算の向きは違っても、短い鍵を繰り返す多表式換字であることは共通しているので、鍵周期があるならカシスキーや IOC の発想はやはり生きます。
Variant Beaufortは、標準ヴィジュネルの復号側と対応関係を持つ方式として理解すると整理しやすくなります。
学習の順番としては、まずヴィジュネルで「周期がある多表式換字」の骨格をつかみ、そのあとで Beaufort 系を見ると、式が変わっても鍵周期の有無が解読可能性を左右することが見えてきます。
一方で、running key やワンタイムパッド系はここで立ち位置が変わります。
ヴィジュネルや Beaufort は、方式の違いはあっても「短い鍵が循環する」ので、間隔、倍数、公約数という読み方が成立します。
非反復鍵ではこの前提が崩れるため、近縁に見えても、解読の入口は別物になります。
見た目が同じ多表式でも、周期があるかないかで、カシスキーが効く世界と効かない世界にきっぱり分かれるのです。
ヴィジュネル暗号が残したもの
“解読不能”神話の終焉
ヴィジュネル暗号が暗号史に残した最大の足跡は、「単純な頻度分析では崩れない」という成功体験を広く示したことと、その神話がやがて周期という弱点から崩されたことです。
多表式換字は、ひとつの文字が常に同じ暗号文字へ写る単表式暗号より一段先に進んでいました。
だからこそ長いあいだ“解読不能”という看板を背負えたのですが、その看板は永遠ではありませんでした。
転機になったのは、暗号文の中に同じ並びが繰り返し現れる理由を、偶然ではなく鍵の周期として読む視点です。
19世紀半ばにはチャールズ・バベッジがその筋道をつかみ、公表された形では 1863年 のフリードリヒ・カシスキーが名を残しました。
ここで起きたのは、力まかせの総当たりではなく、暗号文に残る規則性を統計と観察で切り崩す発想の登場でした。
反復列の間隔、公約数、列ごとの文字分布という手掛かりがそろうと、ヴィジュネル暗号は魔法の箱ではなく、分析できる構造物として見えてきます。
筆者が初めてこの流れを手で追ったとき、いちばん印象に残ったのは、鍵長が見えた瞬間に景色が変わる感覚でした。
それまではただの文字の塊だった暗号文が、周期ごとに縦へ切り分けた途端、「これはシーザー暗号が何本も束になっているだけだ」と読めるようになるのです。
各列が別々のシフトを受けた文字列に見えてくるあの瞬間は、古典暗号を学ぶうえで最初の大きな成功体験だと思います。
ヴィジュネル暗号の歴史的意義は、その“見え方の反転”を暗号学にもたらした点にもあります。
多表式から現代暗号への橋渡し
ヴィジュネル暗号は、古典暗号史の中では終着点ではなく、むしろ中継点として眺めると輪郭がはっきりします。
レオン・バッティスタ・アルベルティが多表式換字の発想を先駆的に記述し、ヨハネス・トリテミウスが tabula recta を体系化し、その流れの上にベラッソやブレーズ・ド・ヴィジュネルの名で知られる方式が並びました。
そこで得られた教訓は明快で、単純な置換は統計で破られるなら、置換を複数に増やせばよいということでした。
ただし、複雑にしただけでは十分ではありません。
短い鍵を繰り返す以上、そこには規則が残ります。
すると解読側もまた、頻度分析を一段深くし、周期推定や一致指数のような手法を持ち込みます。
この往復運動が、その後の機械式暗号へつながっていきます。
ローターを回して置換を変化させる発想も、見方を変えれば「多表式をもっと動的にしたい」という延長線上にあります。
さらに現代暗号では、鍵空間、乱数、計算量という別の軸が前面に出ますが、「規則が残れば統計や構造解析の糸口になる」という教訓そのものは連続しています。
暗号史を一本の線でたどるなら、ヴィジュネル暗号は「人力で扱える複雑さ」と「統計で破られる限界」が同時に見える地点です。
だから教材としても優秀です。
紙とペンで追える大きさの問題の中に、設計者が複雑化へ向かう理由と、解読者がその複雑さを分解していく論理の両方が入っています。
CTF や入門講座で今も繰り返し使われるのは、仕組みを学んだ直後に、その仕組みがどこから崩れるかまで一往復で体験できるからです。
ℹ️ Note
ヴィジュネル暗号は「強くする工夫」と「破るための観察」が真正面からぶつかる教材です。作る側の論理と解く側の論理が、同じ紙の上で出会います。
ここでヴェルナム暗号(ヴェルナム暗号)やワンタイムパッドに軽く触れると、ヴィジュネル暗号の立ち位置がいっそう見えます。
両者とも多表式の仲間に見えますが、決定的な違いは鍵が繰り返されるかどうかです。
ヴィジュネル暗号は短い鍵語を循環させるので、暗号文の内部に周期が刻まれます。
だからこそカシスキー検査や IOC が入口になります。
対してヴェルナム暗号がワンタイムパッドの条件、つまり非反復で平文と同じ長さの鍵を使い、その鍵が真性乱数である場合、そこに周期は残りません。
学習用として見たときの魅力はここにあります。
たとえば短文と短い鍵の組み合わせでは、周期が表に出やすく、解読の糸口も目で追えます。
しかも、解き方を覚えたあとで同じ暗号文を見返すと、最初はただの記号列だったものが「鍵位置ごとに性格の違う列」に見えてきます。
この視点の切り替えは、古典暗号だけで終わりません。
現代暗号を学ぶときにも、「安全性は見た目の複雑さではなく、どんな規則が漏れているかで決まる」という感覚の土台になります。
ヴィジュネル暗号が今も教室やパズル、CTF の現場で生き続ける理由は、まさにそこにあります。
まとめと次の一手
この記事の要点
ヴィジュネル暗号は、C = (P + K) mod 26 という素朴な式で動きますが、解読ではその「繰り返し」が逆に足跡になります。
反復列を見つけ、出現間隔を拾い、公約数から鍵長候補を絞り、暗号文を列に分けて頻度を見ると、霧の中に道が見えてきます。
筆者は紙で追うとき、見つけた反復列に同じ色で印を付け、間隔を書き込んだら別色で約数を囲みます。
このひと手間だけで見落としが減り、最初の鍵長推定がぐっと安定します。
手を動かすミニ課題
短い英単語を鍵にして、自分で一つ暗号文を作ってみてください。
次に、その暗号文から反復列を探し、間隔と公約数をメモし、出てきた鍵長候補ごとに列へ分割して頻度分析を試します。
候補が並んで決め切れないときは、IOCを補助線として重ねると、どの周期がいちばん自然か見えてきます。
ツール活用と学びの広げ方
検算用にはdCodeのヴィジュネルツールが便利です(検証・練習用のオンラインツール:
サイエンスライター。暗号と映画・文学・パズル文化の接点を探るコラムを得意とし、暗号を「解く楽しさ」から伝えます。
関連記事
換字式暗号と転置式暗号の違い|仕組み・例・解読
紙とペンを手にCATと書き、その場で二通りいじってみると、古典暗号の景色が一気に開けます。文字そのものを別の文字に替えれば換字になり、同じ三文字のまま並びだけを入れ替えれば転置になる――同じ平文でも、前者ではFDWのように姿が変わり、後者ではTCAのように位置だけが動きます。
ピッグペン暗号とは?フリーメイソンの記号暗号の仕組み
ピッグペン暗号は、図形記号を使う単一換字式暗号です。筆者も最初は紙に二つの3×3格子と二つのX字を書き、HELLOを一文字ずつ記号に置き換えてみましたが、読めない形が並んでいるのに自分だけは意味を知っている、その妙な手応えが強く残りました。
スキュタレー暗号とは?仕組み・歴史と弱点
古代スパルタで使われたと伝えられるスキュタレーは、棒に細長い帯を巻いて文字を書き、ほどくと読めなくなる道具であり、そのまま方式名としても語られる古典暗号です。文字を別の文字に置き換えるのではなく、順序だけを入れ替える転置式暗号で、鍵になるのは送受信者が同じ直径の棒、
エニグマ暗号機の仕組み|構造・暗号化・解読を図解
映画で見た光るランプの列を思い出しながら、筆者が紙の上で追ってみると、エニグマの1文字は右から左へ進み、反射して、また左から右へ戻る小さな旅をしています。その往復のあいだに、キーボード、プラグボード、ローター、リフレクター、ランプがどう噛み合うのかまで見えてくると、この機械は「複雑な箱」ではなく、