【ビットコイン】ハッシュ関数(SHA-256・RIPEMD-160)について調べてみた。

ビットコインなどの仮想通貨で使用されているハッシュ関数(hash function)という技術について調べてみました。

仮想通貨では、取引(トランザクション)のまとまり(ブロック)を繋いでいくこと(ブロックチェーン)によって、1つの台帳を作っていきます。

ブロックチェーンを構築していく際に、取引(トランザクション)や各ブロック間の参照を簡単に比較できるようにするため(改ざん検出・防止)、ハッシュ関数(hash function)という技術が用いられています。

ビットコインでは、いくつかあるハッシュ関数の中でも、SHA-256 と RIPEMD-160 という種類のものが使用されています。

ハッシュ関数とは?

ハッシュ関数(hash function)とは、任意長のメッセージを入力すると、そのメッセージを代表する固定長の値(ハッシュ値)を出力するような関数のことです。

固定長のハッシュ値は、コンピュータが処理しやすいような値(例えば、256 bit や 512 bit)に設定されていることが多いようです。

出力値が固定長なので、どのような長さのメッセージを入力したとしても出力サイズは一定になります。

ハッシュ関数には以下の3つの性質があります。

  1. 固定長の値を出力する
  2. 同一メッセージの入力に対しては同一のハッシュ値が出力される
  3. 入力値が大きい場合でも高速で変換できる

ハッシュ関数は、これらの特徴をもっているため、仮想通貨のブロックチェーン技術で使われています。

ハッシュ関数の安全性

ハッシュ関数の安全性として以下の3つがあります。

  1. 一方向性
  2. 第2原像計算困難性
  3. 衝突困難性

なにやらちょっと難しい言葉が並んでいますが、1つずつ簡単に説明していきます。

一方向性

一方向性(One-wayness)とは、「ハッシュ値から元のメッセージを求めることが難しい」という性質のことです。

ハッシュ関数は暗号化の技術なので、ハッシュ値から元のメッセージが簡単に求められてしまうと意味がないですよね。

第2原像計算困難性

第2原像計算困難性(Second Preimage Resistance)とは、「あるメッセージとそのハッシュ値が与えられたとき、同一のハッシュ値になる異なるメッセージを計算することが難しい」という性質のことです。

これは意味的には次の「衝突困難性」と一緒かなと思います。

衝突困難性

衝突困難性(Collision Resistance)とは、「同じハッシュ値になるような異なる2つのメッセージを求めることが難しい」という性質です。

ハッシュ値は固定長の値なので、メッセージ空間の方がハッシュ値空間より広くなります(メッセージ空間 > ハッシュ値空間)。

そのため、衝突(異なる2つのメッセージから同じハッシュ値が出力されること)は起こり得るのですが、それが簡単に求められてはまずいですよね。

SHA-256 とは?

SHA(Secure Hash Algorithm)とは、NIST によって米国基準として制定された SHS(Secure Hash Standard)アルゴリズムの総称です。

脆弱性対応などの改良がアルゴリズムに加えられ、「SHA-0」→「SHA-1」→「SHA-2」→「SHA-3」と変化していきています。

仮想通貨で使われている「SHA-256」は「SHA-2」に含まれます。

「SHA-256」は数値部分がハッシュ値のビット長を表しており、256 bit のハッシュ値を出力します。

SHA-256 ハッシュ値の具体値(Linux)

具体的に、メッセージを入力し、ハッシュ関数「SHA-256」を使って暗号化した際の出力値(ハッシュ値)を Linux のコマンドを使ってみてみたいと思います。

Linux で「sha256sum」コマンドを用いるとハッシュ値を確認できます。

7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069

ハッシュ値は、16進数で表示されています。なので、1文字が 4 bit となり、64文字出力されていることから、256ビットのハッシュ値となっていることが確認できました。

RIPEMD-160 とは?

RIPEMD(RACE Integrity Primitives Evaluation Message Digest)とは、1996年に開発されたハッシュ関数で、128 bit のハッシュ値を出力します。

RIPEMD-160 は、その 128 bit 長を 160 bit に改良したものになります。

ビットコインでは、トランザクションのアドレス生成時に使用され、公開鍵を SHA-256 でハッシュ化したものに対して、さらに RIPEMD-160 でハッシュ化する、というような使い方がされています。

RIPEMD-160 ハッシュ値の具体値(Linux)

SHA-256 と同様に Linux に RIPEMD-160 ハッシュ化するためのコマンドがあるので使ってみます。

92f8bf5be03adfafebb20bd2606e13e08874cf35

SHA-256 より短いハッシュ値が得られることが確認できました。

参考書籍

暗号化技術のすべて」という書籍を参考にしました。暗号化技術について広くまとめられており、また、最後に少しだけ ビットコインについての分かりやすい記載もありオススメです!

以上、仮想通貨で使われているハッシュ関数技術についてまとめてみました。

そのうち仮想通貨のどのような処理の中でハッシュ関数の技術が使われているかのついてもまとめてみたと思います。

関連記事

【イーサリアム】クライアントソフト geth を使ってみた。

イーサリアムのクライアントソフト geth をインストールして使ってみました。 クライ

記事を読む

【仮想通貨】トランザクションについて調べてみた【ブロックチェーン】

ビットコインなどの仮想通貨では、取引をトランザクションで記述されます。 そのトランザク

記事を読む

【イーサリアム】 ホリエモンが2014年当時にイーサリアムの可能性に気付いていた!?

ホリエモンこと堀江氏が、2014年の自身のブログで「イーサリアムやべぇ。。。」というタイトル

記事を読む

初心者でも分かるビットコインの仕組みについてまとめてみた。

ビットコインは,時価総額が1位で最も有名な仮想通貨です. 仮想通貨の時価総額の見方について

記事を読む

【仮想通貨】デジタル署名と公開鍵暗号の違いは!?

ビットコインなどの仮想通貨のブロックチェーン技術で用いられている「デジタル署名」「公開鍵暗号

記事を読む

【MetaMask】イーサリアムのウォレットを使ってみた【テスト環境】

今回、イーサリアムのウォレットの1つである MetaMask(メタマスク)を使って、テストブ

記事を読む

【仮想通貨】時価総額のランキングを円(JPY)で見る方法。

ビットコインやイーサリアムなどの仮想通貨の時価総額のランキングを 円(JPY)で見れる分かり

記事を読む

【仮想通貨】新しいトランザクション(取引)の追加方法【ブロックチェーン】

仮想通貨で用いられているブロックチェーン技術において、新しいトランザクション(取引)をどのよ

記事を読む

【ビットコイン】承認されたブロックを見てみる【ブロックチェーン】

ビットコイン(BitCoin)の公開台帳であるブロックチェーンについて、新たに承認されたブロ

記事を読む

【イーサリアム】 チューリング完全性について調べてみた。

仮想通貨の1つであるイーサリアムについて調べていると、チューリング完全性(Turing co

記事を読む

【MQL4】EAファイルを作成・実行する方法【FX自動売買】

EAファイルとは、為替の価格データが更新されるたびに繰り返し実行してく

【Excel VBA】開発タブを表示させる方法。

Excel VBAでマクロの開発を行うためには、「開発」タブを表示させ

投資信託にかかる費用について調べてみた。

投資信託を探していると「買付手数料」や「管理費用」などが記載されていた

FX収支|2021年3月|+128,508円

FXの2021年3月の収支結果報告です。 今月は、FXを

【トラリピ】スプレッドについて調べてみた【FX自動売買】

トラリピは、マネースクエアが運営しているFXの自動売買システムです。

→もっと見る

PAGE TOP ↑