Skip to content

Keys和Address概念

目录

  1. 概述
  2. 私钥(Private Key)
  3. 公钥(Public Key)
  4. 比特币地址(Bitcoin Address)
  5. 密钥推导
  6. HD钱包(分层确定性钱包)
  7. 地址类型
  8. 钱包和密钥管理
  9. 安全最佳实践
  10. 常见问题

概述

比特币使用非对称加密(Asymmetric Cryptography)来保证安全性和所有权。在这个系统中:

  • 私钥 用来签署交易,证明你拥有这些比特币
  • 公钥 从私钥派生,用来验证签名和接收比特币
  • 比特币地址 从公钥派生,是接收比特币的"账户"

这三者形成了一个链式关系:私钥 → 公钥 → 比特币地址


私钥(Private Key)

定义

私钥是一个256位的随机数,通常以不同的格式表示:

格式示例说明
十六进制0x1234567890abcdef... (64个字符)计算机内部表示
十进制长的数字串数值表示
WIFKwdB92NExtvB8p9r...钱包导入格式
WIF压缩Kwzwp4nJ92M2pJvR...压缩的钱包导入格式

私钥的特性

私钥范围:
1 到 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D0D6 4B2D

总共大约 1.158 × 10^77 个可能的私钥,也就是256bit
(远大于宇宙中的原子数量 ≈ 10^80)

私钥的重要性

  • 绝对保密:私钥丢失 = 比特币永久丢失
  • 唯一性:不能从公钥或地址反推出私钥
  • 完全控制:拥有私钥 = 拥有该地址上的所有比特币
  • 不可恢复:无法通过任何方式恢复丢失的私钥

私钥生成

比特币的私钥通过密码学随机数生成器创建:

步骤:
1. 从操作系统的熵源(如 /dev/urandom)获取随机数据
2. 通过 SHA256 哈希处理
3. 得到一个256位的数字
4. 检查是否在有效范围内(1 到 n-1)
5. 如果有效,即为私钥;否则重复步骤

关键要求:
- 必须使用密码学安全的随机数生成器
- 不能使用弱随机数源(会导致私钥可被猜测)

WIF格式(Wallet Import Format)

WIF 是比特币钱包导入的标准格式:

创建过程:
1. 私钥:0x [64个十六进制字符]
2. 添加版本前缀:0x80 + 私钥
3. 如果需要压缩格式,添加后缀:0x80 + 私钥 + 0x01
4. 计算校验和:SHA256(SHA256(步骤2或3的结果))的前4个字节
5. 连接:步骤2或3 + 校验和
6. Base58Check 编码

示例:
十六进制私钥:
  e9873d79c6d87dc0fb6a5778633389f4453213303da61f20bd67fc233aa33262

对应的 WIF:
  KwdB92NExtvB8p9rYg6GCJD3qsqV7ZWXvvAqo7i5t6SvzojKy5d9

对应的压缩 WIF:
  KwdB92NExtvB8p9rYg6GCJD3qsqV7ZWXvvAqo7i5t6SvzojKy5d9

公钥(Public Key)

定义

公钥是从私钥通过椭圆曲线密码学(ECDSA)派生的数据。可以公开分享,不会暴露私钥。

椭圆曲线密码学(ECDSA)

比特币使用 secp256k1 曲线:

曲线方程:y² = x³ + 7 (mod p)

其中:
p = 2²⁵⁶ - 2³² - 977
  = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F

参数 G(生成点):
Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
Gy = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

公钥格式

格式大小示例说明
未压缩65字节04 + 64字节完整的 x, y 坐标
压缩33字节02/03 + 32字节仅 x 坐标 + 前缀

未压缩公钥:

04 + Qx (32字节) + Qy (32字节)
04 79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
   483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

压缩公钥:

前缀 + Qx (32字节)

前缀规则:
- 如果 Qy 是偶数:02 + Qx
- 如果 Qy 是奇数:03 + Qx

示例:
02 79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798

公钥生成算法

输入:私钥 k(一个256位的数)

步骤:
1. 在椭圆曲线上生成点 Q = k × G
   (其中 G 是生成点,× 表示标量乘法)
   
2. Q 点有两个坐标:
   - Qx(x坐标,256位)
   - Qy(y坐标,256位)
   
3. 根据需要选择公钥格式:
   - 未压缩:04 + Qx + Qy
   - 压缩:02/03 + Qx

输出:公钥(33字节或65字节)

性质:
- 这是单向的:从私钥可以计算公钥
- 从公钥无法反推出私钥(椭圆曲线离散对数问题)

公钥验证

公钥用于验证交易签名:

验证过程(ECDSA):
1. 接收交易数据、签名(r, s)和公钥 Q
2. 计算哈希:z = SHA256(交易数据)
3. 计算:w = s⁻¹ mod n
4. 计算:u1 = z·w mod n
5. 计算:u2 = r·w mod n
6. 计算点:R = u1·G + u2·Q
7. 如果 R 的 x 坐标等于 r,签名有效

比特币地址(Bitcoin Address)

定义

比特币地址是比特币账户的标识符,由公钥派生而来。是接收比特币的"账号"。

地址生成过程

私钥
  ↓ (ECDSA)
公钥(未压缩或压缩)
  ↓ (SHA256)
哈希A(32字节)
  ↓ (RIPEMD160)
哈希B(20字节)
  ↓ (添加版本前缀 + 校验和)
地址

详细步骤

以 P2PKH(Pay-to-Public-Key-Hash)为例:

第1步:获得公钥
公钥 = 02 79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798

第2步:SHA256 哈希
SHA256(公钥) = 0x1 AF635D FBEE3E3B E8547C1D EBED3D2B 3F4A59A0 7ACFB80A E0A4D0DB C73F5B31

第3步:RIPEMD160 哈希
RIPEMD160(SHA256(公钥)) = 0x 62E907B15CBF27D5425399EBF6F0FB50EBB88F18

第4步:添加版本前缀(主网为 0x00)
0x00 + 62E907B15CBF27D5425399EBF6F0FB50EBB88F18

第5步:计算校验和
SHA256(SHA256(第4步)) = 0x A9F0BEEC ... (取前4字节) = A9F0BEEC

第6步:连接地址
0x00 62E907B15CBF27D5425399EBF6F0FB50EBB88F18 A9F0BEEC

第7步:Base58Check 编码
1A1z7agoat2Pt7h51SJruC3BgAsM5QKZca

Base58Check 编码

Base58Check 是比特币专用的编码方式,相比 Base64:

  • 移除了易混淆的字符:0(零)、O(大写o)、I(大写i)、l(小写L)
  • 避免了 +、/ 等特殊字符(不需要 URL 编码)
  • 包含校验和,防止输入错误
字符集:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
       (52个字符)

密钥推导

确定性推导(Deterministic Derivation)

比特币支持从单个私钥确定性地生成多个地址,无需存储多个私钥。

非分层推导

最简单的形式:

python
for i in range(n):
    private_key_i = SHA256(private_key || i)
    address_i = generate_address(private_key_i)

问题:

  • 无法从公钥计算出其他地址的公钥
  • 缺乏灵活的权限控制

HD钱包(分层确定性钱包)

概述

HD Wallet (Hierarchical Deterministic Wallet) 是BIP32标准定义的一种钱包结构,允许从单个种子确定性地生成大量的公钥-私钥对,同时支持分层访问控制。

核心特性

  • 单一种子(Seed):整个钱包由一个随机种子生成
  • 分层结构:支持多层级的密钥推导
  • 确定性:相同的种子总是生成相同的钱包
  • 公钥推导:可以从公钥继续推导出子公钥(不需要私钥)
  • 隔离风险:子钱包的泄露不会导致主钱包泄露

BIP32 标准

HD钱包遵循 BIP32(比特币改进方案32)标准。

层级结构:

m (主私钥)
├── m/0 (账户 0)
│   ├── m/0/0 (外部链)
│   │   ├── m/0/0/0 (接收地址 0)
│   │   ├── m/0/0/1 (接收地址 1)
│   │   └── ...
│   └── m/0/1 (内部链 / 找零链)
│       ├── m/0/1/0 (找零地址 0)
│       ├── m/0/1/1 (找零地址 1)
│       └── ...
├── m/1 (账户 1)
└── ...

BIP44 路径标准

最常用的推导路径遵循 BIP44 标准:

m / purpose' / coin_type' / account' / change / address_index

其中:
- m:主密钥
- purpose':币种用途(通常为44',表示BIP44)
- coin_type':币种(0'表示比特币)
- account':账户号
- change:0表示外部链(接收),1表示内部链(找零)
- address_index:地址索引

示例路径:
m/44'/0'/0'/0/0:比特币,账户0,外部链,第0个地址
m/44'/0'/1'/0/5:比特币,账户1,外部链,第5个地址
m/44'/0'/0'/1/0:比特币,账户0,内部链(找零),第0个地址

密钥推导过程

扩展密钥结构:

扩展私钥 = 私钥 (256位) + 链码 (256位) = 512位
扩展公钥 = 公钥 (33字节) + 链码 (256位) = 65字节

强化推导(Hardened Derivation) 用上标 ' 表示:

普通子密钥推导(可从公钥推导):
C_k = HMAC-SHA512(Key=c_parent, Data=公钥_parent || i)
(其中 i < 2³¹)

强化子密钥推导(需要私钥):
C_k = HMAC-SHA512(Key=c_parent, Data=0x00 || 私钥_parent || i')
(其中 i' ≥ 2³¹)

好处:
- 普通推导:可以从扩展公钥生成子公钥
- 强化推导:即使子私钥泄露,也无法计算出父私钥

种子恢复短语(Mnemonic Seed Phrase)

HD钱包通常使用助记词短语备份和恢复,遵循 BIP39 标准。

过程:
1. 生成熵(128-256位)
2. 计算校验和
3. 转换为单词列表

示例(12字助记词):
abandon ability able about above absent absolute absorb abstract absurd abuse access

还原过程:
1. 将单词转换为二进制
2. 通过 PBKDF2 生成 512 位种子
3. 使用种子按 BIP32 推导主密钥

地址类型

比特币支持多种地址格式,代表不同的脚本类型:

1. P2PKH (Pay-to-Public-Key-Hash)

格式:1开头,26-35字符
示例:1A1z7agoat2Pt7h51SJruC3BgAsM5QKZca

锁定脚本:
OP_DUP OP_HASH160 <公钥哈希> OP_EQUALVERIFY OP_CHECKSIG

解锁脚本:
<签名> <公钥>

特点:
- 最早的地址格式
- 较大的交易体积
- 广泛支持

2. P2SH (Pay-to-Script-Hash)

格式:3开头,26-35字符
示例:3J98t1WpEZ73CNmYviecrnyiWrnqRhWNLy

锁定脚本:
OP_HASH160 <脚本哈希> OP_EQUAL

解锁脚本:
<签名> ... <脚本>

特点:
- 支持复杂的脚本(多签名等)
- 接收者定义脚本内容
- 交易体积相对较小

3. P2WPKH (Pay-to-Witness-Public-Key-Hash)

格式:bc1开头 + 39字符,总长度为42字符
示例:bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4

版本:0
证人数据:20字节(公钥哈希)

特点:
- 隔离见证(SegWit)格式
- 交易体积小(见证数据不计入区块大小限制)
- 交易费用低
- 现代的地址格式

4. P2WSH (Pay-to-Witness-Script-Hash)

格式:bc1开头 + 62字符
示例:bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7

版本:0
证人数据:32字节(脚本哈希)

特点:
- 隔离见证版本的 P2SH
- 支持复杂脚本
- 最小交易费用

5. P2TR (Pay-to-Taproot)

格式:bc1开头 + 62字符
示例:bc1p5cyj9mstrsxyz90xda2m3xghm6qv24ace4xjadu2jjwudpxqkedpxq23 frv

版本:1
证人数据:32字节(Taproot输出密钥)

特点:
- 最新的比特币地址格式(Taproot升级,2021年)
- 支持复杂脚本和隐私保护
- 最优的交易费用
- 链上不可区分普通和脚本支付

地址格式对比

格式前缀大小费用特性推出时间
P2PKH126-35字符基础格式2009年
P2SH326-35字符脚本支持2012年
P2WPKHbc142字符SegWit2017年
P2WSHbc162字符SegWit + 脚本2017年
P2TRbc162字符最低Taproot2021年

钱包和密钥管理

钱包类型

1. 热钱包(Hot Wallet)

特点:
- 私钥存储在互联网连接的设备上
- 方便快速交易
- 风险较高
- 适合小额日常使用

示例:
- 交易所钱包
- 移动钱包
- 浏览器插件钱包

2. 冷钱包(Cold Wallet)

特点:
- 私钥存储在离线设备上
- 安全性高
- 交易过程复杂
- 适合大额长期存储

示例:
- 硬件钱包(Ledger、Trezor)
- 纸钱包
- 离线计算机

密钥存储方案

单签名(1-of-1):

结构:
1个私钥 → 1个公钥 → 1个地址

风险:
- 单点故障:私钥丢失 = 资金丢失
- 单点攻击:私钥泄露 = 资金被盗

应用:
- 个人钱包
- 日常使用

多重签名(M-of-N):

结构:
N个私钥,需要M个签名才能花费

示例:2-of-3 多签
- 生成3个私钥,分别保管在3个不同位置
- 支付时需要其中2个私钥签署交易
- 丢失1个私钥仍能操作;2个私钥被盗才能转移资金

应用:
- 企业金库
- 大额资金管理
- 高安全性需求

安全最佳实践

1. 私钥生成

✓ 必须
  - 使用密码学安全的随机数生成器
  - 确保有足够的熵源
  - 在离线环境生成(如有可能)

✗ 避免
  - 使用弱随机数源(rand()、系统时间等)
  - 人工选择数字
  - 可预测的模式

2. 私钥存储

✓ 最佳实践
  - 使用硬件钱包(最安全)
  - 冷存储(离线保管)
  - 多个备份在不同位置
  - 加密存储
  - 多重签名

✗ 永远不要
  - 将私钥存放在热钱包中
  - 将私钥分享给任何人
  - 在互联网连接的设备上明文存储
  - 通过邮件、短信、聊天工具传输

3. 备份和恢复

✓ 安全的备份方式
  - 助记词(12或24字)写在纸上
  - 多个副本存放在不同物理位置
  - 防火防水防潮
  - 考虑使用保险箱

✗ 不安全的方式
  - 数字副本(截图、文本文件)
  - 云存储(即使加密)
  - 照片或视频

4. 地址使用

✓ 推荐做法
  - 每次交易使用新地址
  - 定期轮换地址
  - 使用 HD 钱包管理多个地址
  - 区分接收和找零地址

✗ 避免
  - 重复使用同一地址(隐私问题)
  - 在不受信任的服务中输入私钥
  - 将多个账户混在一起

5. 交易签署

✓ 安全的签署过程
  - 在冷设备上离线签署
  - 使用 PSBT(部分签名比特币交易)格式
  - 在广播前验证交易详情
  - 多个验证者确认

✗ 不安全的方式
  - 在热设备上签署
  - 对不清楚内容的交易签署
  - 在他人设备上签署

常见问题

Q1: 我可以从比特币地址反推出公钥吗?

A: 不能。比特币地址是公钥的哈希值,哈希是单向的函数。无法从地址反推出公钥。

但是,如果该地址曾被用来签署交易,签名中会包含公钥信息,之后可以从签名恢复出公钥。

Q2: 如果我丢失了私钥,比特币能被恢复吗?

A: 不能。私钥丢失意味着无法再花费该地址上的比特币,比特币会永久锁定。这就是为什么备份非常重要。

Q3: 为什么要使用 HD 钱包而不是单个私钥?

A: HD 钱包的优势:

  • 只需备份一个种子而不是多个私钥
  • 可以生成无限多个地址
  • 隔离风险:子钱包泄露不会泄露主钱包
  • 支持观察钱包(只看不花)
  • 便于组织管理

Q4: P2PKH 和 P2WPKH 有什么区别?

A:

  • P2PKH:较早的格式,地址以1开头,交易体积较大
  • P2WPKH:隔离见证格式,地址以bc1开头,交易体积小,费用低

P2WPKH 是现代推荐的格式。

Q5: 助记词可以在网上生成吗?

A: 不推荐。即使使用了安全的生成工具,互联网连接的设备也存在被恶意软件监控的风险。

最安全的做法是:

  • 离线生成(空气间隙)
  • 或使用已验证的硬件钱包

Q6: 多重签名真的比单签名安全吗?

A: 是的,在某些场景下:

单签名的风险:

  • 单点故障:丢失私钥
  • 单点攻击:私钥被盗

多重签名(如2-of-3):

  • 一个私钥丢失仍能操作
  • 两个私钥被盗才能转移资金
  • 但交易体积更大,费用更高

Q7: 为什么比特币使用 secp256k1 而不是其他曲线?

A: secp256k1 的特点:

  • 由 Certicom 定义的标准曲线
  • 参数看似随意(实际上是特别选择的),增加了抵抗后门的信心
  • 计算效率相对较高
  • 比特币社区的共识选择

Q8: 我的钱包显示两个地址有相同的公钥,这是怎么回事?

A: 这通常说明钱包软件有问题,可能:

  • 弱随机数生成器产生了碰撞(极其罕见)
  • 钱包软件的漏洞
  • 应立即停止使用并转移资金