世紀末の墓

お気持ち.log

IT系寄りの雑記

暗号化とハッシュ化の違い

はじめに

このツイートにそれなりに反応がありました。 でも誤記やいくつか指摘もあったので、しっかりまとめようと思った次第です。
しかし、ただまとめるだけではあれなので、レインボーテーブルやsalt等の話も少しします。

ちなみに、暗号化もハッシュ化もなされていない元の文を平文と呼びます。

暗号化

概要

デジタル大辞泉の解説
あんごう‐か〔アンガウクワ〕【暗号化】
《encryption》文章や電子データの情報を一定の規則に従って組み替え、通信途中に第三者に利用されないようにすること。受信者は暗号化された情報に逆の手続きを施して解読する。エンクリプション。→暗号 →復号 →共通鍵暗号 →公開鍵暗号

つまり、情報を他の人に知られないように隠す操作のこと。
平文を暗号化したものを暗号文と呼ぶ。

用途

主に、通信の盗聴対策や、情報の漏洩対策に使われる。
暗号化していないと、第三者に盗聴された場合、メールの中身を見られたりWebサイトとのやりとりを見られてしまう可能性がある。

可逆的

暗号化は第三者から知られないようにするためのものなので、メールなら受信側は正しく読めなければならない。
そこで、暗号文は復号して元の平文にすることができる。
この復号は暗号化の逆の操作になるため、暗号化は可逆的であるといえる。

代表的な暗号

  • シーザー暗号/カエサル暗号(Caesar cipher):アルファベット等を辞書順で任意文字数分シフトするというもの
  • RSA暗号:大きい桁の合成数の素因数分解が難しいことを利用した公開鍵暗号
  • AES:指定された操作を鍵長に対応した回数分行う 共通鍵暗号

ハッシュ化

概要

ハッシュ関数という特定のアルゴリズムを用いて、平文をハッシュ値に置き換える操作のこと。 平文が同じであれば同じハッシュ値になり、平文が異なれば基本的にハッシュ値も異なる(衝突する場合もある)。

用途

主に、パスワードの保存や改ざん対策に用いられる。
パスワードは平文がわからなくても、ハッシュ値が同じであれば認証できる。
改ざん対策では、まず「平文」と「暗号化されたハッシュ値」をセットで送る。 ここのハッシュ値は「平文」をハッシュ化したものだ。 受信側は、まず「平文」をハッシュ化する。これをハッシュ値Aとする。
そして「暗号化されたハッシュ値」を復号する。これをハッシュ値Bとする。
ハッシュ値Aとハッシュ値Bが同値であれば、改ざんはされていないと証明できる。

非可逆(不可逆)的

ハッシュ値は暗号文のように復号して平文にすることはできない。
逆の操作が不可能なので非可逆(不可逆)的だといえる。

レインボーテーブルと対策

平文とハッシュ値は1対1で対応しているが、それを逆手に取ったレインボーテーブルというものがある。 これは、予め平文とハッシュ値の対応表を作っておいて、実質的にハッシュ値から平文に復号できるというもの。 f:id:silmin:20190131041956p:plain それに、ある程度の文字数までなら全パターン網羅することが可能。

これは、saltというランダム文字列を前後に付加してハッシュ化したり、複数(数千~数万)回ハッシュ化したりすることで、平文を予測しづらくすることができる。 また、ハッシュ値を付加して更にハッシュ化するような手法もある。