キーワード:SHA-512 解除

森へのパスポートじゃないですよ。

 

暗号って何か知ってますか?

そう、正解です。

おそらくイメージしたとおりのものです。

 

例えば秘密の文書があったとして、これをそのまま保存すると

誰かに見られた時に内容がバレてしまいます。

 

じゃあ見られてもバレないようにするにはどうすればいいか?

見ても意味不明な内容にしておけばいいですよね。

でも、暗号しっぱなしだと保存した人も意味不明なので

自分で見る時はきちんと元の文書に戻さないといけません。

この暗号化されたものを元に戻すのを復号といいます。

 

※元に戻せないようにするものは主にハッシュ計算などがあります。

 

 

 

 

 

 

  

まず、簡単な暗号化を例にします。

「あまくさ」という文字を一定のルールに従って暗号化してみます。

「えめさせ」

 えめさせ、意味わかりませんね?

 

これはどういうルールで暗号化したのでしょうか。

気付いている人もいるでしょうが、単純に文字を3文字ずつずらしただけです。

あ→いう

ま→みむ

く→けこ

さ→しす

復号する時は、これを3文字ずつ逆にずらせばいいだけです。

こういう文字を数文字ずつずらす方法をシーザー暗号と言います。

 

でもこれってずらす文字数がわかれば簡単に解読できますよね?

特にコンピューターは文書の文字をずらす作業なんか高速で行えます。

100万文字の文書の文字を3文字ずらすのも1秒もかかりません。

なので、実際はもっと複雑な方法で暗号化されています。

 

ここまでは暗号ってどんなものかという説明だけですが、

実際に使われている暗号はどんなものがあるでしょうか。

 

暗号には大きく分けて共通鍵暗号と公開鍵暗号の2つがあります。

この2つの違いについて簡単に書くと、

 

共通鍵暗号・・・暗号化と復号を同じ鍵で行う。

公開鍵暗号・・・暗号化と復号を違う鍵で行う。

 

ここでいう鍵というのは暗号化や復号に使うデータだと思ってください。

例えば暗号化する場合にパスワードを入力するとしますよね?

するとそのパスワードを使って一定のルールに従い鍵を生成します。

おそらくパスワードの他にも何か別の成分を合わせて作り出していると思います。

上で書いた元に戻せない変換であるハッシュ変換を使うパターンが多いと思いますが。

ハッシュについては後の方でちょろっと書いてますので見てください。

(あんましちょろっとじゃないうえにわかりにくくなってしまった)

 

ちょっとわかりづらいので

もう少しわかり易く書いてみます(でも多分わかりにくいw)

 

共通鍵暗号

ある文書があったとします秘密の文書とします。

この秘密の文書鍵Aで暗号化します。

すると鍵Aで暗号化された秘密の文書ができます。

では、これを元の秘密の文書に戻す(復号)にはどうすればいいか?

同じく鍵Aを使って復号すれば良いわけです。

このように共通鍵暗号は暗号化と復号に鍵Aという共通の鍵を使っているため

共通鍵暗号と言います。

一般の鍵と同じでわかりやすいですよね?

「自宅の玄関」を閉めるにも開けるにも同じ「自宅の玄関の鍵」が必要です。

コンピュータの分野では身近なものは無線LANのSSIDに設定してある

パスワードではないでしょうか。

これは親機と子機で同じ鍵(パスワード)を設定する事によって暗号化してデータの

通信を行っています。

お互いに共通の鍵があるので暗号化したデータのやり取りが可能です。

 

公開鍵暗号

共通鍵暗号は一般的な鍵のイメージそのままなのでわかりやすいですが

公開鍵暗号は鍵が必ずペアで存在し、片方の鍵で暗号化したらもうひとつの

ペアである鍵でしか復号ができません。

共通鍵暗号と同じように例えを出します。

ある文書があったとします秘密の文書とします。

この秘密の文書鍵Aで暗号化します。

すると鍵Aで暗号化された秘密の文書ができます。

では、これを元の秘密の文書に戻す(復号)にはどうすればいいか?

共通鍵暗号の場合は同じ鍵Aを使って復号しますが

公開鍵暗号の場合はの鍵Aペアであるもうひとつの鍵(鍵Bとします)

を使わないと復号ができないようになっています。

逆に鍵Bで暗号化したものは鍵Aでないと復号できません。

 

で、これが何の役に立つのか?

 

例えば共通鍵暗号の場合は秘密データをやり取りするのに

お互いに同じ鍵を事前に持っておかなければなりませんが、

公開鍵暗号の場合は鍵ペアの片方を公開して

「私へ秘密の文書を送る場合はこの鍵で暗号化して送ってね」

というふうにしておき、もう片方のペアの鍵はバレないように

自分で秘密にしてもっていれば公開した鍵で暗号化されたデータは

もう片方の秘密にしている鍵で復号して見れるワケです。

 

共通鍵暗号の場合は鍵を公開してしまったら誰でも復号できるようになってしまい

暗号化の意味がなくなりますが、公開鍵暗号の場合はペアのうちの片方だけ

公開しても公開した鍵とペアになっているもうひとつの鍵でしか

復号できないため文書を暗号化した人と暗号文受け取った秘密の鍵の持ち主しか見れない

という事になります。

 

このように公開鍵暗号はペアになっている片方を公開するため公開鍵暗号と言ってます。

公開する側の鍵を公開鍵、バレないようにもっている側の鍵を秘密鍵と言います。

そのまんまですね。

 

ただ、この公開鍵暗号ですが一般的に暗号化と復号の処理が共通鍵暗号に比べて速度が遅いです。

なので、通常は公開鍵暗号だけを単独で使うという事はあまりなく、

共通鍵暗号と組合わせて使われる場合が多いです。

例えば一時的に生成した共通鍵を送信者と受信者で使う場合、

公開鍵暗号でその共通鍵を暗号化してやりとりを行い、

実際の通信の暗号化と復号はそのやり取りを行った共通鍵を使う、という事になります。

 

つまり、データを暗号化するための共通鍵を公開鍵暗号で暗号化して相手に送信し、

データ通信を行う前に同じ共通鍵を持っている状態にしているわけですね。

 

このように公開鍵暗号と共通鍵暗号を組合わせた通信で一番身近なものはおそらく

SSL通信だと思います。

SSL通信、聞いた事がある人もいるかと思いますが、ショッピングサイトなんかで

情報をやりとりする場合の通信を暗号化するために使われています。

SSL通信の場合はURLがhttpではなくhttpsとなっています。

ブラウザでは南京錠のマークまでついてて「暗号化通信してます!」とアピールしてますw

 

SSLは上で書いたような共通鍵を公開鍵暗号を使ってやりとりしているだけでなく、

他にも接続している相手が本来接続するべき相手であるかどうか(なりすましではないか?)

というものまでチェックしています。

これも公開鍵暗号を使って行われていますがその話はまた別の機会にw

 

まぁだいたいこんな所ですがどうでしょう?

文書がわかりずらいですね、今後もっとわかりやすいような文書を書けるように

気が向いたら努力しますw

 

さて、上の方で出てきたハッシュについてちょっとだけ説明します。

ハッシュとはあるデータをある決まった計算方法で別のデータに変換したものです。

このハッシュデータのサイズはハッシュ計算の種類(ハッシュ関数)によって

256ビットとか512ビットとか長さが決められています。

 

例えばMD5というハッシュ計算(アルゴリズム)では128ビット(16バイト)のハッシュ値を

出力するようになっています。

このMD5を使って10MBのファイルのハッシュ値を生成すると

そのファイルから16BのMD5ハッシュ値が得られます。

MD5の場合、元のデータが16B以下だろうが、

1GBだろうが必ず128ビット(16B)のハッシュデータに変換されます。

 

上の例でいくと10MBのデータをたった16Bのデータに変換するのでハッシュデータから

元のデータは復元できません。

 

では、データを元に戻せなくして一体何の役に立つのか?

 

更に上の例でいくと10MBのファイルのハッシュ値があるとします。

このファイルを誰か別の人に送りました。

そこで受け取った人はこのファイルが壊れていないか、または途中で

改ざんされていないかを確認するにはどうすればいいでしょう?

同じように受け取ったデータを同じハッシュ計算でハッシュ値を求め、

相手とそのハッシュ値を比較して同じならほぼ間違いないという事になります。

 

ハッシュ計算では元のデータからハッシュ値を予測できると

セキュリティ上も都合が悪いです。

このため、一般的なハッシュ計算では元のデータの値が1ビットでも変わると

出力されるハッシュ値は大きく異なって出力されます。

 

実際に実験してみます。

abcという文字列をMD5でハッシュ値を計算すると

900150983cd24fb0d6963f7d28e17f72

というハッシュ値が出力されます。

(MD5は16バイトですが、1バイト(8ビット)を16進数2桁で表現しているため倍の32文字になっています)

ではabbという文字列を同じくMD5でハッシュ値を求めるとどうなるか?

ea01e5fd8e4d8832825acdd20eac5104

こうなります。

abcとabbのデータの違いはたったの1ビットです。

それなのにハッシュ値は全く違う値になってます。

つまりそういう事なんです。

 

大きなファイルをダウンロードする時、ダウンロードしたファイルが破損してないかを

チェックするためにダウロードのページなんかではこのファイルのハッシュ値は

これですよ~って書いてある場合があります。

だいたいMD5が多いですがSHA-512とかも見かけます。

つまり、ファイルをダウンロードしたあとそのファイルのハッシュ値を求めて

ページに記してあるハッシュ値と同じならば

正しくダウンロードできたという事になります。

 

もちろん、ハッシュは長いデータを短い固定長のデータに集約しますので

元のデータが違っても同じハッシュ値になる場合があるのは想像できますね。

こういった元データが違うのにハッシュ値が同じになる事をシノニムと言います。

要はハッシュ値の衝突です。

 

基本的によく使われる有名どころのハッシュ計算のアルゴリズムでは

シノニムが発生するのは天文学的な確率なのでほぼゼロと見なして問題ありません。

たぶんねw

 

※以前からMD5というハッシュアルゴリズムは脆弱性が指摘されていて、

 同じハッシュ値になる異なったデータを簡単に解析されてしまうようです。。。

 

何かダラダラとなってしまいましたが、どうでしょうか?

長いからわかりにくですね。

 

あと、間違いなんかもあったら指摘してくださいw

意外と自分では気付いてない部分もあったりするので・・・w 

 

次回からは1つの記事をもっと短くして記事を小分けして書こうと思います。

[ 1 ]      1件中 1-1件