[kyasbal]
やはり、以前と同じくアプリケーションの設計不足と言ったところか、いろんな構造上の欠陥が・・・
仕様書なんて2,3枚しかなかったのは論外だと、設計を学んで思いました。
もう一度仕様を書き直し、使えるコードを使いまわす、そんな感じでやっていこうかと思っている中、やっぱり.Netを使用すべきだという意見が多数。
僕自身、.Netの知識は、少なく、だったらマネージコードにすれば・・・とか簡単にできるものと考えていました。
しかし、全然違う!
やはり、設計は大事!とはいえ、抽象すぎて、仕様書に具体化できないんです。
そんなわけで、基底部分の設計は、そういうのが得意そうな人に任せたわけで、C#において電子署名クラスを作成しました。
ところで、電子署名って何か知っていますか?
AIRをいじったことのある人やPDFのちょっと奥深い機能を使えば、電子署名ってのがあると思います。
さて、電子署名というのは、その人が本当に作られたものか、その人からクライアントにそのファイルが渡る前に第三者によって改変されていないかをチェックするものです。
もちろん、改変されていれば、ウイルスなどという可能性もあるので、これはチェックすべきです。
では、どうやってチェックしているのでしょう?
RSA暗号化というものを利用します。
まず、ファイル自身からハッシュ値を計算します。
ハッシュ値とは、短い文字列で、ファイルの中身が1文字でも違えば、別の値になるという特徴があります。
[http://itpro.nikkeibp.co.jp/article/COLUMN/20060628/241960/]
MD5やSHA-1,SHA-512などいろいろなアルゴリズムによって、ファイルからハッシュ値を取得します。
つまり、このハッシュ値をあらかじめ記憶しておいて、起動時にファイルのハッシュ値を再度計算、このファイルと異なる場合、途中の経路で改変が行われたことがわかります。
しかし、もともとのハッシュ値をそのまま保存していたら、そのハッシュ値をファイルの改変後のものにすり替えられたら元も子もありません。
そこで、RSA暗号化をはじめとする、公開鍵方式の暗号化を使用します。
公開鍵方式の暗号化は、秘密鍵、公開鍵の2によって成り立ちます。
いきなりですが、1553179961を素因数分解してください。
.........
.....
...
..
無理ですね。
ちなみに17807*87223に分解できます。
じゃあ、85を素因数分解してください。
......
....
...
17*5に分解できます。
じゃあ、なんでそうだと言い切れますか?どうして17*5だと分かったのでしょう?
このように、勘で素因数分解しているだけであって、大きな数の素因数分解をさせるアルゴリズムは存在しないのです。
これを利用して、秘密鍵(素数)から、公開鍵(素数*素数の数)を生成します。
こうすると、不思議なことに、秘密鍵で暗号化したファイルは公開鍵で複合できますが、同じように公開鍵では暗号化できないのです。
あえて、公開鍵を公開します。
作者は、ハッシュ値を秘密鍵を使用して暗号化し、同梱します。公開鍵を使用して、複合化を試みます。
公開鍵は対応した秘密鍵で暗号化したものでしか複合化できないので、つまり、正常に複合化できれば作者しか知らない秘密鍵で作成された暗号だということが保障されます。
ハッシュ値を改竄するには、この秘密鍵がなければ無理です。
では、このRSA暗号化ですが、どれほどの強度があるのでしょう?
映画「サマーウォーズ」の主人公、健二が解いた暗号化は、劇中でShorの因数分解アルゴリズムの本を読んでいたことから、因数分解に関係した暗号化、つまりRSAであったと予想されます。
solve me!というタイトルで送られてきたメールは2056桁の公開鍵だと思われます。
つまり、これは2056桁の秘密鍵*秘密鍵で作成されたものであり、素因数分解をすることで、これを解くことができます。
これを、2.2Ghzのノイマン型コンピューターに解かすと、1000,000,000,000,000,000,000,000,000,000,000,000,000年(1の後に0が39個)がかかることになります。
手計算で1夜で解いてしまうなんてなんて頭がいいんでしょうか。(笑)
ペンタゴンは、侘助を引き抜いたが、多分健二のほうを引き抜くべきだったのではないだろうか。
最も、量子コンピューターが完成したら、こんなもの、数時間で解いてしまうと言われていますが・・・
RSAは世界中の暗号化でかなりよく利用されています。
そんなことになったら・・・世界中大混乱でしょうね。
[0回]
PR