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

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

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

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

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

Contents

ハッシュ関数とは?

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

参考書籍

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

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

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

関連記事

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

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

記事を読む

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

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

記事を読む

【ビットコイン】 アドレス生成方法について調べてみた。

仮想通貨の1つであるビットコインを送金するときは、送付側と受け手側のそれぞれのアドレスが必要

記事を読む

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

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

記事を読む

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

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

記事を読む

【ビットコイン】1ブロックに含まれる情報について調べてみた【マークル木】

ビットコインなどの仮想通貨では、トランザクション(取引)の束を「ブロック」という単位で扱い、

記事を読む

【仮想通貨】デジタル署名について調べてみた【ブロックチェーン】

ビットコインなどの仮想通貨のブロックチェーンで用いられているデジタル署名(Digital s

記事を読む

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

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

記事を読む

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

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

記事を読む

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

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

記事を読む

【Cubase】イヤホンから音がでないときの対処方法。

Cubase でイヤホンから音がでなくなったときの対処方法のメモです。

【Cubase】特定のトラックを無効にする方法。

今回は、Cubaseで特定のトラックのみを無効にする方法について紹介し

【転移学習】学習済みVGG16 による転移学習を行う方法【PyTorch】

今回は、PyTorch を使って、学習済みのモデル VGG16 を用い

【PyTorch】畳込みニューラルネットワークを構築する方法【CNN】

今回は、PyTorch を使って畳込みニューラルネットワーク(CNN)

【PyTorch】ニューラルネットワークを構築する方法【NN】

今回は、PyTorch を使って、ニューラルネットワーク(NN)を構築

→もっと見る

PAGE TOP ↑