第3章:ハッシュ関数とデジタル署名

Hash Functions and Digital Signatures

データの完全性を保証する技術について学習します。

この章で学ぶこと

ハッシュ関数は暗号学における基本的な構成要素の一つで、データの「指紋」を作成する技術です。 この章では、ハッシュ関数の数学的性質と実用的な応用について学び、 さらにハッシュ関数と公開鍵暗号を組み合わせたデジタル署名の仕組みを理解します。

ハッシュ関数とは

ハッシュ関数は、任意の長さのデータを入力として受け取り、固定長の値(ハッシュ値)を出力する関数です。 この出力値は、元のデータの「デジタル指紋」のような役割を果たします。 例えば、1バイトのテキストも1GBの動画ファイルも、SHA-256では同じ256ビットのハッシュ値になります。

暗号学的ハッシュ関数が持つべき重要な性質があります。 まず「一方向性」により、ハッシュ値から元のデータを復元することは事実上不可能です。 また「雪崩効果」により、入力の1ビットが変わっただけで出力の約半分のビットが変化します。 これらの性質により、データの完全性検証や暗号学的な安全性を実現しています。

現在最も広く使用されているのはSHA-2ファミリー(SHA-224、SHA-256、SHA-384、SHA-512)で、 特にSHA-256はBitcoinを始めとする多くのブロックチェーンで採用されています。 次世代のSHA-3も標準化されており、より高いセキュリティが求められる用途で使用されています。

決定性

同じ入力に対して常に同じ出力を生成する

例: 「Hello」→ 常に同じハッシュ値

一方向性

ハッシュ値から元のデータを復元することは事実上不可能

例: ハッシュ値から「Hello」を逆算できない

雪崩効果

入力の小さな変化でも出力が大きく変化する

例: 「Hello」と「hello」のハッシュ値は全く異なる

衝突困難性

同じハッシュ値を持つ異なる入力を見つけることが困難

例: 異なる2つのメッセージが同じハッシュ値になる確率は天文学的に低い

SHA-256を体験する

SHA-256(Secure Hash Algorithm 256-bit)は、アメリカ国家安全保障局(NSA)が設計し、 NISTによって標準化された暗号学的ハッシュ関数です。 256ビット(32バイト)の固定長出力を生成し、2^256個の異なるハッシュ値を生成可能です。

以下のデモで、入力データのわずかな変化がハッシュ値に与える影響を確認してみましょう。 これは「雪崩効果」と呼ばれ、暗号学的ハッシュ関数の重要な性質の一つです。

SHA-256ハッシュ関数を体験

SHA-256は256ビット(64文字の16進数)の固定長ハッシュ値を生成します。 入力の小さな変化でも出力が大きく変化する「雪崩効果」を確認してみましょう。

SHA-256ハッシュ値:

SHA-256ハッシュ値:

雪崩効果の確認

入力の差: 1文字

ハッシュ値の差: 0/0文字 (0%)

わずかな入力の違いでも、ハッシュ値は約50%異なることが期待されます。 これが暗号学的ハッシュ関数の重要な性質です。

ハッシュ関数の実用例

ハッシュ関数は理論的な概念にとどまらず、私たちの日常生活で広く活用されています。 パスワードの安全な保存から、ファイルの完全性検証、ブロックチェーンの構築まで、 様々な場面でデータの安全性を支えています。

特に重要なのは、ハッシュ関数が「検証」の仕組みを提供することです。 大きなファイルを送信する際、ファイル全体を比較する代わりに、 小さなハッシュ値を比較するだけで完全性を確認できます。

パスワード保存

Webサービスはパスワードの平文ではなくハッシュ値を保存。データベースが漏洩してもパスワードは安全。

ファイル検証

ダウンロードしたファイルが改ざんされていないか、ハッシュ値を比較して確認。

ブロックチェーン

各ブロックが前のブロックのハッシュ値を含むことで、改ざん不可能な連鎖を形成。

デジタル署名

メッセージのハッシュ値に署名することで、効率的な署名と検証を実現。

デジタル署名の仕組み

デジタル署名は、前章で学んだ公開鍵暗号とハッシュ関数を組み合わせた技術で、「誰が署名したか」「内容が改ざんされていないか」を同時に保証します。紙の文書における印鑑やサインのデジタル版と言えるでしょう。

署名のプロセスは以下のように行われます: まず、署名したいメッセージのハッシュ値を計算します。 次に、そのハッシュ値を署名者の秘密鍵で暗号化します。 この暗号化されたハッシュ値がデジタル署名となります。 検証者は、署名者の公開鍵を使って署名を復号化し、 メッセージのハッシュ値と比較することで署名の有効性を確認できます。

デジタル署名の重要な特性として「否認防止」があります。 秘密鍵を持つ本人しか有効な署名を作成できないため、 後から「署名していない」と否認することができません。 これは電子商取引や契約において極めて重要な性質です。

デジタル署名の仕組み

デジタル署名は「誰が署名したか」と「内容が改ざんされていないか」を保証します。 署名者は秘密鍵で署名し、検証者は公開鍵で検証します。

署名者(アリス)

ハッシュ化したメッセージを秘密鍵で暗号化

署名(暗号化されたハッシュ値):

検証者(ボブ)

公開鍵:3A7B9C2D...で署名を検証

💡 ヒント: メッセージを1文字でも変更すると署名の検証が失敗します。

Merkle Tree - 効率的な検証

Merkle Tree(マークル木)は、ラルフ・マークルが1979年に発明したデータ構造で、 大量のデータの完全性を効率的に検証することができます。 各葉(ノード)がデータのハッシュ値を持ち、親ノードは子ノードのハッシュ値を 連結してハッシュ化した値を持つ二分木構造です。

Bitcoinでは、ブロック内の全トランザクションをMerkle Treeで管理しています。 これにより、特定のトランザクションがブロックに含まれていることを、 全トランザクションをダウンロードすることなく効率的に検証できます(SPV: Simplified Payment Verification)。

Merkle Treeの素晴らしい点は、n個のデータに対して、 特定のデータの存在証明に必要な情報量がO(log n)で済むことです。 例えば、1,000,000個のトランザクションがあっても、 わずか20個程度のハッシュ値で特定のトランザクションの存在を証明できます。

Merkle Tree - 効率的なデータ検証

Merkle Treeは、大量のデータの完全性を効率的に検証するデータ構造です。 Bitcoinでは、トランザクションの検証に使用されています。

データ(ノード)
4a56c74f
4a56c750
4a56c751
4a56c752
中間ノード

1be835d1

5e06abbd

ルートハッシュ

44e2ae54

Merkle Treeの利点
  • ルートハッシュだけで全データの完全性を検証可能
  • 特定のデータの存在証明に必要な情報量が少ない(O(log n))
  • 大規模データの効率的な同期・検証が可能

まとめ

この第3章では、ハッシュ関数とデジタル署名について学習しました。 ハッシュ関数は一方向性と衝突困難性により、データの完全性検証や パスワード保護などに広く活用されています。 デジタル署名は、ハッシュ関数と公開鍵暗号を組み合わせることで、 電子文書の真正性と完全性を保証する重要な技術です。

次章では、Bitcoinやイーサリアムで使用されている楕円曲線暗号について学習します。 楕円曲線暗号は、RSAよりも短い鍵長で同等の安全性を実現できる 効率的な公開鍵暗号方式で、ブロックチェーン技術の中核を担っています。

この章で学んだ重要なポイント

  • ハッシュ関数の不可逆性ハッシュ関数は一方向関数であり、出力から入力を逆算することは計算量的に不可能です。
  • 固定長出力入力データのサイズに関わらず、常に固定長(SHA-256なら256ビット)の出力を生成します。
  • デジタル署名の仕組み秘密鍵で署名し、公開鍵で検証することで、なりすましと改ざんを防止します。
  • 実用的な応用ハッシュ関数とデジタル署名は、現代のセキュリティシステムの基盤技術です。