こんにちは、ナカムラです。
今回は、先日読んだ暗号解読という本の紹介をしたいと思います。
日常生活で暗号なんか関係無いや
と思われるかも知れませんが、インターネットでの機密情報のやり取りが普通に行われている現代、全くの無関係ではいられないと思います。
この本の中では、暗号作成者vs暗号解読者の戦いの歴史が語られています。
昔から暗号は国家レベルの機密を通信するのに使われ、それを解読されることは国民の生命を危険にさらすことに直結するというケースも、多々ありました。
中世の時代では、暗号解読者側の圧倒的勝利
だったようです。
それが、第二次世界大戦頃から徐々に暗号作成者側が有利になってきて、現状は暗号作成者側の勝ち
、と言われています。
「暗号なんて所詮人間が考えた物なんだから、人間に解読できないはずはない
」
と考える方も多いでしょう。その考え方に間違いは無いと思います。
でも、工夫次第によって、解読に要する時間を膨大
なものにすることは可能なのです。
こぼれた水をコップに戻すのが困難なように、あるいは割れた壺を復元するのが難しいように、一方向の作業は簡単だけど、その逆の作業は至難の業
というものがありますよね。
現在の暗号作成にも、その考え方が応用されています。
その具体例が、素因数分解です。
ある人物Aさんが、ある2つの素数(9419と1933)を掛けて、答えを得たとしましょう。
9419 × 1933 = 18206927
これは、計算機があれば簡単にできますよね。
では逆に、18206927という値から、Aさんが掛け合わせた2つの素数を特定することはできるでしょうか?
不可能ではないですけど、大変な作業であることが想像できますよね?
実際の暗号化では、もっともっと大きな桁数(10の130乗以上
)でこれを行い、掛け算する前の2つの素数を特定しないと、暗号が解読できない仕組みになっています。
現代最先端の暗号を解読するためには、とてつもない時間(世界中のコンピュータを使っても、宇宙の年齢以上の時間)が掛かると言われています。
もし、量子コンピュータ(今のところ空想上の超並列コンピュータ)ができた場合、そのとてつもない時間が掛からなくなるため、暗号作成の上で大問題
…とされているようですが、なんとその対策も既にできているとか。
まだ実際には存在しない脅威に対しての対策も既に練ってあるなんて、ちょっと驚きですよね。
でもこの「こんな事、現状あり得ないけど念のため…」という考え方、プログラマにとっては重要だったりします。
例えば、C/C++ での switch 文で、信号機の3色の場合分けをするとしましょう。
そんな場合、次のような switch 文にしていませんか?
switch(signal) {
case RED: // 赤
break;
case BLUE: // 青
break;
case YELLOW: // 黄
break;
}
「信号なんてその3色しかありえないんだから、それでいいんじゃないの?」
と思いがちですが、念のための処理として、次のような default 処理を用意しておくのをお勧めします。
switch(signal) {
case RED: // 赤
break;
case BLUE: // 青
break;
case YELLOW: // 黄
break;
default: // 想定外の色!
printf( “Unexpected color!” );
assert(false);
break;
}
現実世界でならいざ知らず、ゲームの中の信号の色が4色以上に仕様変更されることは、十分あり得ます。
もしくは signal という変数が想定外の値に書き換えられるようなバグもあり得るでしょう。
そんなとき、より早いタイミングで不具合を発見するためにも、この一手間を習慣づけるのは有効です![]()
お試しあれ!
