シーザー暗号
シーザー暗号(シーザーあんごう、Caesar cipher)は暗号理論上、もっともシンプルで、広く知られた暗号のひとつである。カエサル式暗号、シフト暗号とも呼ばれる。
シーザー暗号は単一換字式暗号の一種であり、平文の各文字を辞書順で3文字分シフトして(ずらして)暗号文とする暗号である。古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が使用したことから、この名称がついた。
文字のシフト数は固定であるが、3に限る必要はない。たとえば左に3文字分シフトさせる場合、「D」は「A」に置き換わり、同様に「E」は「B」に置換される。
シーザー暗号はヴィジュネル暗号などの部品として使用されることがあるほか、現代でもシフト数を13にした方式としてROT13が使用されることがある。シーザー暗号は他の単一換字式暗号と同様、容易に解読されるので、今日においては有効ではない。
きわめて単純な暗号であるが、現代の暗号においても重要な、規則(アルゴリズム)および鍵という2つの要素が既に含まれている。
規則 :特定の文字を、それよりも辞書順に特定の数だけ後ろ(または前)にある文字と置き換える。
鍵 :辞書順にずらす文字数。カエサルが実際に用いたシーザー暗号の場合、鍵は3である。
スエトニウスによれば、カエサルは秘密を必要とする場合、各文字をシフトして暗号を作成したといわれた。この手法を用いたのはカエサルが初めて戦の時に使用したと記録されているが、他の換字式暗号はより古い時期から使用されていたことが知られている。
カエサルの甥である アウグストゥスもまた同様に暗号を使っていたが、彼の使用していた暗号化は右に1つシフトするものであり、またアルファベットの始めにローテーションしないものであった。
カエサルはより複雑な暗号を使用していた可能性があり、 アウルス・ゲッリウスは、カエサルの暗号についての、現在は失われた論文について言及している。
シーザー暗号が使用されていた当時、どの程度効果的であったかは不明である。しかし、少なからず合理的な秘匿方法ではあっただろう。なぜなら、カエサルの敵対者の多くは文盲であったであろうし、そうでなかったとしてもそれは未知の言語で記されていたであろうからだ。この単純な換字式暗号に対する解読方法について、使用当時の記録はない。現存する中でもっとも古い記録は、9世紀のアラブ世界における、キンディによる頻度分析の発見である。
ユダヤ教では、メズーザーの裏に神の名を記す際に、1つシフトしたシーザー暗号を用いる。これは、メズーザーを使っていなかった時代から続けられていると思われる。暗号化された名前は宗教的に意味深い「神の名」を示し、それはオーソドックスなユダヤ教において、悪の力を退けるものとされる。
19世紀には、新聞の個人広告欄がシンプルな暗号によるメッセージのやりとりにしばしば使われた。デビッド・カーンは、タイムズ紙上で恋人同士が行った、シーザー暗号を使った秘密のやりとりについて言及している。また、1915年という比較的近年であっても、シーザー暗号は使われていた。当時のロシア陸軍は、兵士が習得するのに難しすぎるために、より複雑な暗号からシーザー暗号へと変更した。そのため、ドイツやオーストリアの暗号解読者は、暗号文をたやすく復号することができた。
デコーダーリングのように、2枚の回転盤を組み合わせる事で、シーザー暗号の暗号化や復号を行うことができる。今日では子供向けの玩具などに見ることができる。
ネットニュースなどでは、一見しただけで読めてほしくない、しかし読もうと思えば誰でも読める文章(パズルの答えなど)を投稿するのにシーザー暗号が使われることがあり、この場合、鍵は伝統的に13にし、ROT13とも呼ばれる。シーザー暗号を解読するためのコマンド(caesar(6))が標準装備されているUNIXシステムもある。
ヴィジュネル暗号は、文章の文字ひとつひとつに異なったシフト数のシーザー暗号を用いている。シフト数は暗号鍵の単語を繰り返して決められる。暗号鍵がメッセージと同じ長さのランダムな文字列で、誰にも知られることなく、二度と使われることがないのであれば、それはワンタイムパッドとなり解読不能となる。だが、これらの条件を満たすことは実際には非常に難しい。暗号鍵がメッセージよりも短い場合、頻度分析を統計的に拡張することで暗号文に周期的なパターンが検出される。
暗号化には二つのアルファベット列を使用する。暗号化のためのアルファベットは、通常のアルファベットを左、または右にいくつか循環シフト(ローテーション)させる。下図は、左に3文字の循環シフトをした場合のアルファベット列である。これは、右に23文字の循環シフトをした場合と同じである。シフトの方向およびシフトさせた個数はこの暗号の鍵として使用される。
通常のアルファベット:   ABCDEFGHIJKLMNOPQRSTUVWXYZ
暗号化アルファベット:   XYZABCDEFGHIJKLMNOPQRSTUVW
暗号化する場合は、「通常のアルファベット」列から平文の文字を探し、対応する「暗号化アルファベット」列の文字を書き出す。
平文:   THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
暗号文: QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD
復号したい場合は逆をおこなえばよい。すなわち、右に3つ循環シフトさせる。
この暗号化の手順は合同算術を使用して表現することもできる。その場合、A = 0, B = 1, ..., Z = 25 のように、文字を数字に変換しておく。文字 x を n 個のシフトで暗号化する場合を数学的に表現すると、下記となる。
E_n(x) = (x + n) \mod {26}
同様に、復号は下記となる。
D_n(x) = (x - n) \mod {26}
プログラミングで実装する場合、使用する言語によって剰余演算の定義が異なる場合がある。上記の場合、結果は0以上25以下の範囲となるが、そうでない場合、26を加算する、もしくは減算する必要がある。
シーザー暗号の場合、文字の交換方式はメッセージ全体を通して同一である。このような暗号を単一換字式暗号と呼ぶ。対して、文字ごとに交換方式を変えるものを多表換字式暗号と呼ぶ。
シーザー暗号は暗号文単独攻撃によって簡単に解読することができる。以下の2つのシチュエーションを想定する。
攻撃者は何らかの単一換字式暗号が使われていることを知っている(もしくは推測している)が、それがシーザー暗号かどうかまでは分からない。
攻撃者はシーザー暗号が使われていることを知っているが、シフトの数が分からない。
はじめのケースでは、頻度分析や単語パターンなどの、一般的な単換字式暗号と同様の解読手法を使用することができる。シーザー暗号は特徴的なアルゴリズムであるため、解読者はすぐに法則性に気づき、解読もしくは推測することができるだろう。
二番目のケースにおいては、より直接的に暗号解読を行える。英語であれば26通りといったように、シフト可能な数は限られているため、総当たり攻撃を試みることができる。総当たり攻撃の一つの方法は、暗号文の一部をシフト可能な数だけ表に書き出してみる事である。この方法は「completing the plain component」と呼ばれている。例として、"<tt>EXXEGOEXSRGI</tt>"という暗号文があるとき、平文は4つシフトしたものであると、すぐに識別できる。もう一つの総当たり攻撃は、暗号文の各文字の下に、逆順にシフトさせたアルファベットすべてを記載していく方法である。この際、縦方向にアルファベットを逆順に並べた紙片を用意しておくとより手早く行うことができる。その紙片を使って暗号文を並べると、別のいずれかの列に平文が出現する。
文字の頻度分布と組み合わせることで、別の総当たり攻撃を試みることができる。暗号文に出現する文字の頻度のグラフと、使用されている言語の文字の分布期待値のグラフにより、人はグラフの特徴を比べることで、いくつシフトしているかを容易に発見することができるだろう。たとえば、英語の平文では<tt>E</tt>や<tt>T</tt>が最も出現頻度が高く、<tt>Q</tt>や<tt>Z</tt>が最も出現頻度が低いといった特徴がある。コンピュータを使用し、たとえばカイ二乗検定などを実施することでも、暗号文の出現頻度と平文の出現頻度の比較を行うこともできる。
自然言語の場合、ほとんどの場合において解読結果は1通りに定まるが、平文が極端に短い場合、複数の解読候補が存在しうる。たとえば、英語において、"<tt>MPQY</tt>"という暗号文は"<tt>aden</tt>"または"<tt>know</tt>"と解読しうる。同様に、"<tt>ALIIP</tt>"は"<tt>dolls</tt>"または"<tt>wheel</tt>"に、"<tt>AFCCP</tt>"は"<tt>jolly</tt>"または"<tt>cheer</tt>"に変換しうる。詳細は判別距離を参照。
シーザー暗号による暗号化や復号を複数回行った場合でも、安全性に変化はない。なぜなら、A 個分のシフトと B 個分のシフトを別個に行ったとしても、それは (A + B) 個分のシフトを行ったものと同等だからである。数学的には複数の暗号鍵による暗号化を行ったとしても、それはひとつの群として扱われる。