2017/05/25

暗号化技術の歴史

鍵 キー 暗号 暗号化
2017 年 5 月 25 日 Marc Laliberte

ほとんどの技術がそうであるように、暗号化も単純なものから始まり、長年にわたって進化してきました。現代の暗号化では複雑な計算処理が使われますが、古い時代の暗号化技術は単純なものであり、解読するのも簡単でした。暗号化技術のそれぞれで強度は異なりますが、いずれの暗号化方法も、誰でも読める「平文」メッセージを許可されない個人が読めない方法でコード化するものであることに変わりありません。暗号化がどのように生まれ、進化してきたのかを知るために、代表的な暗号化技術をいくつかご紹介することにします。

換字式暗号

シーザー暗号

シーザー暗号(シーザーシフトとも呼ばれます)は、自分の秘密のメッセージをこの方法で暗号化することが多かった、ジュリアス・シーザーに由来します。最も単純な暗号化技術の 1 つであるシーザー暗号は、元の平文メッセージの各文字を決まった数だけシフトして別の文字に置き換える、換字式暗号と呼ばれるものです。

たとえば、シーザーシフト 7 を使用して秘密のメッセージを右にシフトして暗号化する場合を考えてみましょう。ここでは、右に 7 文字ずらした英字を印刷することで、換字表を作成します。


元の文字:ABCDEFGHIJKLMNOPQRSTUVWXYZ
シフト後:TUVWXYZABCDEFGHIJKLMNOPQRS

次に、平文メッセージから 1 文字ずつ取り出して、シフト後の英字の対応する文字に置き換えます。


平文 :THISISASECRETMESSAGEBURNAFTERREADING
暗号文:MABLBLTLXVKXMFXLLTZXUNKGTYMXKKXTWBGZ

暗号化されたメッセージを読み取り可能な平文メッセージに戻すには、受信側が正しい数のシフトを使って換字表を作り直し、そのシフトに従って、暗号化された各文字を元の文字に置き換える必要があります。

現代社会におけるシーザー暗号の例である ROT13 では、13 のローテーション(またはシフト)が使われます。英語の基本アルファベットは 26 文字であるため、逆転の換字式である ROT13 では、同じアルゴリズムでメッセージを暗号化し、解読できます。

ヴィジュネル暗号

ヴィジュネル暗号は、異なるシーザーシフトの並びで構成される方陣(表)と 1 つの鍵を使用して、方陣の複数行のメッセージを暗号化します。ヴィジュネル暗号は、メッセージ内の異なる文字に対して異なるシーザーシフトを使用するため、頻度分析を使用した暗号文の解読がはるかに困難です。

たとえば、メッセージを暗号化するには、最初に鍵として使用する単語またはフレーズを選び、平文メッセージの長さと同じになるまでそれを繰り返す必要があります。ここでは、「FIREWALL」という鍵を使用することにします。


平文:THISISASECRETMESSAGEBURNAFTERREADING
鍵 :FIREWALLFIREWALLFIREWALLFIREWALLFIRE

暗号文を生成するには、平文の文字をヴィジュネル方陣の列に、対応する鍵の文字を行に対応させます。たとえば、平文の最初の文字は「T」で、対応する鍵は「F」です。この場合、行「F」と列「T」から、暗号文の文字「Y」が導き出されます。このプロセスを、平文のすべての文字に対して、順番に繰り返します。


平文 :THISISASECRETMESSAGEBURNAFTERREADING
鍵 :FIREWALLFIREWALLFIREWALLFIREWALLFIRE
暗号文:YPZWESLDJKIIPMPDXIXIXUCYFNKINRPLIQEK

メッセージの各文字を解読するには、受信側も鍵の文字が指す行を選び、その行内にある暗号文の文字を探して、その列を調べます。たとえば、上記のメッセージの最後の文字を解読するには、方陣の行「E」に移動し、この行内の文字「K」を探し、その列「G」(すなわち、これが平文の文字)にたどり着きます。

プレイフェア暗号

プレイフェア暗号は、対字換字式暗号です。個々の文字を置き換えてメッセージを暗号化するのではなく、対で置き換えます。メッセージを暗号化する場合、プレイフェア暗号は、キーワードを使用して 5 × 5 の表を作成し、4 つのルールを適用しながら、その表を使用して対字(対の文字)を暗号化します。

プレイフェア暗号表を作成するには、キーワードを使用して、5 x 5 の表の上から下、左から右の順番で、スペースに充填していきます。表の充填時に、キーワードの重複する文字は省略します。さらに、26 文字のアルファベットを 25 文字分の表に収めるために、文字 I と J を同じスペースに入れます。表の残りのスペースには、アルファベットの残りの文字を順番に充填します。

たとえば、キーワードが「Picture Frame」であるとします。プレイフェア暗号表を作成するには、「Picture Frame」を 5 × 5 の表に記入しますが、繰り返される文字は省略します。下記の表に示すように、「Frame」の「R」と「E」は、すでに表に記入されているため、スキップします。キーワードの記入後に、表の残りのスペースにアルファベットの残りの文字を充填します。「J」はこのキーワードの「I」とスペースを共有するため、表の残りの部分を充填する際にスキップします。

テーブルを生成できたら、平文メッセージを対字(2 文字のグループ)に分割することで、暗号化の準備をします。たとえば、秘密のメッセージ「Kill the spy」は「KI LL TH ES PY」になります。次に、対字を表にマッピングし、4 つの単純なルールに従って、メッセージを暗号化します。

  1. 対字の両方の文字が同じ場合は、最初の文字の後に X を追加して新しい対字に分割し、メッセージの暗号化を続ける
  2. 対字の両方の文字が表の同じ行に出現する場合は、右に 1 つシフトする(必要があれば行を折り返す)
  3. 対字の両方の文字が同じ列に出現する場合は、下に 1 つシフトしする(必要があれば行を折り返す)
  4. 対字の両方の文字が四角形の対角線上にある場合は、その四角形の(左右方向の)反対側にある文字に置き換える

このルールを理解するために、例を使って説明してみましょう。前に作成した表を使って「KI LL TH ES PY」というメッセージを暗号化するために、最初の対字である「KI」を取り出して、表にマッピングします。

文字「K」と「I」は四角形の対角線上にあるため、4 番目のルールが適用されます。そこで、「K」を同じ行の反対側の文字(この場合は「D」)に置き換えます。そして、「I」を「U」に置き換えます。

次の対字には、繰り返し文字「LL」が含まれています。そこで、1 番目のルールを適用し、最初の文字に「X」を追加することでこの対字を分割し、新しい対字「LX」とします。

文字「L」と「X」は四角形の対角線上にあるという条件にも該当するため、反対側の文字に置き換えて、対字「OV」とします。
前の対字を分割したので、「LT」が 3 番目の対字になりました。「L」と「T」は別の四角形の対角線上にあるため、暗号化された対字は 「QP」になります。

メッセージをさらに進むと、次の「HE」も表内の別の四角形の対角線上にあるため、暗号化された対字は「DA」になります。次の対字「SP」も四角形の対角線上にあるため、暗号化された対字は「LU」になります。

最後に、この例の秘密のメッセージが残り 1 文字になったため、「Y」に「X」を追加して「YX」という対字にします。この例の表では文字「Y」と「X」が同じ行に出現しているため、2 番目のルールが適用されます。

最終的な暗号化された対字を作るために、「Y」と「X」をそれぞれ右に 1 文字シフトして、「ZY」とします。これで、次のような暗号化されたメッセージが完成しました。


平文 :KILL THE SPY
対字 :KI LX LT HE SP YX
暗号文:DU OV QP DA LU ZY

メッセージを解読するには、受信者が、与えられたキーワードを使って同じ表を作成し、最後の 3 つのルールを逆に使って(右を左にする、下を上にするなど)暗号文を解読します。そして、すべての対字を解読したら、意味を持たない「X」を削除します。

転置式暗号

レールフェンス暗号

レールフェンス暗号は、平文の文字を置換するのではなく、並べ替えることでメッセージを暗号化する、単純な転置式暗号です。レールフェンス暗号は、架空のフェンスの内側の連続する「レール」(すなわち、行)に斜めに上下しながらメッセージを書いていくことで暗号化します。たとえば、「THIS IS A SECRET MESSAGE」という秘密のメッセージを 4 本のレールを使って暗号化すると、次のようになります。


T . . . . . A . . . . . T . . . . . G .
. H . . . S . S . . . E . M . . . A . E
. . I . I . . . E . R . . . E . S . . .
. . . S . . . . . C . . . . . S . . . .

次に、文字を左から右、上から下に読み取ることで、暗号文を作成します。この例のメッセージの場合、暗号文は次のようになります。

TATGHSSEMAEIIERESSCS

メッセージの解読で必要になるのは、メッセージの暗号化に使用された「レール」の数を知ることと、文字間隔を決定する単純な数式を解くことだけです。暗号文を解読するには、最初に「サイクル」のサイズ、すなわち、「フェンス」の 1 回の上下の全移動内の文字数を判断します。4 本の「レール」を使って作成された暗号文の場合、サイクルは 6 文字です。これ以外のレール数でサイクルサイズを計算するには、式 [サイズ] = ([レール数] × 2) – 2 を使用します。

サイクルサイズを計算したら、暗号文の文字数をサイクルサイズで除算することで、メッセージの暗号化に使用したサイクルの数を求めます。たとえば、この例の暗号文の長さである 20 文字をサイクルサイズ 6 で除算すると、3 つの完全サイクルと 2 文字の部分サイクルという結果が得られます。最後に、これらの情報を使って暗号文を「フェンス」に書き戻すことで、解読します。

この例では、完全サイクルが 3 つ、2 文字の部分サイクルが 1 つという結果が得られているため、フェンスの先頭行は暗号文の最初の 4 文字で構成されることになります(3 サイクル + 部分サイクルの先頭)。


T . . . . . A . . . . . T . . . . . G .

2 行目は、暗号文の次の 7 文字(2 x サイクルの数 + 部分サイクルの 2 番目の文字)を使用します。


T . . . . . A . . . . . T . . . . . G .
. H . . . S . S . . . E . M . . . A . E

3 行目は次の 6 文字 (2 x サイクルの数) を使用します。


T . . . . . A . . . . . T . . . . . G .
. H . . . S . S . . . E . M . . . A . E
. . I . I. . . . E R . . . E . S . . .

最後の行は、最後の 3 文字を 1 つの完全サイクルごとに 1 文字ずつ使用します。


T . . . . . A . . . . . T . . . . . G .
. H . . . S . S . . . E . M . . . A . E
. . I . I . . . E . R . . . E . S . . .
. . . S . . . . . C . . . . . S . . . .

最後に、「フェンス」に向かって上下しながらテキストパターンをたどることで、解読されたメッセージを読み取ることができます。

ルート暗号

次に、特定のパターンを鍵にしてメッセージを暗号化します。たとえば、「右下から始めて時計回りに進む」という鍵を使うと、次のような暗号文が完成します。


TIETSBARD
HSCMAUFRI
IAREGRTEN
SSESENEAG

次に、特定のパターンを鍵にしてメッセージを暗号化します。たとえば、「右下から始めて時計回りに進む」という鍵を使うと、次のような暗号文が完成します。


GAENESESSIHTIETSBARDINETRGERASCMAUFR

暗号文を解読するには、受信者が、使用されたパターンとグリッドのサイズを知る必要があります。それがわかれば、単純にそのパターンを逆にたどることで、そのサイズのグリッドを作成できます。

書籍暗号

書籍暗号は、映画や小説にもよく登場する暗号化方式です。書籍暗号では、秘密メッセージの送信側と受信側の両方が同じ書籍(通常は版も同じ)を持っている必要があります。送信側は、平文のメッセージの単語を両者が持っているその書籍の中に探し、その単語を指す座標に置き換えることで、秘密のメッセージを単語単位で暗号化します。たとえば、「Kill」という単語が書籍の 39 ページの 7 番目の段落の 12 個目の単語として見つかった場合、暗号文の座標は {39:7:12} になります。単語を解読するには、受信側が書籍の座標が指す位置にある単語を調べ、その単語を書き取ります。

メッセージに含まれる単号が書籍に載っていないこともあるため、単語単位ではなく、文字単位で送信者が暗号化することもあります。そのため、暗号文の座標は、書籍の個々の文字を指す場合と単語を指す場合があり、結果の平文の文字はその単語の最初の文字ということになります。

ワンタイムパッド

ワンタイムパッドは、総当り方式(鍵のあらゆる組み合わせを使って、元の平文メッセージを出力しようとする方法)では解読できない暗号化技術です。ワンタイムパッドを使用したメッセージの暗号化には、暗号化する平文メッセージ以上の長さの 1 回だけ使用する事前共有鍵が必要です。メッセージの送信側と受信側の両方がその鍵を知っておく必要がありますが、他人には知られないようにする必要があります。

同じ「パッド」が 2 度使用されない限り、暗号文の安全性は保証されます。ワンタイムパッドを使って暗号化されたメッセージの解読が困難なのは、異なる鍵を使用することで、暗号文が元の平文メッセージと同じ文字数のどのような平文メッセージにでも解読される可能性があるためです。厳密に言えば、同じ暗号文を解読した平文の候補が複数あったとしても、それを区別するための情報が暗号文には含まれていないのです。

ワンタイムパッドでメッセージを暗号化するには、モジュロ演算を使用する必要がありますが、これについては、例を使って説明するとわかりやすいでしょう。ここでは、「KILL THE SPY」という平文メッセージを暗号化してみましょう。最初に、使用するワンタイムパッドを選ぶ必要があり、古くは、膨大なページの帳面がワンタイムパッドとして使用されていました。送信側と受信側の両方が使用するページを事前に決めて、合意しておきます。この例では、以下のワンタイムパッドを使うことに合意したと仮定します。


HQWORJIHKSGSICOSFSSB
PCWCHGXYOUMWEOYYWUKY
LKVZVHSMRJPLGHXULJBT

次に、平文メッセージの各文字をパッドの最初の文字から順番に対にしていきます。モジュロ演算の計算を簡単にするために、各文字を数値に変換します(たとえば、「A」は 0、「B」は 1 というように)。次に、対応するメッセージと鍵の文字の数値を加算し、モジュロ演算(mod 26)を実行します。

モジュロ演算は一見すると複雑そうですが、実際はとても簡単です。最初に、2 つの数を通常の方法で加算します。結果の数が 26(この例の mod 値)以上の場合は、その数から 26 を減算します。結果の数は、暗号文の文字を数値にしたものです。

K I L L T H E S P Y message
10(K) 8(I) 11(L) 11(L) 19(T) 7(H) 4(E) 18(S) 15(P) 24(Y) message
+ 7(H) 16(Q) 22(W) 14(O) 17(R) 9(J) 8(I) 7(H) 10(K) 18(S) key
= 17 24 33 25 36 16 12 25 25 42 message + key
= 17(R) 24(Y) 7(H) 25(Z) 10(K) 16(Q) 12(M) 25(Z) 25(Z) 16(Q) (message + key) mod 26
R Y H Z K Q M Z Z Q ciphertext

上記の例では、「KILL THE SPY」という平文メッセージがワンタイムパッドを使用することで「RYHZKQMZZQ」になりました。

このメッセージを解読する場合も、逆になるだけで、プロセスは同じです。暗号文から鍵を減算し、結果が負の場合は 26 を加算します。


R Y H Z K Q M Z Z Q ciphertext
17(R) 24(Y) 7(H) 25(Z) 10(K) 16(Q) 12(M) 25(Z) 25(Z) 16(Q) ciphertext
- 7(H) 16(Q) 22(W) 14(O) 17(R) 9(J) 8(I) 7(H) 10(K) 18(S) key
= 10 8 -15 11 -7 7 4 18 15 -2 ciphertext - key
= 10(K) 8(I) 11(L) 11(L) 19(T) 7(H) 4(E) 18(S) 15(P) 24(Y) ciphertext - key (mod 26)
K I L L T H E S P Y message

DVXVJLEEOTPEMKGGWVHSOTAJLEXGOZWUAKJQLZRGWQUHOYEKXSMVVRGDUCSJJELKPS