🔐

世界一やさしい暗号化とハッシュ化の話

2024/03/14に公開

タイトル盛りすぎましたごめんなさい。

この記事は、初学者が混同しやすい暗号化とハッシュ化について、できる限り平易に説明し、基本概念や用途について理解してもらうことを目的としています。

暗号化

暗号化とは

例として、下記の文章を暗号化する方法を考えます。

I L O V E Y O U

アルファベット順に3文字ずつ進めてみましょう(Zの次はAに戻ります)。

I L O V E Y O U
↓ 3文字ずつ進める
L O R Y H B R X

これで、一見すると意味が読み取れなくなりました。

もちろん、アルファベット順に3文字ずつ戻せば、解読することができます。

L O R Y H B R X
↓ 3文字ずつ戻す
I L O V E Y O U

これが、最も原始的な 「暗号化」 です。
暗号を解読することを 「復号化」 といいます。

この例では、「アルファベット順に N 文字ずつ進める」という手順が暗号化の 「アルゴリズム」 にあたり、
「N=3」 が 「暗号鍵」 にあたります。

暗号化の性質

暗号化の特徴は、 「アルゴリズムと鍵を知っていれば、解読(復号)できる」 という点です。
あたりまえのことのように思えるかも知れませんが、これが、後述するハッシュ化との大きな違いになってきます。

上記のような単純なアルゴリズムであれば、鍵を知らずとも解読できそうですが、
実際には、鍵なしでは復号が困難な、複雑なアルゴリズムが用いられます。

ハッシュ化

ハッシュ化とは

また例として、下記の文章を、擬似的な方法でハッシュ化してみます。

I L O V E Y O U

まず、文字を数字に置き換えます(Aを1、Bを2・・・Zを26とします)。

9 12 15 22 5 25 15 21

次に、隣り合う2つの数字を足し合わせます。26を超えた場合は、26を引きます。

21 11 4 10

これを、最初と逆の方法で、文字に置き換えます。

U K D J

一見して意味が読み取れない文字列になった、という点では先ほどと同じです。

ただ、先程と違い、 加工した手順を知っていても、もとに戻せない ことにお気づきでしょうか。

この例では、隣り合う2つの数字を足し合わせる、という工程が入っているため、元の文章を特定することが困難になっています。

この例では、「数字に置き換え、2つずつ足し合わせて、文字に戻す」が(擬似的な)ハッシュの 「アルゴリズム」 にあたります。

ハッシュ化の性質

前述の通り、手順(アルゴリズム)がわかっていても復元できないことが大きな特徴です。

ただし、ランダムに置換する場合と異なり、元の値が同じであれば、何度変換しても同じ結果になる ことも重要な性質です。

上記の簡易アルゴリズムの場合、元の文字列が違っても、偶然同じ結果になることがありそうですが、
実際のアルゴリズムでは、元の値が違えば必ず別の値になる(同じ結果になる確率が無視できるほど低い)ようにできています。

また、上記のアルゴリズムでは再現できていませんが、
元の文字列がどんなに長くても、結果は一定の文字数になる、という性質があります。
どれだけ大きなファイル(例えば動画やPDFファイル)でさえ、ハッシュ化すれば数十文字の文字列になります。

暗号化とハッシュ化の用途

暗号化の用途

暗号化の主な用途は、盗聴(傍受)の防止です。

例えばメールを送る際、内容を暗号化して送れば、通信を傍受されたとしても、内容を知られることはありません。

メールの受け取り手は、内容を読める必要があるので、鍵さえあれば元に戻すことができる「暗号化」が用いられます。

昨今では、メールに限らずあらゆる通信が暗号化されています。

ハッシュ化の用途

パスワードの保存

アプリケーション開発に関わる人であれば、最もハッシュをよく目にするのはパスワードの保存ではないでしょうか。

「手順(アルゴリズム)がわかっていても復元できない」という性質ため、
悪意のある人間がデータベースを覗き見たり、盗み出したりしても、その情報だけではログインを成功させることができません。

一方、「元の値が同じであれば、何度変換しても同じ結果になる」という性質により、
ユーザが入力したパスワードを再度ハッシュ化して照合すれば、入力したパスワードが正しいかどうかは判定することができます。

改ざんの防止

ハッシュ化のもうひとつの重要な用途は、改ざんの防止です。

先程のメッセージをICカードに書き込む場合を考えてみましょう。
このとき、メッセージ本文とともに、ハッシュを入れておきます。

I L O V E Y O U [ハッシュ] U K D J

ICカードのデータは書き換えが容易なので、悪意のある誰かがこれを改ざんしてしまうかも知れません。

I H A T E Y O U [ハッシュ] F A K E

しかし、ハッシュの手順が不明であれば、改ざん後のメッセージに対して、正しいハッシュを作ることができません。

そのため、本文を再度ハッシュ化してみると、メッセージが改ざんされているか、いないかが判明します。

I H A T E Y O U [ハッシュ] F A K E

I H A T E Y O U
↓
9 8 1 20 5 25 15 21
↓
17 21 4 10
↓
Q U D J (ハッシュと不一致=改ざんされている!!)

ハッシュ化の性質上、改ざん前の文字列を復元することはできません
しかし、改ざんしてもすぐにバレる、ということが、改ざんに対する強い抑止力になります

署名=ハッシュ化+暗号化

前段で「ハッシュの手順が不明であれば、改ざん後のメッセージに対して、正しいハッシュを作ることができません」といいましたが、

実用的なハッシュ化の手順(アルゴリズム)は世の中に数えるほどしか無いため、
実際の改ざん防止としてはこれだけでは不十分な場合があります。

そこで、ハッシュ化したものをさらに暗号化して、これをメッセージ本文とともに保存したり、送信したりする方法があります。

I L O V E Y O U
↓ ハッシュ化
U K D J
↓ 暗号化(鍵 N=3)
X N G M

これを、一般的に 電子署名 といいます。

I L O V E Y O U [署名] X N G M

メッセージを受け取った側は、本文をハッシュ化しつつ署名を復号して、
一致すれば改ざんされていない、と判断することができます。

I L O V E Y O U [署名] X N G M

I L O V E Y O U
↓ ハッシュ化
U K D J

X N G M
↓ 複合
U K D J (一致!!)

あるいは、メッセージを書き込んだ本人であれば、再度署名を作ることで、
改ざんされていないかどうかを確認できます。

I L O V E Y O U [署名] X N G M

I L O V E Y O U
↓ ハッシュ化
U K D J
↓ 暗号化
X N G M (署名と一致!!)

暗号化にも復号化にも鍵が必要であるため、第三者は、本文を改ざんできたとしても、
正しい署名を作ることができません。

こんなまわりくどいことをしなくても、直接メッセージを暗号化したものを署名にすればよいのでは?
と思われるかも知れませんが、暗号化したデータのサイズは、元のデータのサイズに比例して大きくなり、
また、暗号化・復号化にかかるエネルギーも大きくなります。

ハッシュは、元のデータの大きさにかかわらず、一定の文字数(数十文字)となるため、
署名として非常に適しているのです。

例えば、電子契約の際には、契約書のPDFファイルを作成し、
甲乙両方が、自分自身の鍵を用いてPDFファイルから署名を作り、本体のPDFファイルと一緒に保管します。
PDFファイルは数MBあったとしても、署名はたかだか数十バイトです。

どちらか一方が契約書のPDFファイルを改ざんしようとしても、自分側の署名は作り直せますが、相手側の署名を正しく作り直すことができません。
そのため、電子データでありながら、改ざんできない(改ざんしてもすぐバレる)ものとなるのです。

さらに理解を深めるために

この記事はここまでですが、本記事の内容が掴めたという方には、さらに知ってほしいことがいくつかあります。

公開鍵暗号

メッセージを暗号化すれば盗聴(傍受)されない、というのはイメージしやすいと思いますが、
解読(複合)するためには鍵が必要です。

となると、次に「どうやって鍵を第三者に知られず相手に渡すのか?」ということが問題になります。

この問題を解決するのが、公開鍵暗号 と呼ばれる方式です。

少々複雑ですが、非常に重要な考え方ですので、ぜひ調べてみてください。

パスワードハッシュとソルト

パスワードをデータベース等に格納する際、単にハッシュ化するだけでは不十分で、
ソルトという概念が登場します。

なぜ不十分なのか、ソルトはそれをどう解決しているのか、こちらもぜひ調べてみてください。

Discussion