プログラミング初心者の雑記帳など

2024年6月25日火曜日

古典暗号

 今回はいろいろな古典暗号をプログラムで実装してみました。

 

 明確な定義はありませんが、暗号のうち概ね1970年代以前に使われていたものが古典暗号と呼ばれます。古くは古代ギリシャの皇帝カエサルが軍隊への命令に使用されたシーザー暗号や、近代の第二次大戦中に用いられた日本軍のパープル暗号,ドイツ軍のエニグマもこの分類に該当します。それに対し、前回紹介したRSA暗号のように、インターネット上などで現在も使われているものを現代暗号と呼びます。こちらは大きく分けて公開鍵暗号方式と共通鍵暗号方式があります。

 

 古典暗号と現代暗号の違いとして一番大きいのは、現代暗号はアルゴリズムが公開されていることです。古典暗号はアルゴリズムと暗号化のパラメータを秘匿して用います。人間が暗号化、復号を行うためアルゴリズムはとても単純になっています。それに対して現代暗号は仕組みが分かっていても秘密の数字を求めることがとても困難に設計されています。秘密の数は時間をかければ求めることはできますが、例えば、現在使われるRSA暗号における秘密の数字は総当たりで探しても数千年程度という現実的でないほどの時間がかかります。(量子計算機により早く解けるといった話もあるそうですが今回は割愛します)

 古典暗号が使われなくなった理由としてはコンピュータが発展し、暗号としての完全性が保てなくなったことが理由の一つとして挙げられます。前述のとおり古典暗号は暗号化の方法(アルゴリズム)と暗号化のパラメータ(暗号鍵)を秘密にしておく必要があり、その方法が分かってしまえば簡単に解読されてしまうからです。また、暗号に使う暗号化鍵が小さく、総当たりで求めることが容易なことも挙げられます。そして、それらはコンピュータを使えば一瞬で推定ができていしまいます。解読が困難なことで有名なエニグマもコンピュータを用いた計算により解読法が発見されるなど、従来の暗号としての機能を保てなくなりました。暗号に求められる機能や性能は時代と共に変化し、現在では暗号は解けないものではなく利用する時間中に解読されないという考え方で安全性が議論されています。

 

 ではプログラミングで実装した暗号の話になります。今回実装したのは以下の古典暗号です。

  • 換字式暗号
  • シーザー暗号
  • アフィン暗号
換字式暗号
 古典暗号では最も一般的な暗号になります。平文の一文字または複数文字を別の文字や記号と対応させることで暗号化、復号を行います。例えば、以下のように表を作り、対応させて暗号を作ります。このような数字と対応させるものをポリュビオスの暗号表といいます。

この表を使ってABCを暗号化すると
A->00
B->01
C->02
より、000102となります。

今回実装したプログラムでは以下のように二つの表を定めています。


左上の0と1はtableの識別に使います。table1の場合は0を、table2の場合は1を暗号文の前につけています。この表でAaBbCcを暗号化すると

A->000
a->100
B->001
b->101
C->002
c->102
となり、000100001101002102となります。
復号の場合、3桁ずつ対応する表と比較していけば元に戻ります。


シーザー暗号
 前述したカエサルが用いたとされる暗号で、上記の換字式暗号の一種です。文字を特定の文字数ずらして暗号化します。以下の例では、平文の文字を3字ずらして暗号化しています。

上の例でABCを暗号化すると
A->D
B->E
C->F
よりDEFとなります



アフィン暗号
 アフィン変換を用いて行う暗号です。アフィン変換とは、簡単に言えば線形移動と平行移動を組み合わせたものをいいます。(Ax+bの形でかけるもの)
アフィン暗号では使う文字に数字を割り当てて暗号化と復号を行います。英字アルファベットであればA,B,C...にそれぞれ0,1,2...とします。このとき平文の暗号化は以下の式で行います。xは平文のアルファベットに対応する番号になります。



a,bは暗号化のためのパラメータ、mはアルファベットの数です。英語アルファベット(小文字のみ)であれば26、日本語(かなのみ)であれば55になります。また、aとmは互いに素である必要があります。

暗号文の復号は以下の式で行います。cは暗号文のアルファベットに対応する番号です。


a^-1はmを法とするaの逆元(modular逆数)を表します。これを求めるには(mn+1)がaで割り切れるとき、その商はaの逆元となります。


ソースコードはこちらに置いておきますので、引用明記のうえでご自由にお使いください。

参考
Pythonでいかにして暗号を破るか Al Sweigart著 IPUSIRON訳


おまけ
上記の暗号化のどれかを用いて暗号文を作成しました。暇つぶしに解読してみて下さい。簡単に解けるようにはしています。テキストファイルにそのまま張り付けて公開したプログラムで復号すると解読できます。

h9nn9!a7xpm7M89bmPMo7?zLzB,89Mm98Bp8?!O9mnP8?9!6
eBpB!8a7xB!pm7M8?9!oPzcBp9nBBzzB!8?PaO9m,P8Pp9nnL!?pP8?9!9!8oBt!8Bm!B86
.B8nP!7MB9MaBLzB?!8Bm!B8l?8o9L8B!pm7M8?9!O9m,P8P6
EB9MaBzBBn898o?!N8oP88oB7l9!8cB8PmbB8B,c7oPpNBmzxcL88oP8zPc?bn?z8PNB6
0oBoPpNBmbm9LM8oP8?znPa?p?9Lz?!z8BP,8PmbB8YLa!BmPcaBMm?YP8Bp9nML8BmzP!,LzB8oBnPzzMm?!bc9Pm,zO9m8oB?mP88PpNz6
1O8B!8?nBzx8o9zBPOOBp8B,,9!98o?!b89Mm98Bp8Mm?YPp7,P8P6
TB!BmPaa7zMBPN?!bx8oBLzB9OB!pm7M8?9!,9Bz!98Mm9Y?,BPcz9aL8BzBpLm?87xcL8?8zLzB,9Bz?nMm9YBzBpLm?876
eBbPm,aBzz79Lm8o9Lbo8P!,oPc?8xoPpNBmzPmBPO8Bm79Lmp9nML8Bm6
HalP7zcBpPmBOLa79Lmp9nML8BmzBpLm?87
EPm8?pLaPma7xpmB,?8pPm,MPzzl9m,zP!,cP!Ntu!LncBmzPmBYBm7YPaLPcaB,P8P89oPpNBmz6
gB!pBxloB!BYBm79Lp9nnL!?pP8B9!a?!BxnPNBzLmB8oP879Lm,P8P?zB!pm7M8B,6
.9Lm,P8P?zn9mBYLa!BmPcaB898oBO88oP!79Ln?bo88o?!N6

0 件のコメント:

コメントを投稿