2013年6月16日日曜日

読了: 新版暗号技術入門

結城先生の書籍、『新版暗号技術入門 秘密の国のアリス』を読み終わりました。




この本はタイトルの通り、暗号化の技術に関する入門書です。
共通の鍵を使用する対称暗号、最近よく使われる公開鍵暗号、認証や証明といったものの仕組みを、非常にわかりやすく解説しています。

暗号化は、普段からプログラミングに限らずソフトウェアをユーザーとして使うだけでもふつうに使っているのに、その仕組がよくわかっていませんでした。私はべつに暗号化のアルゴリズムを考える人間ではないのですが、自分が使っているものをもっとよく知りたい、安全とはどういうことなのかを知りたい、という動機から本書を読みました。

この本で、暗号化を何らかの形で使うプログラマが学ぶべき重要なことは、

オレオレ暗号化アルゴリズムは絶対使うな!世界的に使われていてもなお安全だと言われているアルゴリズムを使うべし!

の一点に尽きると思います。

なにげに、結城さんの本は、数学ガール以外では初めて読んだのですが、文章が完全無欠すぎてすごかったです。なんでこんな文章が書けるんだー、と関心しながら読ませていただきました。


暗号化で使う乱数生成器について、線形合同法は絶対使うな!とかは書いてありましたが、ではどれを使えばいいのかがとくに書かれていなかったので、後日暗号化アルゴリズムを実際に書いている、サイボウズ・ラボの光成さんに聞いてみました。

アキラ 「暗号化にメルセンヌ・ツイスターって使っていいんでしょうか。予測不可能性が重要だと聞いたのですが…」

光成 「メルセンヌ・ツイスターはもちろん、擬似乱数は数学的に次の値が計算できてしまうので、基本的には暗号化に使ってはだめですね。」

ぺぷしそ 「たしか、メルセンヌ・ツイスターの作者が、暗号化に使ってはいけないと書いてましたよ」

この辺りに書いてます: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html

光成 「メルセンヌ・ツイスターは、周期は長いけど、624個の過去の数列があれば、次の値が特定できてしまいます。(追記:http://homepage1.nifty.com/herumi/diary/1505.html#18)」

光成 「UNIX系なら/dev/randomや/dev/urandomから読んで、WindowsならCryptGenRandomを使いましょう。前に簡単なラッパーを書きました。 https://github.com/herumi/cybozulib/blob/master/include/cybozu/random_generator.hpp 」

アキラ 「あぁ、それは知ってます。ハードウェアの誤差なんかを使う真の乱数ですよね。」

光成 「真ではないけど、限りなく真に近い乱数ですね。ただ、その乱数を生成するために、マウスの動きとかを必要とするのだけど、サーバーで計算させるとマウスとか使わないので、計算に時間がかかってしまうから/dev/randomは使いにくいです。/dev/urandomの方を使いましょう。」

ちなみに、C++11やBoostなら、random_deviceクラスを使えばOKです。


くわしい人が近くにいてくれたおかげで、さらに理解が深まりました!


ちなみにこの本は、私の誕生日プレゼントで道化師さんから送っていただきました。
ありがとうございます!