何処かで見たようなシチュエーションですが、気にしないで下さい。(笑)
|
ウサギ& おねいさん | さん。にい。いち。どか〜ん。 |
| ウザギ | おーいみんなあつまれ〜。 |
| おねいさん | あつまれ〜。 |
| ウサギ | なぜなに RC5 の時間だよ〜。 |
| おねいさん | 時間だよ〜。 |
| ウサギ |
やぁ、みんなげんきだったかなぁ。 うんうん。それは良かった、ボクもげんきだよ。 |
| おねいさん | みんなは RC5 ってしってるかい。 |
| ウサギ | うーん。よくわからないや。なにしろ僕ウサギだし。 |
| おねいさん | RC5 っていうのは秘密鍵暗号の一種です。 |
| ウサギ | ひみつかぎあんごう? |
| おねいさん | 暗号化の方法のことです。 秘密の鍵を用意しておいて、それで文書を暗号に変換します。 暗号を元に戻す時も同じ鍵を使って変換します。 |
| ウサギ | じゃぁ、鍵をぬすんできちゃえば。暗号を読めるのね。 |
| おねいさん | そう、つまり鍵がばれたらそれでおしまいというわけ。 |
| ウサギ | それじゃぁ、あぶないじゃない。 |
| おねいさん |
鍵の管理をちゃんとすれば問題ないけど、ちょっと不安ですね。
最近では、暗号化する時に使う鍵と、普通文に戻す時に使う鍵を別にする
公開鍵暗号というのもよく使われています。
この場合は、普通文に戻すための鍵を公開するんだけど、
暗号化する鍵さえしっかりと管理しておけば、
他人になり済ますことは出来なくなります。 |
| ウサギ | ふーん。 |
| おねいさん | 本題にもどります。 『暗号解読』って言うのは、鍵を持っていない人が、暗号を普通文にするこ とをいいます。 |
| ウサギ | それっていけないことなんじゃないの。 |
| おねいさん | そう。だけども簡単に解読出来るような方法を使っていては、 いくら鍵の管理をしっかりしていても意味が無くなります。 |
| ウサギ | そうよ、簡単な錠前なんかペンチで一発で、、、 |
| おねいさん | そこで、暗号化する道具を作っている会社が、 『うちの錠前は丈夫ですよ。』って宣伝する為に、 暗号解読コンテストをひらいています。 |
| ウサギ | ふーん。RC5 もそうなんだ。 |
| おねいさん |
RC5 はちょっとちがいます。 もともと、RC5 はアメリカのRSA って会社の開発した錠前の一種ですが、 アメリカの法律では、丈夫な錠前の外国への輸出ができません。 これでは、商売にならないので、はやく解読してもらって、 『いまみんなが使っている錠前は安全じゃないんですよ』ということにして、 より強力な錠前を輸出できるようにしたいのです。 早い話、新しい錠前をどんどん売って儲けたいのね。 |
| ウサギ | 結構ふくざつなんだ。 |
| おねいさん | RC5 がどのような錠前なのかはちょっと難しいので、 簡単には『説明』でき、、 |
| 説明おばさん |
説明しましょう。
キーの長さはそのまま暗号の強度になります。 |
| ウサギ | はーい。先生わかりました。 |
| 説明おばさん |
(むっ!)
能天気は置いといて、説明を続けます。
まず最初にキーを展開します。
展開する場所は、32 ビットで適当な大きさの配列ね。
実は大きさは RC5 の複雑さによって変わります。
RC5-32/12/8 って言った場合の 32 が一度に処理するビットの数、
12 が複雑さを示しているのですが、
この複雑さの倍よりちょっと大きな配列を用意します。
キーを展開する前に、配列に初期値をいれておきます。
これには、自然対数の底 e (=2.71828 ...)
と黄金分割比 φ (=1.61803 ...)の小数部分を
2 進数で表現したものを使います。
つまり最初の数値が、
0.71828 ... で一つ増えるごとに 0.61803 ... づつ足していきます。
準備ができたら、この初期値と実際のキーを混ぜ合わせます。 ![]() この操作を、配列の大きさとキーの大きさのうちの大きい方の 3 倍回繰り返します。 RC5-64 の場合は、配列の大きさが 26 で、キーの大きさが 2 だから、 大きいほうの 26 の 3 倍、つまり 78 回繰り返します。 注意して欲しいのは、準備した配列は 3 回、 実際のキーだった物は 36 回書き換えられているということです。 この操作をし終った後に、配列に入っていたものが、 この次の暗号化の時に使用するキーになります。 これでやっと、暗号化する準備が整ったわけね。 暗号にする文章なんだけど、あらかじめ 32 ビットごとに分割しておきます。 そして、分割した物から2個取り出します。 暗号化は、2個つまり 8 バイトごとに行なわれるから、 今から述べる操作を文章すべてに行なわないと暗号にならないのね。
まず 26 個に展開したキーから最初の2個を取り出します。
そして、それぞれ暗号化する文書から取り出した2個に足しちゃいます。
これが初期値になるわけね。
|
| ウサギ | うわーなんだか目が回りそう。 |
| 説明おばさん |
本当は、さらに初期化ベクトルっていうのを用意して、 元の文をちょっと細工してから暗号化するんだけど、 こっちはあまり本質ではないわね。 ちなみに RC5 を更に改良した RC6 というアルゴリズムが既に開発されているわ。 RC5 は 2 個ずつ処理するのが基本だけど、 RC6 は 4 個ずつ取り出して、その 4 個を順繰りにしながら、 RC5 のような暗号化プロセスをおこないます。 いま、アメリカ政府で現在の標準暗号化アルゴリズム DES の後継として AES (Advanced Encryption Standard)というのが選定作業中なんだけど、 RC6 は AES の最有力候補といわれているわ。 もっとも、それは暗号としての性能だけじゃなくて、 政治的なものも絡んでいるから複雑だけど。 |
| おねいさん | プロセッサによって速度がかなり違うのはどうしてなんですか? |
| 説明おばさん |
ひじょーに良い質問ね。 今説明した通り、 RC5 の計算は大半がビットローテートと足し算からなっています。 だから、これらの命令の実行時間が短いプロセッサが有利なの。 例えば、x86 プロセッサでは他の RISC プロセッサと比べて、 ビットローテートが高速なの。 だから、x86 は速いのです。 逆に 64 ビットのプロセッサでは、 32 ビットのビットローテートをするのに、 かなりのコストがかかります。 だから、Alpha は遅いわけね。 もう一つ速度に関係しているのは、複数の命令を同時実行できるかどうかね。 最近のプロセッサは、スーパースカラーといって 複数の命令を実行できるようになってます。 とはいってもどんな命令も並列実行できるわけじゃなくて、 多少の制限があるんだけど、 この制限がプロセッサによって違うのね。 ビットローテートを2個同時実行できるのもあれば、 ビットローテートと加算なら同時実行できるものもあるし、 全然同時実行出来ないものもあるわ。 当然同時にビットローテートと加算をたくさんできるプロセッサが速いわけね。 |
| おねいさん | でも、さっきの図をみると前の結果が決まらないと、 次の計算が出来ないところが多いみたいですが。 |
| 説明おばさん |
さっきのアルゴリズムをそのままコードにすると、
データ依存性が高いので全く並列実行できません。
これを解決するために Distributed.Net の rc5 コードでは、
同時に 2 個のキーを調べるようにして、命令の並列度をあげているわ。 |
| ウサギ | ところで、コンテストはどうなったんですか? |
| 説明おばさん |
そうそう。 例えば 1998 年現在市販されているパソコンで、 RC5-64 を計算すると、 大体 1 秒間に 100 万個のキーをチェックすることができます。 まぁ、これじゃ解読するまでに58万5千年という天文学的時間がかかるんだけど、 それを解決する方法が 1 つあります。 |
| ウサギ |
うーんと、みんなで考えるっていうのはどうかなぁ。 ほら、「三人あつまれば宝珠まんじゅう」っていうし。 |
| 説明おばさん |
正解。
先程、RC5-56 が 265 日で解読出来たといいましたが、
解読したのは、Distributed.Net
というグループです。
このグループは、RC5-56 のキーを小わけにして、
それを世界中の計算機に配って、それぞれで計算してもらったのね。
まあ、地球規模の超大規模並列計算機といったところね。
RC5-64 もいくつかのグループが解読を試みているけど、
Disteibuetd.Net が最有力候補かしら。
さて、Disteibuetd.Net では、RC5-64 の
1844京6744兆737億955万1616個あるキーを、
2億6843万5456づつ小わけにして、参加者に配っています。
この小わけにしたものを「ブロック」と呼んでいるんだけど、
全部でブロックの数は、687億1947万6736個もあります。
いま調べ終ったブロックの数は大体 20 億個だから、
まだ 3% にも満たないわね。
|
| ウサギ |
でも、さっきそれでも 15 年かかるっていいませんでした。 そんなに待ったら私おばさんになっちゃう。 |
| 説明おばさん |
おばさんで悪かったわね。
もちろん、現在の能力ではそのくらいかかるわけだけど、
技術も進歩するでしょうし、参加者も増えるでしょう。 |
| ウサギ | みんな良く分かったかな? |
| おねいさん | じゃぁね |