MSTR Cat

ブロックチェーン/レベル II · 仕組み/2.1 暗号技術/レッスン 2

HASH160: SHA-256の後にRIPEMD-160

鍵を短くする二重ハッシュと、その裏に潜む弱点

用意するものblockstream.infoやblockchain.comのようなブロックエクスプローラービットコインアドレスのサンプルセットテキストエディタまたはスプレッドシート

問い

  1. なぜビットコインは連続して2つの異なるハッシュ関数を使用するのでしょうか?
  2. 160ビットのハッシュが256ビットのものにはない利点とは何でしょうか?
  3. 20バイトのハッシュが、安全でありながら脆弱でもあり得るのはなぜでしょうか?

探究

  1. ビットコインの生の公開鍵は、圧縮形式で33バイトです。これはトランザクションで効率よく使うには長すぎます。暗号学的な完全性を損なわずに短くするため、ビットコインはSHA-256の後にRIPEMD-160を適用する2段階の処理を行います。この組み合わせはHASH160と呼ばれ、160ビット(20バイト)の出力が得られます。これはアドレスのエンコードに十分なコンパクトさです。
  2. Hans Dobbertin、Antoon Bosselaers、Bart Preneelが1996年に設計したRIPEMD-160は、SHA-256より短い出力を生成し、オープンな学術的設計プロセスから生まれました。まず公開鍵(P2SHの場合はスクリプト)にSHA-256が適用され、次にそのSHA-256の出力にRIPEMD-160が適用されます。この順序によってセキュリティと効率のバランスが取られており、Pay-to-PubKey-Hash(P2PKH)、Pay-to-Script-Hash(P2SH)、Pay-to-Witness-PubKey-Hash(P2WPKH)のアウトプットで使用されています。
  3. 2つの異なるハッシュ関数を使うことで、多層防御の層が1つ加わります。入れ子構造が主に役立つのは原像攻撃(プリイメージ攻撃)に対してです。与えられたハッシュに一致する鍵を見つけるには、両方の関数を破る必要があるためです。一方、衝突に対しては効果がありません。SHA-256の衝突はそのままHASH160の衝突にもなるからです。また、160ビットの出力は約80ビットの衝突耐性を意味し、これは単一の鍵によるアドレスのアウトプットには許容範囲です。しかし、複数の当事者が関与する共有スクリプトでは問題となるため、SegWitとTaprootはネイティブスクリプトに32バイトの値を使用しています。
  4. 鍵をハッシュ化することで、将来の量子コンピュータからコインを守れるという主張がよく見られます。しかし、その保護は部分的なものです。コインを使用すると公開鍵が明らかになるため、保護されるのは鍵が一度も公開されていないアウトプットだけです。アドレスを再利用すればこの保護は失われます。また、Taprootのアウトプットは公開鍵を直接オンチェーンに置きます。十分な能力を持つ量子コンピュータは、公開されたあらゆる鍵を脅かすことになります。
  5. 公開鍵からビットコインアドレスを構築するには、まずHASH160を適用し、その結果の先頭にネットワーク識別子(メインネットのP2PKHでは0x00)を付け、続けてダブルSHA-256から導出した4バイトのチェックサムを付加します。この25バイトの列をBase58でエンコードすると、人間が読めるアドレスになります。このエンコードは紛らわしい文字を除外し、転記ミスを検出するためのチェックサムを含んでいます。
  6. 実際に見てみるために、ブロックエクスプローラーを開き、P2PKHトランザクションを検索してください。そこにあるscriptPubKeyフィールドには20バイトのハッシュが含まれているはずです。これを、アウトプットが使用された際に明らかになる公開鍵と比較してみてください。公開鍵の方が長く、ハッシュはアドレスで使われている短縮されたエンコード済みのバージョンであることが分かります。

重要な事実

  • HASH160は、SHA-256の後にRIPEMD-160を適用する組み合わせです。
  • HASH160の出力は160ビット(20バイト)です。
  • RIPEMD-160は、1996年にHans Dobbertin、Antoon Bosselaers、Bart Preneelによって設計されました。
  • HASH160は、P2PKH、P2SH、P2WPKHのアウトプットスクリプトで使用されます。
  • 160ビットのハッシュ出力は、約80ビット分の衝突耐性を提供します。
  • ハッシュ化によって公開鍵が隠されるのは、そのコインが使用されるまでです。Taprootのアウトプットは鍵を直接示します。

演習 九・六・三・一

9集めるビットコインアドレスを9つ挙げてください。形式(1、3、bc1q、bc1pなどで始まるもの)と文字数を記録してください。
6まとめる9つのアドレスを、エンコード方式とスクリプトの種類(例:Base58、Bech32、SegWitなど)に基づいて6つのグループに分類してください。
3絞り込む6つのグループを、ビットコインが異なるアドレス形式を使い分ける理由を説明する3つの原則にまとめてください。
1結晶化するビットコインがアドレスの作成に2つのハッシュ関数を使用する理由を、1文で説明してください。

事実確認

日付、数字、主張は、下記に記載された公表資料と照合して確認しました。

インタラクティブ版で開く →

EN PT ES ZH KO RU DE FR MS