Skip to content

ETH #1:公钥与私钥

掌握非对称加密是理解区块链的第一步。私钥是你对链上资产的唯一控制凭证,公钥用于生成地址和验证签名。


核心概念

私钥(Private Key)

私钥是一个随机生成的 256 位数字(32 字节),本质上就是一个非常大的随机数。在十六进制下,它看起来像这样:

e9873d79c6d87dc0fb6a5778633389f4453213303da61f20bd67fc233aa33262

私钥的安全性来源于其巨大的可能空间:2^256 ≈ 10^77,这个数字比可观测宇宙中的原子数量还要多。所以两个人"碰巧"生成相同私钥的概率几乎为零。

公钥(Public Key)

公钥由私钥通过 椭圆曲线数字签名算法(ECDSA) 计算得到。以太坊和比特币都使用 secp256k1 曲线。

公钥可以公开分享,因为从公钥无法反推出私钥(单向函数)。

地址(Address)

以太坊地址 = 公钥经过 Keccak-256 哈希 → 取后 20 字节 → 加 0x 前缀。

密钥生成流程

graph LR
    A["🎲 随机数生成器"] -->|"256位随机数"| B["🔑 私钥<br/>32 字节"]
    B -->|"ECDSA<br/>secp256k1 曲线<br/>点乘运算"| C["📢 公钥<br/>64 字节<br/>(未压缩)"]
    C -->|"Keccak-256 哈希<br/>取后 20 字节"| D["📍 地址<br/>20 字节<br/>0x..."]

    style A fill:#e1f5fe
    style B fill:#fff3e0
    style C fill:#e8f5e9
    style D fill:#f3e5f5

数字签名

数字签名用于证明"这笔交易确实是由私钥持有者发起的",而不需要暴露私钥本身。

sequenceDiagram
    participant Alice as Alice(发送方)
    participant Network as 区块链网络
    participant Bob as Bob(验证方)

    Alice->>Alice: 用私钥对交易数据签名
    Alice->>Network: 发送交易 + 签名
    Network->>Bob: 广播交易
    Bob->>Bob: 用 Alice 的公钥验证签名
    Note over Bob: 验证通过 ✅<br/>确认是 Alice 发起的

签名过程(简化)

  1. 对交易数据做哈希,得到消息摘要 h
  2. 用私钥 k 和随机数 r 计算签名 (r, s)
  3. 任何人都可以用公钥验证 (r, s) 是否与 h 匹配

为什么用 ECDSA 而不是哈希函数?

哈希函数是纯粹的单向函数——输入和输出之间没有数学关系,只能验证"是否相等"。

ECDSA 基于椭圆曲线的数学结构,私钥和公钥之间存在确定的数学关系,这使得:

  • 从私钥可以计算出公钥(正向容易)
  • 从公钥无法反推私钥(反向极难)
  • 可以用私钥"签名",用公钥"验证"——这是哈希函数做不到的

以太坊 vs 比特币的地址生成对比

graph TB
    PK["🔑 公钥(相同的 secp256k1)"]

    subgraph ETH["以太坊"]
        E1["Keccak-256 哈希"]
        E2["取后 20 字节"]
        E3["0x 前缀 → 地址"]
    end

    subgraph BTC["比特币"]
        B1["SHA-256 哈希"]
        B2["RIPEMD-160 哈希"]
        B3["Base58Check / Bech32 编码 → 地址"]
    end

    PK --> E1 --> E2 --> E3
    PK --> B1 --> B2 --> B3

学习资源