カエサル暗号

  暗号は,古くから色々な形で用いられてきましたが,コンピュータでの処理に適したものとして知られる最も古いものにカエサル暗号があります。ユリウス・カエサル(ジュリアス・シーザー:B.C.102-B.C.44)が使ったと言われるこの暗号は,換字式と言われるものの中でも最も単純なものです。

 ローマのスエトニウスによる「カエサル伝」には

「家のものに内密に伝えることがあると,彼は暗号を使い,言葉にならぬよう文字を並べ替えて書くのが常であった。そしてそれを読み取るには,各文字をアルファベットの順で3つ前の文字に置き換えなければならなかった。」

といった記述があるそうです。 この記述の内容が事実とすると,カエサルは日常的に暗号を使っていたことになります。カエサルが「ブルータスおまえもか」と言って暗殺された事実と合わせると考えさせられます。

 文をアルファベット26文字で表すとすると, この暗号は次の対応表で文字を書き換えたものになります。

平文 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
暗号文 D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

 このように文字を入れ替える形の暗号を換字式暗号(Substitution Cipher)と言います。特に一文字の変換をするものを単換字式暗号と言います。このカエサル暗号は単換字式暗号の最も簡単な形の暗号です。

 また,カエサル暗号は文字を「ずらす」ものでもあるので,シフト暗号とも言われます。

 このカエサル暗号は極めて単純な暗号形式なので,暗号としての効力は余りありません。慣れた解読者であれば,直ちに解読してしまうでしょう。ですから,カエサルが本気でこの暗号を使っていたかどうかは疑問です。

 カエサル暗号を含めて,一般に単換字式の暗号は文字の頻出度合いを調べることで,比較的簡単に解読できますから,この形の暗号は実用的なものではありません。

カエサル暗号のプログラム

 ここではカエサル暗号の暗号化,そしてその逆の復号化プログラムを作って見ましょう。実用にはなりませんが,プログラムの練習例としては多少の意味があります。


 まず,文字のままでは,処理が難しいので,文字を数値に対応させます。Aを0,Bを1,と言う風に対応させると,次の表が得られます。

平文 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
対応数 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

この対応した数で暗号化した表を作ると,次のようになります。

平文 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
暗号文 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 0 1 2

この表を見ると,平文 P に対して暗号文 C との関係が,

C ≡ P + 3 mod 26

で与えられることが分かります。この式は,C が P に3を加えて,それを26 で割ったときの余りになることを示しています。逆に暗号文 C に対して平文 P との関係が,

P ≡ C - 3 mod 26

でも与えられます。


 以上のことを使うと,カエサル暗号の暗号化・復号化プログラムは簡単に作れます。以下がその一例です。

A$="IfYouWorkHardThenYouHaveGoodResult"
A$=UCase$(A$)
L=len(A$)
Print "文字列 "; A$;" はカエサル暗号によって"

C$=""
For k=1 to L
  P$ = Mid$(A$,k,1)
  Pn=asc(P$)-asc("A")
  Cn=(Pn + 3) mod 26
  C$=C$+Chr$(Cn+asc("A"))
Next k
Print C$;" へ暗号化されました。"
End

行番号を付けて説明します。

01 A$="IfYouWorkHardThenYouHaveGoodResult"
02 A$=UCase$(A$)
03 L=len(A$)
04 Print "文字列 "; A$;" はカエサル暗号によって"
05
06 C$=""
07 For k=1 to L
08   P$ = Mid$(A$,k,1)
09   Pn=Asc(P$) - Asc("A")
10   Cn=(Pn + 3) mod 26
11   C$=C$ + Chr$(Cn+Asc("A"))
12 Next k
13 Print C$;" へ暗号化されました。"
14 End

1行目の A$ はもとの文章(平文)です。見易さのため大文字小文字を使っています。2行目でそれをすべて大文字にしています。

3行目の L は A$ の長さです。

8行目では Mid$ 関数を使って,k番目の文字を P$ としています。

9行目で, P$ から対応する数 Pn を求めています。アスキー表が ABC...Z と並んでいることを利用しています。

10行目で暗号文に対応する数 Cnを計算しています。mod 演算子を使えば可能です。

11行目でCn に対応する文字を Chr$(Cn + Asc("A")) で求め,それを C$ に加えて暗号文としています。


 暗号文を復号するプログラムは10行目を変更すれば良いだけです。

カエサル暗号の一寸した拡張

 カエサル暗号は,その仕組みさえ分かればすぐに解読されてしまいます。そこでその少し拡張を考えましょう。

 カエサル暗号は

C ≡ P + 3 mod 26

によって,平文と暗号文の対応がされています。この式を見るとすぐに,3を加えるのでなく別の数を加えても暗号化が出来ることに気づきます。一般に,bを1から25までの数とするとき,

C ≡ P + b mod 26

によって,暗号文を作ることができます。さらにもう少し,一般化して,aを26と互いに素な25以下の自然数とすると,

C ≡ aP + b mod 26

を使っても暗号文を作ることが出来ます。ここで,aが26と互いに素という条件は,a・A≡1 mod 26 となる自然数Aが存在するための必要十分条件です。このAに対して,

P ≡ AC - b mod 26

によって,復号が出来ます。ここで実際の計算では -bではなく,26-bを使うと正の数を加えることになり,計算結果も正数が得られます。

 例えば a=5なら,A=21です。実際,5・21=105=4・26+1≡1 mod 26 となります。ですから,b=7とすると,

C ≡ 5P +7 mod 26

で暗号化し,

P ≡ 21C +19 mod 26

で復号化が出来ます。


 この形の単換字暗号をアフィン(Affine)暗号といいます。今の場合,aとして,12通り,bとして26通りありますから,12*26=312通りの暗号化があります。(但しこの中にはa=1,b=0の場合,つまり何もしない場合も含まれています。) ですから,少しだけ解読が難しくなります。でもこれだけでは,実用的には無力な暗号です。

 次の文章はこの形の暗号で暗号化されたものです。

NWZQXMCWIWCMPREECKPNUMREEZHKQXMCWIEZHKQVRKARMOOWZA

解読にチャレンジしてみてください。