Keys和Address概念
目录
概述
比特币使用非对称加密(Asymmetric Cryptography)来保证安全性和所有权。在这个系统中:
- 私钥 用来签署交易,证明你拥有这些比特币
- 公钥 从私钥派生,用来验证签名和接收比特币
- 比特币地址 从公钥派生,是接收比特币的"账户"
这三者形成了一个链式关系:私钥 → 公钥 → 比特币地址
私钥(Private Key)
定义
私钥是一个256位的随机数,通常以不同的格式表示:
| 格式 | 示例 | 说明 |
|---|---|---|
| 十六进制 | 0x1234567890abcdef... (64个字符) | 计算机内部表示 |
| 十进制 | 长的数字串 | 数值表示 |
| WIF | KwdB92NExtvB8p9r... | 钱包导入格式 |
| 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 编码
1A1z7agoat2Pt7h51SJruC3BgAsM5QKZcaBase58Check 编码
Base58Check 是比特币专用的编码方式,相比 Base64:
- 移除了易混淆的字符:0(零)、O(大写o)、I(大写i)、l(小写L)
- 避免了 +、/ 等特殊字符(不需要 URL 编码)
- 包含校验和,防止输入错误
字符集:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
(52个字符)密钥推导
确定性推导(Deterministic Derivation)
比特币支持从单个私钥确定性地生成多个地址,无需存储多个私钥。
非分层推导
最简单的形式:
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年)
- 支持复杂脚本和隐私保护
- 最优的交易费用
- 链上不可区分普通和脚本支付地址格式对比
| 格式 | 前缀 | 大小 | 费用 | 特性 | 推出时间 |
|---|---|---|---|---|---|
| P2PKH | 1 | 26-35字符 | 高 | 基础格式 | 2009年 |
| P2SH | 3 | 26-35字符 | 中 | 脚本支持 | 2012年 |
| P2WPKH | bc1 | 42字符 | 低 | SegWit | 2017年 |
| P2WSH | bc1 | 62字符 | 低 | SegWit + 脚本 | 2017年 |
| P2TR | bc1 | 62字符 | 最低 | Taproot | 2021年 |
钱包和密钥管理
钱包类型
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: 这通常说明钱包软件有问题,可能:
- 弱随机数生成器产生了碰撞(极其罕见)
- 钱包软件的漏洞
- 应立即停止使用并转移资金
