PocketWPは、暗号資産(暗号通貨/仮想通貨)の情報を
整理・ストックするサービスです(β)
暗号学的ハッシュ関数(Cryptographic Hash Function)
edit 編集

暗号学的ハッシュ関数(別名: 一方向ハッシュ関数)は、入力(メッセージ)に暗号学的処理をかけることにより、固定長の別文字列(ハッシュ値)を生成する技術である。

暗号学的ハッシュ関数は、メッセージ(入力値)に暗号学的処理をかけることで、固定長のサイズの文字列(出力値)に変換する技術。「入力値が同じであれば、出力は必ず同じである」という特徴や、「出力から入力は求めることができない」といった特徴を持つ。一般にはメッセージに対して改ざんが行われていないかの正真性に利用される。ブロックチェーンでは、マイニングや、トランザクションの要約にも応用されている。


暗号学的ハッシュ関数(cryptographic hash function)には、様々な他の呼び名がある。一方向ハッシュ関数(one-way hash function)メッセージダイジェスト関数(message digest function)メッセージ要約関数暗号的ハッシュ関数とも呼ばれる。

本記事では「暗号学的ハッシュ関数」というワードで統一し、下記にその理解の補助となる解説を記述していく。

1. 暗号学的ハッシュ関数を簡単に理解する

暗号学的ハッシュ関数を図解でまずは理解。

暗号学的ハッシュ関数は一言で「入力した文字列を、暗号学的な手法によって、固定長(同じ長さの)文字列に変換する技術」であると言える。

● 1つの「入力」と1つの「出力」を持つ。
●「入力」はメッセージ(message)と呼ばれる。
●「出力」はハッシュ値(hash value)と呼ばれる。

入力した「文字列」と記載しているが、これは人間が読める文字だけを指しているのではなく、入力音声ファイルでも画像ファイルでも構わない。(マシンの中では、画像も音声も、結局これらは容量の大きい文字列なのが実態)

「入力した文字列が、全く別な固定長の文字列に変換される」というのが暗号学的ハッシュ関数だとまず理解する。そして、暗号学的ハッシュ関数は、以下のような特徴を持っていることも合わせて理解しよう。

特徴①:メッセージの長さは任意だが、ハッシュ値は固定長(一定の長さ)であるという事。

メッセージの長さは任意だが、暗号学的ハッシュ関数に通したハッシュの長さは常に一定の長さになることが大きな特徴。

上記の図は「gorilla」「gorillagorilla」「gorillagorillagorilla」という三つの文字列を、SHA256と呼ばれるハッシュ関数のアルゴリズムに通した場合の実際の出力結果だ。すべての文字列は、SHA256で定められる64文字で収まっている。

なお、今回はSHA256と呼ばれるアルゴリズムで変換を行なったが、アルゴリズムによって出力されるハッシュ値の長さは異なってくる。

特徴②:メッセージが異なれば、ハッシュ値は異なる。

入力されるメッセージが異なれば、出力されるハッシュ値は、全く異なった文字列になることも特徴だ。

上記の例では「gorilla」と「gorillA」と一文字だけ異なった文字列をSHA256というハッシュ関数に通した場合の出力結果の実例だ。

出力結果が、どの部分とっても似つかない、全く異なる文字列になっている。

特徴③:一方向性を持つ。

暗号学的ハッシュ関数は一方向性(one-way)という特徴がある。入力から出力は導き出されるが、アルゴリズム的に逆を導き出そうとすることはできない、という特徴を持つ。

上記の例はとある文字列を出力した結果である。ハッシュ値を元に、メッセージを割り出すことができないというのが暗号学的ハッシュ関数の特徴であると言える。逆にそれを満たさないもの、暗号学的ハッシュ関数の逆算をアルゴリズム的にできてしまうものは暗号学的ハッシュ関数の条件を満たさないものである、とも言える。

(ちなみに上記の図の「???」に該当する文字列は「GORILLA」。SHA256で出力したもの。)

特徴④:高速に出力される。

アルゴリズムが暗号学的ハッシュ関数を名乗れる条件として、入力から出力が高速でなければならないという決まり事がある。

メッセージが長くなれば長くなるほど、処理時間は長くなるが、現実的な時間内に収める必要がある。

利用者側の視点から暗号学的ハッシュ関数をみた場合、暗号学的ハッシュ関数の変換は高速で行われるものである、という点だけ理解すれば問題ない。

暗号学的ハッシュ関数 概念理解 | まとめ

上記4つの特徴と、暗号学的ハッシュ関数についてのまとめを記述した。再度下記にまとめを記す。

  • 暗号学的ハッシュ関数を一言で言うと:
    入力した文字列を、暗号学的な手法によって、固定長(同じ長さの)文字列に変換する技術
  • 暗号学的ハッシュ関数 特徴①:
    メッセージの長さは任意だが、ハッシュ値は固定長(一定の長さ)であるという事。
  • 暗号学的ハッシュ関数 特徴②:
    メッセージ(入力)が異なれば、ハッシュ値(出力)は異なる。
  • 暗号学的ハッシュ関数 特徴③:
    一方向性を持つ。ハッシュ値(出力)から入力はできない。
  • 暗号学的ハッシュ関数 特徴④:
    入力がいくら大きくとも、ハッシュ値(出力)を導き出す時間は高速である。(アルゴリズムの条件としてそうでなくてはいけない)

2. ハッシュ関数は何に使われるのか?

暗号学的ハッシュ関数はデジタルデータの「指紋」として利用される

上記にて「ハッシュ関数はメッセージ(入力)が異なればハッシュ値(出力)が異なる(特徴②)」という特徴を持つことを説明した。

この技術は何に使われるのか?わかりやすい例をあげると、ファイルの改ざんがなされていないかの確認に、暗号学的ハッシュ関数が使われる。

ファイルは文章だけに限らず、動画でも可能だ。暗号学的ハッシュ関数にて生成されるハッシュ値は、いわば、デジタルデータの「指紋」なのである

例えばのファイル書き換えストーリー...

例えば、明日重要なプレゼンがあるとしよう。今日上長や役員クラスの確認を終えて、オフィスのデスクトップに明日のプレゼン資料を保存したとする。プレゼン先のクライアントを獲得すれば、会社は大きな利益を得ることができる。大事な資料だ。

だが、デスクトップに保存した、今日のファイルと明日のファイルが同じであるという保証はない。あなたの地位を奪おうとする同僚があなたのミスを演出するために、あなたのパソコンにログインして、提案先のクライアントが訝しく思うような内容を資料の一部にねじ込むかもしれない。だが資料の量は300ページにも及び、もう一度確認を行うには、膨大な時間がかかる。面倒な上長への確認は先ほど済ませたばかりでもう確認プロセスを走らせるなんて無理な話だ!...無理やりだがこんなシチュエーションがあったとしよう。(半沢直樹の政敵なら、絶対こんなことを考えるはずだからなくはない。)

こんな時、ファイルのコピーをどこか見つからないところに保存しておき、ハッシュ関数にかけ、ハッシュ値をメモしておく。そして、翌日、プレゼンを直前に控え、細々とした資料の体裁の調整を入れる前に、パソコンに保存されていた資料のハッシュ値を出力し、パソコン内部の資料が昨日の作業のものと違いがないかを確認する。

違いがあった場合は、退避していたファイルから作業を再開すればいいだろう。(半沢直樹的には政敵による攻撃が発動した証拠であるから、プレゼンの後に監視カメラなどなどの証拠を突きつけて、政敵をパージする、一矢報いる格好のチャンスだ!)

ソフトウェアにウイルスが混入していないかにも。

これは例のために無理やり考えたストーリーであるが、もっと実感がつかめる例としては、ソフトウェアへのウイルス混入の監査などにも、暗号学的ハッシュ関数は使える。ウイルスチェック済みの状況においてハッシュ値をかけておき、一般に公開しておく。ミラーサイトでの配布を許可している場合は、それらのハッシュ値を比較することで改ざんがないかを確認する、といった事例だ。

(特にDAppsなどでは今後そう言ったことはありうる。オープンソースではあるが、バイナリデータを後からインストールするタイプのDAppsだった場合、自分のウォレットなどを容易に閲覧されてしまう可能性などはありうる。)

以下、他の具体的な、いくつかの事例を説明していく。

実例①:ワンタイムパスワード

ワンパスワードは、アクセス元のマシンが正当なものであるかどうかを確認するために使われる。通信経路や様々な状況を入力値にとって、一回限りしか生成されないハッシュを作り、それを一回限りしか利用されないパスワードとして提供する。

実例②:認証コード

「送信者と受信者だけが共有している鍵(パスフレーズ)」があったとしよう。その鍵の中にメッセージを混ぜ合わせて、その出力された結果が一致しているかを確認する。これによって、なりすましによる不正なアクセスではないかどうかを確認するといった事ができる。これはSSLTLSにて利用されている。

実例③:デジタル署名

これは元の文章の送信元が、同じ人物なのかを確認するために使われる。送信する側と開封する側がお互いにペアとなる鍵を持つ(一般に 公開鍵と秘密鍵。ここでは説明を省略)。

まず、①送信する文章をハッシュ値に変換する。そしてそれを送信者の鍵で暗号化する。これによって②鍵によって暗号化されたハッシュ値を生成する。受け取り元はその②鍵によって暗号化されたハッシュ値を、送信者の鍵のペアとなる鍵で解錠する、これを③鍵で複合したハッシュ値と呼ぼう。

仮に①=③となりハッシュ値が一致していれば、受信者は送信者を、自分の持つ鍵とペアとなる鍵を所有する者であると認識し、想定した人物からの受信であることを確認する。そうでなければ、不正なアクセスとみなす。

図として簡単に示すと、下記のような流れとなる。

実例④:擬似乱数生成

入力値によって、出力値は異なるという特徴から、擬似的な乱数生成にも用いられる。例えばタイムスタンプ(要はコンピュータ内部の時間)を入力値の一つに用いると、これを乱数として利用することができる。

なお、擬似乱数には「過去の乱数列から未来の乱数列を予測することは事実上不可能」という性質が必要になる。暗号学的ハッシュ関数の一方向性はその条件に当てはまるため、それを利用し擬似乱数として用いられている。

3. ブロックチェーンでのハッシュ関数の利用

ブロックチェーンのどこにハッシュ値は使われているか

ブロックチェーンでは、実に様々な場所でこのハッシュ値は利用されている。すべて挙げるとキリがないが、代表的なものとしては下記がある。

  • トランザクションを特定するためのアドレス
    トランザクションとは、AさんからBさんにXBTCを送信する、といった送金の流れを記述したデータ。ブロックチェーンを構成する重要単位。トランザクションはタイムスタンプをはじめ、送信元のアドレス、受信先アドレス、送金額などの様々な情報を含む。これらをメッセージの入力値に取り、一意に特定できるアドレスとして機能させている。
  • ブロックハッシュ
    ブロックとは、いくつかのトランザクションをひとまとめにしたものである。ブロックを特定する際に、ブロック内部のトランザクションや、タイムスタンプを入力値にとり、暗号学的ハッシュ関数で一意になる文字列を生成する。これはブロック自体を特定する機能も担っている。
  • ビットコインアドレス
    ビットコインの送金元/受信先アドレスにも暗号学的ハッシュ関数は絡んでいる。ビットコインアドレスといえば小難しい文字列が特徴的であるが、その生成に際して、暗号学的ハッシュ関数が利用されている。

なお、これらは暗号学的ハッシュ"のみ"を利用して生成されているものではないことに留意したい。あくまで生成における使用アルゴリズムの一つとして暗号学的ハッシュ関数は利用される。

マイニング(PoW) - 暗号学的ハッシュ関数の特性を逆手にとった技術

マイニング、これは仮想通貨・暗号通貨、そしてブロックチェーンで有名な技術。マイニングにもいくつか種類があるが、その中の一つであるPoW(Proof Of Works | プルーフオブワークス)はこの暗号学的ハッシュ関数の特性を逆手に取った仕組みになっている。

暗号学的ハッシュ関数は一方向性を持つ、ということを上記にて説明した。ここに、もう一度図を再掲する。

説明したように、本来、暗号学的ハッシュ関数では、出力値から入力値を逆算しようとしてもできない、という特性を持つ。

だが、Proof Of Worksでは、逆算をする。この暗号学的ハッシュ関数の特性を逆手に取って、暗号学的ハッシュ関数の逆算をさせることによって実現する。力技で。世界中のマシンに、元となる文字列を一つ一つ入れさせることによって、力技で、その元の文字列を見つけさせている。Proof Of Worksにおけるマイニングとは、任意のハッシュ値に当てはまる、元となる文字列を見つけ出すというものだ。

つまり、「全てのパターン」を暗号学的ハッシュ関数にかけて出力値に当てはまる入力値を見つけるというわけだ。

だが想像してほしい、それは無理そうな話なのだ。少なくとも出力値である、暗号学的ハッシュ関数のアルゴリズムの一つであるSHA256の場合、出力されるハッシュ値の組み合わせ総数は2^256+1(2の256乗+1)となり宇宙にある原子の数に匹敵すると言われている。またそれを導き引き出すような入力値はそれこそ無限大だ。

ビットコインのブロック生成速度である10分程度の短時間において、宇宙の中から一つの原子を見つけ出すのは到底不可能な話だ。

では、どうやってマイニングを実現しているのか。Proof Of Worksにおけるマイニング、ハッシュの逆算的行為においては、ハッシュ値とその元となる文章の完全なる一致は求めていない。あくまでハッシュの出力結果をこの値以下に収めてね、という条件だけを求めているのだ。

上図のように、Proof Of Worksがマイナーに求める出力結果は、完全一致ではなく、あくまで、特定の条件化に収まるようなハッシュ値を出力せよ、といった内容になっている。

なおマイニングの元となる文字列は、ブロック内部のトランザクションを要約した値や、前のブロックのハッシュ値などにプラスしたものとなっている。

Proof Of Worksやマイニングについてそもそも何か?という事についてはまた別途ページを切り分けて説明する。

【用語集】Proof of Work - PoW (プルーフオブワーク)

まとめ

なおブロックチェーンや暗号通貨では、この暗号学的なアルゴリズムを応用したものがそこかしこに出てくる。今回本記事で取り上げた内容は、そのなかでもある程度有名な概念の簡単な概説にしか過ぎない。ここでは、暗号学的ハッシュ関数がブロックチェーンの至る所で使用されている、という知識だけお持ち帰りできれば、と思っている。

4. 暗号学的ハッシュ関数の種類

暗号学的ハッシュ関数には様々なアルゴリズムが存在する。以下に代表的なアルゴリズムを列挙する。

MD4, MD5

MD4はRonald Linn Rivestが開発した一方向ハッシュ関数。ハッシュ値は128ビットで出力されるが、脆弱性が発見されており使われていない。

MD5も同様にRonald Linn Rivestに開発されたもの。だが、こちらは強衝突耐性がすでに打ち破られている。強衝突耐性とは、同じハッシュ値をもつ2つのメッセージを作り出すことへの耐性をさす。容易に別なメッセージ(入力)を使い、同じハッシュ値を生成できてしまう。

MD4, MD5ともに現在は非推奨の古い技術であるが、のちに続くSHA-2や、RIPEMDに影響を与えたと言われる。

SHA-1, SHA-2(SHA-256, SHA-384, SHA-512)

SHA」とはアメリカの連邦情報処理標準規格(FIPS PUB 180)として発表されたものの冒頭につく名称。

SHA-1は、1993年にNIST(National Institute of Standards and Technology | アメリカ国立標準技術研究所)で作られた160ビットのハッシュ値を出力する、ハッシュ関数。なおSHA-1の強衝突耐性は2005年時点ですでに予測されており、また理論上の概念に過ぎなかったその強衝突耐性の突破をグーグルとオランダのチームが実際に実現した。

現在は多く利用されているのはSHA-2と呼ばれる同じくNISTで作成されたハッシュ関数。SHA-256, SHA-384, SHA-512など合計六種類をまとめて、SHA-2と呼ぶ

SHA-2は2018年現在、強衝突耐性が破られておらず、多くのシステムで使われている。ブロックチェーンの例で言えば、ビットコインのアドレス生成をはじめ様々な場面で使われている。

【6種類のSHA-2】
  • ❶ SHA-256
    ハッシュ値の情報量は256bit。
  • ❷ SHA-224 (SHA-256をベースに32bit切り捨て)
    ハッシュ値の情報量は224bit。SHA-256をベースに出力されて、32bitを切り捨てる
  • ❸ SHA-512 
    ハッシュ値の情報量は512bit。
  • ❹ SHA-512/224  (SHA-512をベースに288bit切り捨て)
    ハッシュ値の情報量は224bit。SHA-512をベースに出力され、288bitを切り捨てる
  • ❺ SHA-512/256  (SHA-512をベースに256bit切り捨て)
    ハッシュ値の情報量は256bit。SHA-512をベースに出力され、256bitを切り捨てる
  • ❻SHA-384  (SHA-512をベースに128bit切り捨て)
    ハッシュ値の情報量は256bit。SHA-512をベースに出力され、128bitを切り捨てる

SHA-2は6つあるものの、ベースとなっているのは❶SHA-256❸SHA-512の二つのみで、他はそれをベースにbitを切り捨てる形でハッシュ値を作る。

なおSHA-2はビットコインのアドレス生成の一部において使用されている。

RIPEMD-160

RIPEMD-160(ライプMD160)は、160ビットのハッシュ値を出力する。

RIPEMDは、European Union RIPE Projectで作られたもので、RIPEMD-160はその改訂版となる。RIPEMD自体は強衝突耐性が2004年の時点で破られているが、RIPEMD-160は破られていない。

ただし、Cryptec暗号リストの運用監視暗号リストにRYPEMD-160は入っているため、互換性維持以外の目的での利用は推奨されていない。

なおビットコインのアドレス生成の一部において、RIPEMD-160は使用されている。

SHA-3 - KECCAK(ケチャック)

SHA-1の強衝突耐性は2005年時点で破られていた ことを受け、NISTが2007年に新しい暗号学的ハッシュ関数のコンペを行った。2012年にこの選定は終了し、KECCAKとよばれるアルゴリズムが採用され、SHA-3となった。名前こそSHAであるが、こうした公募の背景もあり、内部構造的にはこれまでのSHAシリーズとは異なる。

スポンジ構造、ディプレクス構造など独特のアルゴリズムを持つ。

5. まとめ

暗号学的ハッシュ関数は、「入力した文字列を、暗号学的な手法によって、固定長(同じ長さの)文字列に変換する技術」であり、大きく4つの特徴を持つ。

その一つである「ハッシュ関数はメッセージ(入力)が異なればハッシュ値(出力)が異なる」という特徴を生かし、デジタル署名技術などは我々の日常で使われている。

またブロックチェーンでは、トランザクションのアドレス、ブロックハッシュ、ビットコインアドレスをはじめ数え切れないほど様々な場面で暗号学的ハッシュ関数は使用されており、特にマイニングで有名なProof of Works(プルーフオブワークス)というコンセンサスアルゴリズムでは、ハッシュ関数の特性である一方向性を逆手にとったアプローチが取られている。

暗号学的ハッシュ関数には様々な種類があるが、強衝突耐性が打ち破られてしまっているものもいくつかあり、MD4, MD5, RIPEMDといったものは現在利用が推奨されていない。SHA-2が最もメジャーに使用されている。

#PocketWP 一覧

#ゴリ学習メモ 一覧

PocketWPについて

暗号資産(暗号通貨, 仮想通貨)やブロックチェーンは理解が難しく、また一次情報の多くはPCに最適化されている状況にあります。PocketWPでは、下記の3点のアプローチによってその問題を解決しようとしています。
  • ・SmartPhoneFirst - スマホで最適化したスライド/UI
  • ・Stockable - 流れてしまいがちな情報を蓄積し、共有できる
  • ・Followable - 追いかけるべき情報源がわかる
将来的には共同で編集できる仕組みなども設計中です。 暗号資産・暗号通貨の価値を広げるには、良質な情報を読みやすく噛み砕くことが必要だと思っています。 よろしければご意見をこちらからお寄せください (お問い合わせフォーム)
運営者情報① : IXTgorilla
IXTゴリラ
@IXTgorilla
Twitterにて #PocketWP #ゴリ学習メモ なるスマホに最適化した暗号資産の学習情報をスライド形式にて発信しているゴリラ。 これまではTwitterのみの発信を行なっていましたが、蓄積される場所が欲しいという声にお答えし、Web化を行なってみました。
運営者情報② : CryptoGorillaz
暗号通貨に関する情報を共有するコミュニティ。当初はコラ画像などをつくる集団だったが、暗号通貨の魅力や将来性にほだされ、日夜暗号通貨に関する情報共有を行なっている。(IXTゴリラもここに所属しています)

寄付/投げ銭はこちら

  • Ethereum(ETH) / ERC20トークンでの投げ銭
    0x77535cb08CF5Ba3B85A34A3B037766103226c783