複雑な換字式暗号

シーザーのような単純な換字式暗号は、歴史的に見ても(コンピュータがないような大昔でも)早い段階で解読されていました。そこで、より解読しにくい複雑な暗号が登場しました。

ヴィジュネル暗号

ヴィジュネル暗号 (opens in a new tab) は「多表式暗号」と呼ばれるものです。原理上はシーザーと同じように文字をシフトする(ずらす)暗号なのですが、そのシフト手順が複雑になります。ツールは後ほど紹介しますので、最初はその原理を具体的に見てみましょう。

以下の平文を暗号化したいとします。

PROJECTCOLD

まず「鍵」となる文字列を用意します。これはアルファベットであれば何でもよいのですが、ここを伏せないと暗号として成立しないため、謎解きではこの鍵を特定する必要があるかもしれません。今回は DAIYON を鍵としましょう。そして、鍵の文字列を、平文と同じ長さになるだけ繰り返します。最後は途切れて構いません。

PROJECTCOLD
DAIYONDAIYO

ここで登場するのが ヴィジュネル方陣 です。大きな表が出てきて困惑したかもしれませんが、単にアルファベットが1個ずつズレて配置されているだけです。

では、これを使って暗号化をしてみましょう。1文字ずつ変換していきます。

平文の1文字目にあるPという文字を暗号化するとき、鍵の1文字目にあるDを使います。ヴィジュネル方陣で見てみると、Dの行Pの列 に書いてある文字に変換します。Sですね。
続いて、2文字目のR(平文)をA(鍵)を使って変換するのでRになります。3文字目のO(平文)はI(鍵)を使って W...と繰り返していきます。これがヴィジュネル暗号です。

PROJECTCOLD(平文)
DAIYONDAIYO(鍵)
SRWHSPWCWJR(暗号文)

復号(解読)する場合も、この逆の作業を行うため、ヴィジュネル方陣を使います。
まずは鍵の1文字目の行(D)から、暗号文の1文字目(S)を探します。すると、それはPの列にあるので、Pが平文です。これを全文字に対して繰り返します。

もちろん、このような作業を人力で行うのは面倒なので、実際には Dencode (opens in a new tab) のようなツールを使うことになります。ただし、ROT13などと異なり、鍵(キー)が存在することは忘れないでください。キーを入力せずに解読を試みると失敗します。

応用: 数式やプログラムでの表現

(このセクションは数式が苦手な方は読まなくても大丈夫です。)

プログラムを組む場合などは、「表で1文字ずつ探す」という概念がちょっと面倒になりますよね。また、数値計算のほうが得意だという方もいるでしょう。せっかくなので、ヴィジュネル暗号を数式で表現してみましょう。

まず、アルファベットの順番を0から始める数字として扱います(A = 0, B = 1 ... Z = 25)。PiP_i を平文の ii 文字目、KiK_i を鍵の ii 文字目、CiC_i を暗号文の ii 文字目としたとき、暗号文を得る手順は以下のように表現できます。

Ci=(Pi+Ki)mod26C_i = (P_i + K_i) \mathrm{mod} 26

また、復号化は以下のように表現できます。

Pi=(CiKi)mod26P_i = (C_i - K_i) \mathrm{mod} 26

応用:鍵の推測と突破

ここまで示したように、ヴィジュネル暗号は鍵が不明な場合に復号できないのですが、鍵を推測して暗号を破る手法(カシスキー・テスト)があります。

鍵の推測において、最も厄介な部分は周期がわからないということです(ヴィジュネル暗号には鍵の文字数に制限がありません)。逆に、鍵の文字数さえわかってしまえば、周期に着目することで鍵を特定できます。ただし、これは平文がある程度長く、鍵の単語が短い場合のみに使えるもので、鍵が長い場合などは鍵を得る必要があります。

Vigenère Solver (opens in a new tab) など、カシスキー・テストのアルゴリズムを用いてヴィジュネル暗号を鍵なしで解読するツールが存在します。前述の通り、平文や鍵の文字列によって使用可否が変わるため 必ず解読できるわけではありません が、ヴィジュネル暗号らしき文字列を見かけた場合、1回は試してみてもよいでしょう。