SHA-256 は、データからハッシュと呼ばれる指紋を計算する、厳密に定められた手順です。同じ入力からは必ず同じ、256 ビットの結果が得られます。これは 32 バイトで、通常は 64 桁の 16 進数で表します。Bitcoin はデータの関連付けや検証、マイニングに利用しています。ただし、この指紋は元の内容を暗号化したコピーではありません。
誰かからファイルとそのハッシュを受け取ったとします。自分でも計算すれば、ダウンロードしたデータが示された指紋と一致するかを確認できます。入力をわずかに変えただけでも、非常に高い確率で結果全体が変わります。ただし、指紋だけでは作成者やファイルの安全性は分かりません。攻撃者がファイルとハッシュの両方を差し替えれば、両者は一致します。照合に使う値の入手先が信頼できるかも大切です。 [1] [5]
引用符も改行も含まない三つの ASCII バイト abc の計算結果は ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad です。無作為に作った数値ではありません。正しい実装なら、まったく同じバイトから必ずこの結果を得ます。空白や改行を加えると入力が変わります。そのためにハッシュが変わっても、アルゴリズムの故障ではありません。文章では文字エンコーディングも関係します。 [3]
暗号化は、鍵を使ってメッセージを復元できるようにする仕組みです。SHA-256 には、そのような鍵も逆向きの復元手順もありません。しかし、ありそうな入力を試すことはできます。四桁の PIN をハッシュにしたと分かれば、攻撃者は 10,000 通りすべてを計算して比較できます。長いハッシュにしても、弱い秘密に足りないエントロピー (入力の予測しにくさ)は増えません。攻撃者が実際に調べる必要のある候補数も、安全性を左右します。 [5] [7]
ブロック識別子、txid (取引識別子)、Merkle Tree (ハッシュを木構造で結び付けたもの) で二つのハッシュを組み合わせる処理は SHA256(SHA256(data)) を使います。二回目に処理するのは一回目の結果の生の 32 バイトであり、64 文字のテキスト表現ではありません。出力は引き続き 256 ビットです。二重ハッシュはここでのプロトコル上の規則であり、一回の SHA-256 が破られた証拠ではありません。Bitcoin はほかの構成も使います。たとえば Taproot は、ハッシュの用途を区別するために、あらかじめ定めたタグを入力に加えます。 [2] [4] [6]
マイナーは候補ブロックのヘッダーで変更が許される項目を繰り返し変え、その二重 SHA-256 を計算します。数値として見た結果が、決められた target (数値の上限) 以下になるものを探しています。メッセージを復号したり、誰かの秘密鍵を探したりしているわけではありません。適切なヘッダーを見つけるには多くの試行が必要ですが、検証はすぐにできます。ヘッダーは前のブロックも参照するため、古いブロックを変えると後続のつながりが崩れます。Full Node (Bitcoin のルールを自分で検証するノード) は取引やほかの規則も確認します。条件に合うハッシュだけで、不正なブロックが正当になることはありません。 [4]
可能なメッセージは 256 ビットの指紋より多いため、異なる入力が同じハッシュになる場合が必ず存在します。これを衝突と呼びます。重要なのは、意図して見つけられるかどうかです。理想的な 256 ビットハッシュでは、任意の衝突を汎用的に探すには約 2^128 回、あらかじめ指定された指紋に合う入力を探すには約 2^256 回の試行が必要です。二つは別の課題です。衝突を見つけただけで Bitcoin の秘密鍵が分かるわけではありません。また、この数値だけでウォレットやプロトコル全体の安全性が保証されるわけでもありません。 [5]
SHA-256 は部品であり、あらゆる安全性の問題に対する完成した解決策ではありません。意図的に高速なので、人が決めたパスワードの保存に単独で使うのは不向きです。攻撃者も候補を高速に試せてしまうからです。その用途には、計算コストを調節できるものなど、専用のパスワード導出手順を使います。同様に「何かをハッシュにすれば安全な鍵になる」という自己流の方法では、元のランダム性の不足も入力の漏えいも解決しません。利用者が通常 SHA-256 を手計算する必要はありませんが、照合した指紋が何を証明し、何を証明しないかは理解しておきたいところです。 [8] [7]
SHA-256 は SHA-2 ファミリーに属し、手順は NIST FIPS 180-4 に規定されています。計算の前に長さの情報などを入力に付け加え、512 ビットずつに分けて、それぞれ 64 ラウンド処理します。この内部ブロックは 64 バイトで、Bitcoin のブロックとは別物です。Bitcoin のブロックヘッダーは 80 バイトで、ブロック全体にはさらに取引が含まれます。名称の 256 は出力される指紋の長さであり、ブロックや秘密鍵の大きさではありません。 [1] [4]
理解を深めるには、この項目とあわせて次もお読みください Hash, Proof of Work, Block Header, ビットコインアドレス, Merkle Tree, Bitcoin. 次の項目からも参照されています Hash, ASIC Miner, Hashrate, Nonce.