【ビットコイン】ハッシュ関数(SHA-256・RIPEMD-160)について調べてみた。
ビットコインなどの仮想通貨で使用されているハッシュ関数(hash function)という技術について調べてみました。
仮想通貨では、取引(トランザクション)のまとまり(ブロック)を繋いでいくこと(ブロックチェーン)によって、1つの台帳を作っていきます。
ブロックチェーンを構築していく際に、取引(トランザクション)や各ブロック間の参照を簡単に比較できるようにするため(改ざん検出・防止)、ハッシュ関数(hash function)という技術が用いられています。
ビットコインでは、いくつかあるハッシュ関数の中でも、SHA-256 と RIPEMD-160 という種類のものが使用されています。
Contents
ハッシュ関数とは?
ハッシュ関数(hash function)とは、任意長のメッセージを入力すると、そのメッセージを代表する固定長の値(ハッシュ値)を出力するような関数のことです。
固定長のハッシュ値は、コンピュータが処理しやすいような値(例えば、256 bit や 512 bit)に設定されていることが多いようです。
出力値が固定長なので、どのような長さのメッセージを入力したとしても出力サイズは一定になります。
ハッシュ関数には以下の3つの性質があります。
- 固定長の値を出力する
- 同一メッセージの入力に対しては同一のハッシュ値が出力される
- 入力値が大きい場合でも高速で変換できる
ハッシュ関数は、これらの特徴をもっているため、仮想通貨のブロックチェーン技術で使われています。
ハッシュ関数の安全性
ハッシュ関数の安全性として以下の3つがあります。
- 一方向性
- 第2原像計算困難性
- 衝突困難性
なにやらちょっと難しい言葉が並んでいますが、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」コマンドを用いるとハッシュ値を確認できます。
1 |
$ echo -n 'Hello World!' | 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 ハッシュ化するためのコマンドがあるので使ってみます。
1 |
$ echo 'Hello World!' | openssl rmd160 |
92f8bf5be03adfafebb20bd2606e13e08874cf35
SHA-256 より短いハッシュ値が得られることが確認できました。
参考書籍
「暗号化技術のすべて」という書籍を参考にしました。暗号化技術について広くまとめられており、また、最後に少しだけ ビットコインについての分かりやすい記載もありオススメです!
以上、仮想通貨で使われているハッシュ関数技術についてまとめてみました。
そのうち仮想通貨のどのような処理の中でハッシュ関数の技術が使われているかのついてもまとめてみたと思います。
関連記事
-
【ビットコイン】 アドレス生成方法について調べてみた。
仮想通貨の1つであるビットコインを送金するときは、送付側と受け手側のそれぞれのアドレスが必要
-
【仮想通貨】新しいトランザクション(取引)の追加方法【ブロックチェーン】
仮想通貨で用いられているブロックチェーン技術において、新しいトランザクション(取引)をどのよ
-
初心者でも分かるビットコインの仕組みについてまとめてみた。
ビットコインは,時価総額が1位で最も有名な仮想通貨です. 仮想通貨の時価総額の見方について
-
【仮想通貨】デジタル署名と公開鍵暗号の違いは!?
ビットコインなどの仮想通貨のブロックチェーン技術で用いられている「デジタル署名」「公開鍵暗号
-
【仮想通貨】デジタル署名について調べてみた【ブロックチェーン】
ビットコインなどの仮想通貨のブロックチェーンで用いられているデジタル署名(Digital s
-
【仮想通貨】トランザクションについて調べてみた【ブロックチェーン】
ビットコインなどの仮想通貨では、取引をトランザクションで記述されます。 そのトランザク
-
【MetaMask】イーサリアムのウォレットを使ってみた【テスト環境】
今回、イーサリアムのウォレットの1つである MetaMask(メタマスク)を使って、テストブ
-
【イーサリアム】 ホリエモンが2014年当時にイーサリアムの可能性に気付いていた!?
ホリエモンこと堀江氏が、2014年の自身のブログで「イーサリアムやべぇ。。。」というタイトル
-
【イーサリアム】 チューリング完全性について調べてみた。
仮想通貨の1つであるイーサリアムについて調べていると、チューリング完全性(Turing co
-
【イーサリアム】 公開鍵暗号について調べてみた。
仮想通貨の1つであるイーサリアムでは、公開鍵暗号という技術が使われています。 公開鍵暗