ハッシュ関数とは
ハッシュとはあるインプットを変換して得られる固定のアウトプットのことを言います。このインプットを変換して固定のアウトプットを出力するものをハッシュ関数といいます。インプットには数字でも文字列でも使えます。
ハッシュ関数の特徴としてアウトプットからインプットを特定するのが非常に困難だという特徴があります。この特徴を活かして、ウェブサイトで入力されるパスワードはハッシュ関数でハッシュ化したパスワードをデータベースに保存さることが多いです。ログイン時は入力したパスワードをハッシュ化し、データベースのハッシュ値と一致しているか確認することで正しいかをチェックしています。
または、文章をハッシュ関数でハッシュ化し、元の文章が改ざんされていないか確かめることもできます。
ビットコインでは下記で紹介するハッシュ関数、SHA-256とRIPEMD-160が使われています。
SHA-256とは
SHA-256は「Secure Hash Algorithm 256-bit」の略称で、インプットから256ビット(32バイト)長のハッシュ値を得るハッシュ関数のことです。ハッシュ関数なのでアウトプットからインプットを求めるのは非常に難しいという性質を持っています。
SHA-256のアルゴリズム
初期のハッシュ値が決まっており、この初期ハッシュを変化させるために使われる情報が入力データです。 SHA-256では入力データを64Byteごとに分割します。 分割されたデータは「メッセージブロック」と名づけられていて、 入力データが64Byteを超える場合は、複数のメッセージブロックが形成されます。
初期ハッシュは最初のメッセージブロックを使って変化させ、新しいハッシュ値を算出します。 さらに、そのハッシュ値を次のメッセージブロックで変化させて新しいハッシュ値を算出し、次のメッセージブロックで同様のことを繰り返します。 そして、最後のメッセージブロックで算出されたハッシュ値が最終結果の256ビットのハッシュ値となります。
SHA-256ハッシュ値の生成
shellで簡単に生成することができます。BitcoinとBitCoinで全く異なるハッシュ値が生成できていることが確認できます。16進数が64文字あるので256ビットですね。
$ echo -n 'Bitcoin' | shasum -a 256 b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa4 - $ echo -n 'BitCoin' | shasum -a 256 a47c917b3de15bac209127accd4f2502b2566fcaa8b2525ae89f69072210910a -
RIPEMD-160とは
まず、RIPEMDとは「RACE Integrity Primitives Evaluation Message Digest」の略称で、1996年にルーヴェン・カトリック大学で開発された暗号学的ハッシュ関数です。ちなみにライプエムディーと読むそうです。
SHA-1やSHA-2はNSA(アメリカ国家安全保障局)で開発されたのと対照的に、RIPEMDはオープンな学術コミュニティによって開発されたので特許による制限を受けないです。
そして、RIPEMD-160とはオリジナルのRIPEMDが128ビットのハッシュ値を生成するものを160ビットにしたうえで改良を加えたものです。
RIPEMD-160ハッシュ値の生成
opensslコマンドを使うことでRIPEMD-160も簡単に生成することができます。SHA-256よりも短い160ビットのハッシュ値が生成できました。
$ echo -n 'Bitcoin' | openssl rmd160 4c9f77ab9e5eef487c2c0ae07029e79b2ca11a68 $ echo -n 'BitCoin' | openssl rmd160 dc41cf5f6c430587f6053306fcb21d9d07ba2a09
ダブルハッシュ
ビットコインでハッシュ関数を扱う場合インプットに対して2回ハッシュ化を行います。例えば公開鍵からビットコインアドレスを導出する時は、公開鍵に対してSHA-256でハッシュ化したものに対してRIPEMD-160でハッシュ化を行いトータル2回のハッシュ化を行います。Base58Checkエンコードを行うときはSHA-256で2回のハッシュ化を行います。
このようにダブルハッシュを行うことで手軽により安全なハッシュ値を生成することができます。
まとめ
ビットコインの基礎構成技術であるハッシュ関数について見てきました。このハッシュ関数は他の多くのブロックチェーンでも使われているのでしっかりと押さえておきたい技術です!
最後に
最後にブロックチェーンエンジニアって何?どうやったらなれるの?という人向けに書いた下の記事も読んでみてください。
おすすめ書籍
ビットコインとブロックチェーンの詳細をしっかりと学びたい方にはこちらの書籍が非常におすすめです。ウォレットの仕組み、楕円曲線暗号、P2Pプロトコル、公開鍵暗号などビットコインを支える技術について詳細に解説されています。また、サンプルコードを通して実際に手を動かして学べるので非常に濃い内容となっています。
こちらはブロックチェーンの初学者向けになります。ブロックチェーンの応用例の紹介から基礎的な理論まで分かりやすく図解で解説されています。また、ビットコインやEthereum、HyperLdger Fabricを実際に稼働させてみて動作を理解するためのサンプルコードの解説もあります。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す