シーザー/ヴィジュネル暗号を頻度で破る
文字頻度ヒストグラムが自然な英語頻度に重なる所で平文が浮かぶ。鍵をずらすと即再計算 c = (p + k) mod 26
真鍵 7
シフト 0
鍵長 3
列 0
適合度 χ²(小さいほど英語的)
—
この列の正解シフト
—
一致指数 IC
—
判定
—
シフト円盤(外=平文 内=暗号)— 内輪をドラッグで回転
カシスキー:繰り返し間隔の約数
文字頻度ヒストグラム(棒=暗号 線=英語の自然頻度)
暗号文(解析対象)
復号結果(鍵が合うほど英語が読める)
シーザー暗号は全文字を同じ数
ヴィジュネル暗号は鍵を複数文字にして列ごとに違うシフトを使うため一見壊れにくいですが、 カシスキー法で繰り返しの間隔から鍵長を見抜き、同じ列の文字だけ集めれば それぞれが単なるシーザー暗号に戻り、列ごとに頻度で破れます。
剰余演算は
k だけずらすだけ(c = (p + k) mod 26)。
ずらしても文字の出現頻度の「形」は変わらず横に回るだけなので、
暗号文の頻度ヒストグラムが英語の自然頻度(E が最頻 …)にピタリ重なるシフトを探せば鍵がわかります。ヴィジュネル暗号は鍵を複数文字にして列ごとに違うシフトを使うため一見壊れにくいですが、 カシスキー法で繰り返しの間隔から鍵長を見抜き、同じ列の文字だけ集めれば それぞれが単なるシーザー暗号に戻り、列ごとに頻度で破れます。
剰余演算は
BigInt で正確に計算しています。スライダーを動かすと χ²(英語頻度とのズレ)が即再計算されます。
いま何が起きている?
ここがポイント
- シフトは頻度の形を回すだけ ── ヒストグラムを横にずらして英語頻度に重ねた所が鍵。
- χ² が最小=最も英語らしい ── 鍵全部(26通り)を試して χ² が谷になるシフトを選ぶだけで自動で割れる。
- カシスキー法で鍵長を見抜く ── 繰り返し列の間隔の公約数(頻出する約数)が鍵長の候補。鍵長で列を分けると各列はシーザー暗号。
- 一致指数 IC ── 英語の素文は約 0.067、ランダムは約 0.038。列分割が正しいと IC が英語側に戻る(=鍵長が当たった証拠)。