データの改ざんを検知できる「ハッシュ関数」
ハッシュ関数(一方向ハッシュ関数)は、データを入力すると、必ず同じハッシュ値を出力する関数です。Excelの関数や数学の1次関数と異なるのは、出力されたハッシュ値から元のデータを復元するどころか、だいたいのデータを想像することもできないところです。ハッシュ関数に入力する元データが1文字でも異なると、全く違うハッシュ値が出力されます。また、ハッシュ関数はデータの長さに関わらず、一定の長さのハッシュ値を出力します。
ハッシュ関数を利用すると、元データが少しでも変更されれば、異なるハッシュ値が出てくるため、ハッシュ値があらかじめ与えられていれば、元データが改ざんされていないかどうかがわかります。
ハッシュ値の桁数は、ハッシュ関数が新しくなるたびに長くなる傾向にありますが、RIPEMD-160はSHA-256よりも短いハッシュ値で、同程度の強度を実現しています。SHA1は2005年にGoogleが脆弱性を発見し、比較的容易に攻撃できることが2017年に判明したため、主なブラウザでは使用を中止しています。ビットコインなど仮想通貨には、RIMEMD-160やSHA-256、あるいはさらに強度が高いSHA3-256などが使われています。
ハッシュ関数で出力される値は一定の長さなので、異なる値を入力して同じ値が出力されることもあります。これがハッシュの衝突です。さまざまなハッシュ関数が開発されているのは、衝突が発生しにくい=対衝突性の高いハッシュ関数が求められてきたからです。
ウォレットアドレス出力に不可欠な「Base64」と「Base58」
Base64とBase58は、いずれもコンピューターが扱う2進法のデータ(バイナリデータ)を文字列に変換するための変換方式(エンコード)です。Base64では、データを「0〜9」「A〜Z」「a〜z」「+」「/」の64文字のみを使って表します。Base64はインターネット黎明期からメールのエンコードなどに使われて来ました。
Base58は、Base64の使う64文字から「0(数字のゼロ)」「I(アルファベットiの大文字)」「O(アルファベットoの大文字)」「l(アルファベットLの小文字)」「+」「/」を除いた58文字で構成されています。これは、人が目で見て入力するとき見間違いを防ぐためです。
Base58で使用できる文字は、ビットコインでは「123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz」と表記されます。なお、Base58を使用するシステムによっては、使用できる文字の記述順が異なることがあります。
ハッシュ関数とブロックチェーン
ここでようやく、ブロックチェーンの各ブロックについて解説することができます。
まず各ブロックに含まれるデータは、「トランザクション」「前のブロックのハッシュ値」「ナンス(number used once)」です。ナンスは、上記のデータ全体のハッシュ値が一定の数値以下となるような値の数値です。
次にウォレットアドレスの生成方法について、ビットコインを例として解説します。
まず乱数が生成され、その乱数を元に秘密鍵と公開鍵が生成されます。公開鍵のハッシュ値を求めて、以下の形式に並べます。
プレフィックスはウォレットアドレスの種別を表しています。ビットコインを所有するためのプレフィックスは「0x00」です。チェックサムは、送られてきたデータが正しいか確認するための数値です。これも公開鍵にハッシュ関数を適用して算出されています。
最後に全体をBase58エンコードすることで普段目にするウォレットアドレスが出力されます。
なおウォレットアドレスの生成にはインターネット接続は不要で、オフラインで実行することができます。
取材・文/久我吉史
現役の金融ビジネスパーソンでもある金融ライター。
作図/稲岡聡平