見出し画像

秘密鍵と公開鍵と。

ブロックチェーン技術の基盤には、暗号技術が深く関わっています。その中心となるのが秘密鍵と公開鍵のペアです。これらの鍵は、ブロックチェーンのセキュリティと本人確認に不可欠な役割を果たしています。本記事では、秘密鍵と公開鍵の役割、生成方法、そしてその重要性について詳細に解説します。

by 飯野



秘密鍵とは

秘密鍵(Private Key)は、ブロックチェーンにおいて最も重要な要素の一つです。

  • 0と1の羅列で構成される数値データ: 秘密鍵は、暗号学的に安全な乱数生成器を使用して作成されるランダムな数値データです。

  • 所有者のみが知り得る極秘情報: 銀行の暗証番号に例えられるほど、極秘にすべき情報です。秘密鍵を他人に知られてしまうと、その鍵に関連付けられた資産を第三者に不正に操作されるリスクがあります。

  • 暗号資産の使用権を与える鍵: ブロックチェーン上で資産を管理し、取引を行うためのデジタル署名を生成するために使用されます。

公開鍵とは

公開鍵(Public Key)は、秘密鍵から生成される一対の鍵であり、広く公開しても問題ありません。

  • 秘密鍵から生成される0と1の羅列: 公開鍵は、秘密鍵を基にして生成されるデータです。

  • 世界中に公開しても問題ない情報: 銀行の口座番号に例えられ、取引の受取先アドレスとして使用されます。

  • ビットコインアドレスの生成に使用される: 公開鍵からさらに暗号化処理を行うことで、ビットコインなどの暗号資産のアドレスが生成されます。


秘密鍵と公開鍵の関係性

ブロックチェーン技術における秘密鍵と公開鍵は、暗号学の中でも非常に重要な役割を果たします。これらの鍵は公開鍵暗号方式と呼ばれる技術の一部であり、互いに密接に関連しています。この章では、秘密鍵と公開鍵の関係性について詳しく説明します。

秘密鍵と公開鍵の生成プロセス

秘密鍵と公開鍵は、通常、以下のプロセスを経て生成されます:

  1. 秘密鍵の生成: 暗号学的に安全な乱数生成器を使用して、大きなランダムな数値を生成します。この数値が秘密鍵となります。

  2. 公開鍵の生成: 秘密鍵を楕円曲線暗号(Elliptic Curve Cryptography, ECC)などの暗号化関数に入力することで、対応する公開鍵が生成されます。公開鍵は、秘密鍵に基づいて一方向的に計算されるため、秘密鍵からしか導き出すことができません。

一方向性関数とトラップドア関数

秘密鍵と公開鍵の関係性は、「一方向性関数(One-Way Function)」と「トラップドア関数(Trapdoor Function)」と呼ばれる数学的な概念に基づいています。一方向性関数は、ある入力から出力を計算するのは簡単ですが、出力から入力を逆算するのは極めて困難な関数のことを指します。

トラップドア関数は、一方向性関数の特殊な形式であり、特定の秘密情報(トラップドア)を知っている場合には逆方向の計算が容易に行えます。このトラップドアが秘密鍵に相当し、公開鍵がこの関数の出力となります。

セキュリティの確保

秘密鍵と公開鍵の関係性により、次のようなセキュリティ上の特性が確保されます:

  • 秘密鍵の保護: 秘密鍵はランダムに生成されるため、他人が推測することは極めて困難です。さらに、公開鍵から秘密鍵を導き出すことは事実上不可能です。

  • 公開鍵の公開: 公開鍵は誰でもアクセスできる情報として公開されますが、秘密鍵がなければ重要な操作(例えば、資産の移動やデジタル署名の生成)は行えません。

  • デジタル署名の検証: 秘密鍵で署名されたトランザクションは、対応する公開鍵でその署名の正当性を簡単に検証できます。これにより、トランザクションの送信者が確かにその秘密鍵を所有していることが確認されます。






ここからは超学問的で、技術的になります!



秘密鍵と公開鍵の生成方法

  1. 秘密鍵の生成: 通常、ウォレットアプリケーションによって自動的に生成されます。これは暗号学的に安全な乱数生成器を使用して作成されるランダムな数値データです。

  2. 公開鍵の生成: 秘密鍵から生成されます。具体的には、秘密鍵を暗号化関数に入力することで対応する公開鍵が生成されます。

  3. 生成プロセス:

    • まず、ウォレットアプリケーションが秘密鍵を自動生成します。

    • 次に、生成された秘密鍵を暗号化関数に入力し、公開鍵を生成します。

    • 最後に、公開鍵からさらに暗号化処理を行い、ビットコインアドレス(または他の暗号資産のアドレス)を生成します。

以下に、Bitcoinの秘密鍵と公開鍵を生成するためのPythonコードを示します。このコードでは、ecdsaライブラリとhashlibを使用して、楕円曲線暗号(Elliptic Curve Cryptography, ECC)を利用して秘密鍵と公開鍵を生成します。


ビットコインアドレスとは?

ビットコインアドレスは、銀行口座の口座番号と考えることができます。主な違いは、ビットコインを保管するのではなく、取引中にビットコインを指示するために使用されることです。ビットコインアドレスは、ビットコインネットワーク上の宛先を表す文字と数字を組み合わせた文字列です。ビットコインを受け取りたい人は、ウォレットアプリやコードを使用して、取引ごとに新しい一意の単一使用アドレスを生成するのが理想的です。主にはビットコインアドレスには3つのタイプがあります。:

  • Legacy(P2PKH):
    レガシーはオリジナルのビットコインアドレスです。最も互換性が高く、多くのウォレットによってサポートされています。
    例:1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2

  • Nested SegWit (P2PSH):
    Nested SegWitはレガシーを改良したもので、レガシーのアドレスよりも取引手数料が40%安く、マルチシグネチャがあります。
    例:3から始まる→ 3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX

  • Native SegWit(Bech32):
    SegWitはSegregated Witnessの略で、取引サイズが小さく、レガシーと比較して取引手数料を80%節約できる。
    例:bc1から始まる:bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4


ビットコインのアドレスはどのように生成されるのか?

  1. 64(16進)文字からなる秘密鍵のランダムな文字列(256ビット/32バイト)が最初に生成され、それは0から≦n-1の間の任意の数であることができます。

  2. nより小さい256ビットの文字列がSHA256ハッシュ・アルゴリズムに送られ、新しい256ビットの数字が生成されます。これが秘密鍵となります。

  3. 次に、生成された秘密鍵から128文字(64バイト)の公開鍵が導出されます。公開鍵は、ECDSA (Elliptic Curve Digital Signature Algorithm) の曲線である secp256k1 を用いて秘密鍵から生成されます。 つまり、公開鍵はP = p * Gという式で生成され、pは秘密鍵、Gは生成点でsecp256k1曲線上で定義された点のこと。

quicknodeより: https://www.quicknode.com/guides/other-chains/bitcoin/how-to-generate-a-new-bitcoin-address-in-javascript 



import os
import ecdsa
import hashlib
import base58

# 秘密鍵の生成
def generate_private_key():
    return os.urandom(32)

# 公開鍵の生成
def generate_public_key(private_key):
    sk = ecdsa.SigningKey.from_string(private_key, curve=ecdsa.SECP256k1)
    vk = sk.verifying_key
    return b'\x04' + vk.to_string()

# ビットコインアドレスの生成
def generate_address(public_key):
    sha256_bpk = hashlib.sha256(public_key).digest()
    ripemd160_bpk = hashlib.new('ripemd160', sha256_bpk).digest()
    hashed_public_key = b'\x00' + ripemd160_bpk

    checksum_full = hashlib.sha256(hashlib.sha256(hashed_public_key).digest()).digest()
    checksum = checksum_full[:4]

    binary_address = hashed_public_key + checksum
    address = base58.b58encode(binary_address)
    return address

# 秘密鍵の生成
private_key = generate_private_key()
print("Private Key:", private_key.hex())

# 公開鍵の生成
public_key = generate_public_key(private_key)
print("Public Key:", public_key.hex())

# ビットコインアドレスの生成
address = generate_address(public_key)
print("Bitcoin Address:", address.decode())

このコードの概要は以下の通りです:

  1. generate_private_key関数で、32バイトのランダムなデータを生成し、秘密鍵として使用します。

  2. generate_public_key関数で、秘密鍵から公開鍵を生成します。公開鍵は、楕円曲線のポイントを表す64バイトのデータ(プレフィックス \x04 を含む)です。

  3. generate_address関数で、公開鍵からSHA-256およびRIPEMD-160のハッシュを計算し、ビットコインアドレスを生成します。このアドレスはBase58Checkエンコーディング形式でエンコードされます。




秘密鍵と公開鍵の使用例

ブロックチェーンにおける秘密鍵と公開鍵の主な使用例:

  1. デジタル署名: 秘密鍵を使用してトランザクションに署名し、公開鍵を使用してその署名を検証します。

  2. 暗号化通信: 送信者が受信者の公開鍵でメッセージを暗号化し、受信者が自身の秘密鍵で復号します。

  3. アドレス生成: 公開鍵から暗号資産のアドレスを生成します。

  4. 本人確認: 秘密鍵の所有を証明することで、暗号資産の所有権を確認します。


参考文献:

以上の内容を元に、ブロックチェーンに関する理解を深め、実際に利用する際のセキュリティ対策を強化していきましょう。

この記事が気に入ったらサポートをしてみませんか?