ハッシュ関数について

前回の記事にハッシュ関数のことを説明なしに書いたので今回はその説明のつもり。

ハッシュ関数とはあるデータから一定の長さのハッシュ値を生成する関数のこと。データの内容が少しでも違えばまったく異なるハッシュ値が生成されます。元データがどんなに短くても・長くても生成されるハッシュ値は一定である為、異なるデータから同じハッシュ値が生成されることもあり、これを『衝突』などと呼ばれています。

衝突が発生する=ハッシュ値から元データを復元することは無理

ハッシュ値から元データを復元することは、どのハッシュアルゴリズムを使っているか知っていても難しい。個人的にやろうとしたことがありますが途中で断念した覚えがあります。

同じデータからは同じハッシュ値が生成される



これだけ分かっていれば、ディジタル署名などにハッシュ値が使われる理由が分かります。
例にメールの改ざん
送信者          受信者
平文のメール-------------------->平文のメール

途中でメール内容の改ざんが行われた場合、受信者が確認する術はありません。そこでディジタル署名が使われます。平文メールを暗号化鍵で暗号化し、それを受信者に送ります。受け取った受信者は復号鍵で復号し、届いた平文メールと復号したデータと比べます。
送信者          受信者
平文のメール-------------------->平文のメール
ディジタル署名----------------->ディジタル署名

平文のメールデータから一定の長さのハッシュ値を生成し、そのハッシュ値を暗号化します。それを受信者に送ることで、途中別の人に復号されても得られるのはハッシュ値のみで平文のメールは分からないということになります。

受信者は届いた平文のメールデータからハッシュ値を生成し、復号鍵で復号したハッシュ値と比べます。異なる場合、メールのデータが改ざんが行われたことになります。気づかれないようにするためには両方を改ざんしないと駄目ですが、ここでハッシュ値の数学的に不可逆であることが効いてきます。


有名どころのハッシュ関数

MD5
RSAが開発したハッシュ関数。任意の長さの平文から128bitのハッシュ値を生成できる。

SHA-1
NISTが開発したハッシュ関数。任意の長さの平文から160bitのハッシュ値を生成できる。

■SHA-2
NISTが開発したSHA-1が元のハッシュ関数。任意の長さの平文から224bit(SHA-224),256bit(SHA-256),384bit(SHA-384),512bit(SHA-512)のハッシュ値を生成できる。


ターミナルでMD5ハッシュ値確認してみる

3種類のファイルを用意します
[ファイル名] : [内容]
■1234.a : test test
■aaaa.a : test
■abcd.a : test

MacBookAir:Desktop ****$ cat 1234.a 
test test
MacBookAir:Desktop ****$ cat aaaa.a
test
MacBookAir:Desktop ****$ cat abcd.a
test
コマンドの確認しておきます
Mac
md5 ファイル名
Linux
md5sum ファイル名
MacBookAir:Desktop ****$ md5 *.a
MD5 (1234.a) = 71f74d0894d9ce89e22c678f0d8778b2
MD5 (aaaa.a) = d8e8fca2dc0f896fd7cb4cb0031ba249
MD5 (abcd.a) = d8e8fca2dc0f896fd7cb4cb0031ba249
出力されるハッシュ値にファイル名は関係ありません。データの内容によってのみ値が変化します。ファイル名[aaaa.a]と[abcd.a]はデータの内容が同じな為、ハッシュ値は同じ値が返っています。逆に、ファイル名[1234.a]と[aaaa.a]はデータの内容が異なる為、当然ハッシュ値は異なります。
MD5は128bit,32桁のハッシュ値を生成します。