「暗号化」と「ハッシュ」

「暗号化」と「ハッシュ」について、よく混同されていると思う。

ここで、一度定義を整理してみる。

ハッシュ・・・あるデータが与えられた場合にそのデータを代表する数値を得る操作
暗号化・・・第3者に内容を知られないように行う方法のうち、特別な知識なしでは読めないように変換する表記法

「ハッシュ」は「暗号化みたいなもの」という説明をよく聞くが、正確には異なる。
確かに、元々の意味や実体を一見してわかりづらくするという観点から言えば、
「ハッシュ」も暗号化の一部として捉えることもできなくない。
しかしながら、ハッシュとは本来「秘匿」を目的にしたものではない。
あるデータを端的に表すために行う特殊な計算で、概念としてはチェックサムとかチェックディジットとか
と同様なものだ。セキュリティの世界ではよく改ざんの検知に使用される。

このハッシュ化するアルゴリズムの代表的なものとして「MD5」と「SHA1」がある。
「aaa」という文字列をMD5変換すると、「47bce5c74f589f4867dbd57e9ca9f808」となり、
SHA1変換すると「7e240de74fb1ed08fa08d38063f6a6a91462a815」となる。
そして、ポイントはハッシュは「不可逆」であるということ。
上記、「47bce5c74f589f4867dbd57e9ca9f808」から「aaa」を導くことは不可能なのだ。

暗号化は「第3者に内容を知られないようにする方法」である。
つまり、第3者以外、通信する本人と相手方は内容を知る必要がある(当然といえば当然だが)。
ハッシュは不可逆であるが故に、相手方すら内容がわからない。
「47bce5c74f589f4867dbd57e9ca9f808」を受け取っても、それから「aaa」を導くことが
不可能なため、秘匿通信という要件を満たさない。よって、これは暗号化とは呼べない。

よくMD5は脆弱だ。解読可能だ。という話が出ているが、
これも「47bce5c74f589f4867dbd57e9ca9f808」から直接なんらかの計算で「aaa」を
導くわけではなく、大量のサンプリングを得た結果から導くものだ。

通信するお互い(だけ)が内容を知る必要があるため、暗号は「可逆」だ。
それを可能にするのが「鍵」である。
平文を「鍵」を使用して特殊な計算をして暗号化する。
受け取った側はまた「鍵」を用いて暗号文を、これまた特殊な計算で平文にする。
この「鍵」は、送受信側で共通のものであったり、異なったものであったりする。

暗号化には必ず「鍵」が必要になる。
内容を秘匿するために「パスワードつきZIP」をかけて、メール送信することはよくある。
これも暗号化に他ならない。パスワードが「鍵」になるわけだ。
ハードディスクの暗号化もパスワード(鍵)を必ず必要とする。

古典的な暗号化の方法として、アルファベットを1文字ずらすなんていう方法もある。
あらかじめ、送信者と受信者でその約束を共有しておく。

「abc」という内容を相手方に知らせるために「bcd」と送る。
相手方は1文字ずらしているということを知っているので、「abc」という内容
だということがわかる。
この場合、「一文字ずらず」という約束事が「鍵」になるわけだ。

当然、この程度のアルゴリズム(とまでは言えないが)であれば、
暗号文を見ただけで、あっという間に解読されてしまうだろうが、
現在使われている暗号化も原則は変わらない。

当人しか知り得ないものがあって、初めて暗号化が成立する。

アルゴリズムがいくら強力であっても、その「当人しか知りえないもの」が漏洩
してしまっては、基も子もない。

巷にはさまざまな暗号化ソリューションがあふれているが、
どんな優秀な製品を導入しようとも、この「鍵」管理を怠ってしまっては、
まったく意味のないものになってしまう。

ハッシュと暗号化の違いも含めて、一見難しそうだと敬遠しがちな部分だと思う。
これは、MD5だの、SHAだの、RSAだの、SSLだの、ビット長だのとアルゴリズム
方にフォーカスがいきがちだからだと思われる。
しかしながら、原理・原則は単純なものなので、しっかりと把握したい。