TOUCH THE SECURITY Powered by Security Service G

コラム

2022.08.23

シーザー暗号とは?Pythonを使った解き方と暗号化・復号化プログラムを解説

シーザー暗号とは、古代ローマのガイウス・ユリウス・カエサルも使用していたとされる暗号のことで、世界的に広く知られている暗号です。カエサル(Ceasar)が英語でシーザーとも読めることから「カエサル式暗号」と呼ばれたり、単一換字式暗号の暗号化方式のため、「シフト暗号」と呼ばれることもあります。

コンピューターとインターネットが普及した今の世の中では、暗号化された通信が有線無線問わず私たちの身の回りにところかまわず飛び交っています。

過去の歴史において暗号とはどのように使われていて、どのように人々と関わってきたのでしょうか。今回は、コンピューターも無線通信もなかった時代に使われていたシーザー暗号について、概要や暗号の解き方などを解説します。

シーザー暗号とは?

シーザー暗号は、単一換字式暗号の1つで、イエス・キリストが誕生する少し前、古代ローマで活躍したガイウス・ユリウス・カエサル(シーザー)も使っていたことが知られている、各文字をそれぞれ同じ文字数だけシフト(ずらして)して暗号を作成する暗号手法です。

後の歴史家スエトニウスは書物「皇帝伝」に、カエサルがこの暗号手法を用いていたと記述しています。

シーザー暗号は、上記図のようにそれぞれの文字を「3つずつ」シフトするというルールが適用されていた場合、平文の「a」は 暗号文の「d」、「b」は「e」、「c」は「f」というように暗号化されていきます。

「x」や「y」、「z」のように3つシフトすると「z」を超えてしまう場合は、次の文字は再び「a」に戻る、というルールでシフトされ、それぞれ「a」「b」「c」と暗号化されます。

例えば平文が “hello” の場合、暗号文は “khoor” になります。

「暗号アルゴリズム」「暗号鍵」「鍵空間とは」「総当たり攻撃」とは

シーザー暗号を始めとした暗号化についての話では、「暗号アルゴリズム」「暗号鍵」「鍵空間とは」「総当たり攻撃」といった用語が頻繁に使われます。まずは用語について概要を押さえておきましょう。

平文から暗号文を作る手順および、暗号文を復号する手順のことを「暗号アルゴリズム」といいます。また、「暗号アルゴリズム」を実行するのに必要になる値を「暗号鍵」といいます。

暗号鍵として使用できる値のパターンの総数のことを「鍵空間」と呼びます。また、鍵空間すべてを力ずくで総当たりして解読を試みることを「ブルート・フォース・アタック」(総当たり攻撃)と呼びます。

単一換字式暗号とは?

平文の文字に対して、必ず同じ暗号文の文字に変換される暗号を「単一換字式暗号」と呼びます。

単一換字式暗号とは、平文の文字に対して、同じ暗号文の文字に必ず変換される暗号です。 例えば、平文「a」が暗号文の「c」に必ず暗号化される場合、これは単一換字式暗号になります。シーザー暗号も単純な単一換字暗号の一種です。

しかし、シーザー暗号はすべての文字が同じ文字数の数だけ、しかも同じ方向にシフトするというアルゴリズムだったため、文字の種類の数しか鍵空間を確保できません。

しかし、下記のように「文字によってシフトする数や方向が異なる」というアルゴリズムに変更すると、鍵空間はより膨大なものに変わります。

  • 「a」は右に5文字シフトして「f」に変換する
  • 「b」は右に3文字シフトして「e」に変換する
  • 「c」は右に23文字シフトして「z」に変換する
  • ...(省略)...
  • 「y」は左に1文字シフトして「x」に変換する
  • 「z」は左に22文字シフトして「d」に変換する
文字によってシフトする文字数や方向が異なる変換リストを使用するなら、取れる鍵空間は26 * 25 * 24 * 23 * 22 * 21 … = と、シーザー暗号よりもかなり大きな4兆の1000兆倍という膨大な鍵空間を持てることになります。

シーザー暗号はなぜ脆弱なのか?

シーザー暗号は、上記「単一換字式暗号」と比較して、非常に脆弱な暗号です。シーザー暗号の鍵空間は25通りなのに対し、単一換字式暗号の鍵空間は上述のとおり、4兆の1000兆倍の鍵空間を持つことができます。

暗号アルゴリズム すべての文字を暗号鍵が示す文字数分シフトする
暗号鍵 1~25までの数字 (英語アルファベット小文字のみの場合)

シーザー暗号のアルゴリズムと暗号鍵は、上記のように示すことが出来ます。シーザー暗号のアルゴリズムでは、対象とする文字の種類の数しか暗号鍵のパターン数を確保できません。

暗号鍵として使用することができる値のパターンの総数が小さすぎるため、総当たりによる解読が容易です。そのため、シーザー暗号はとても脆弱な暗号といえます。

Pythonを用いたシーザー暗号プログラム解読

Pythonを用いて、実際にシーザー暗号文を復号してみましょう。

シーザー暗号の暗号文「rtytwhdhqj」の平文を導く手段を考えてみます。

暗号文がシーザー暗号であることさえ推測できれば、紙と鉛筆という原始的な手段でもある程度の時間と労力で解くことが可能ですが、コンピューターの力を借りれば一瞬で解読することが可能になります。プログラム言語Pythonで記述した以下のソースコードを実行し、文字をシフトする数の候補を1~25までを総当たりで試すことで一瞬で解読することが出来ました。

♦ソースコード

# strInputText	: シーザー暗号の暗号化/復号の対象文字列。英語小文字。
# intKey	: 暗号化キー。英語小文字アルファベットのみの場合は1-25の範囲の数値。
def caesar(strInputText, intKey):
    strResultList = []
    for char in strInputText:
        if (ord(char) + intKey) <= ord('z'):
            strResultList.append(chr(ord(char) + intKey))
        else:
            strResultList.append(chr((ord('a') – 1) + (ord(char) + intKey - ord('z'))))

    print('key:' + str(intKey) + ' > ' + ''.join(strResultList))

if __name__ == '__main__':
    for i in range(1, 26):
        caesar('rtytwhdhqj', i)

♦実行結果

key:1 > suzuxieirk
key:2 > tvavyjfjsl
key:3 > uwbwzkgktm
・・・(省略)・・・
key:20 > lnsnqbxbkd
key:21 > motorcycle <----答え
key:22 > npupsdzdmf
・・・(省略)・・・

記事一覧に戻る