【ビットコイン】ハッシュ関数(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 より短いハッシュ値が得られることが確認できました。

参考書籍

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

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

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

関連記事

【イーサリアム】 公開鍵暗号について調べてみた。

仮想通貨の1つであるイーサリアムでは、公開鍵暗号という技術が使われています。 公開鍵暗

記事を読む

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

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

記事を読む

【イーサリアム】日本円のチャートで比較する方法【イーサリアム・クラシック】

イーサリアム(Ethereum)は、2020年時点で、時価総額がビットコインに次ぐ第2位の仮

記事を読む

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

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

記事を読む

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

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

記事を読む

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

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

記事を読む

【イーサリアム】 ハッシュ関数(Keccak-256)について調べてみた。

仮想通貨の1つであるイーサリアムで用いられているハッシュ関数「Keccak-256」について

記事を読む

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

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

記事を読む

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

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

記事を読む

【Solidity】 イーサリアムでコントラクトを生成してみた。

スマートコントラクトプログラミングの高級言語の1つである Solidity を使って、イーサ

記事を読む

【MT4】日付と時間を指定してPCを自動起動させる方法【DELL】

今回は、日付と時間を指定してPCを自動的に起動させる方法について紹介し

【MT4】PCが再起動しても自動的に起動させる方法【FX自動売買】

今回は、FX 自動売買用のツールの MT4 で、実行しているPCが再起

【MT4】複数口座を同時に起動させる方法【FX・CFD】

今回は、MT4(メタトレーダー4)で複数口座を同時にログインし、起動さ

【MQL4】スプレッドを取得する方法【MT4】

今回は、MQL4 で対象通貨ペアのスプレッドを取得する方法について紹介

【楽天CFD】取引口座を開設してみた【MT4】

今回は、楽天CFDの取引口座(本番口座)の開設方法について紹介します。

→もっと見る

PAGE TOP ↑