当你知晓 私钥、公钥、地址 的真正含义,就能看懂比特币「收发」全过程——甚至亲手用代码生成它们。
1. 收发比特币为何只靠「两把钥匙」
比特币的 所有权控制 完全依赖「非对称加密技术」。
换句话说,你只需创建一组 私钥与公钥对,即可:
- 收币:把公钥锁进交易的输出(output)中,供他人转账。
- 发币:用私钥在输入(input)里生成「数字签名」,解锁先前收到的比特币,使之成为下一笔交易的输出。
数字签名与公钥之间存在 独一无二 的数学关系——只有拥有对应私钥的人才能正确签名,但整个过程无需暴露私钥,杜绝了别人窃取分毫的可能。这正是「公钥密码学」早已验证的安全机制,中本聪拿来直接用。
为了人类可读与防错,公钥最终被压缩成一个更短的字符串——地址。你在收款时看到的 bc1... 或 1...、3...,就是这些地址。
2. 私钥:一行十六进制数字,串起所有财富
严格意义上,私钥是一个 256 位随机整数。
十六进制表示示例:
86fe5f1faa83a8446834408c95974847e28bb34de3798ea01370d5c3a19c4431- 范围:
0x1到0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140(略小于 2²⁵⁶)。 - 数量:约 10⁷⁷ 分之一概率的重合——宇宙中原子的估计数量都找不出两块一模一样的私钥。
- 依赖随机源:操作系统内部 CSPRNG(密码学安全随机数发生器)决定其随机性。
只要真·随机,无论你在宇宙任何角落,生成相同私钥的概率都可以忽略不计。
3. 公钥:私钥的「数学倒影」
通过 椭圆曲线 ( secp256k1),把私钥映射为一个坐标点 (x, y),得到公钥。
- 坐标系极大(大素数域上的椭圆曲线)。
- 压缩格式 只保留 x 坐标 + 一个奇偶位,节省 32 字节,最常见形态为 33 字节的十六进制串:
03fb35af01a88ee95ca11005bb9b03ed442cf05c40040a53353af30f92bb888bbf若需要原始坐标,可通过数学推导还原 y,但绝大多数钱包默认启用压缩公钥,以减少链上体积并节省手续费。
4. 地址:给公钥穿上「人类友好的外套」
4.1 为什么用地址而不用公钥直接转账
| 特性 | 地址 | 公钥 |
|---|---|---|
| 长度 | 约 25~34 位 | 64/66 位 |
| 校验码 | 自动包含校验和 | 无 |
| 人为手抄 | 容易 | 极易出错 |
简而言之:地址拥有 内置检查和错误检测,打字有误也能及时发现,降低永远丢币的风险。
4.2 常见地址类型一览
- Legacy (P2PKH)
以1开头,例如:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa - P2SH (多重签名/嵌套脚本)
以3开头,例如:3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy - Bech32 (SegWit)
以bc1q开头,可节省约 42% 手续费,例如:bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kygt080 - Bech32m (Taproot)
以bc1p开头,启用 Schnorr 签名、更高级脚本功能。
FAQ:快速回答用户最关心的 5 个问题
Q1:我的「助记词」里包含私钥了吗?
A:是的。助记词按 BIP-39 翻译种子,再经 BIP-32「确定性分层推导」得到多个私钥/公钥。只要记住 12~24 个单词,就能恢复整个钱包。
Q2:把私钥打印在纸上会不会被黑客拍照盗取?
A:只要照片分辨率无法还原凌乱手写字迹或二维码细节,就安全。更稳妥的做法是使用 钢板金属铭牌 物理保存。
Q3:一台电脑能不能离线生成私钥?
A:完全可以。安装 开源冷钱包工具(离线运行、关闭网络),配合 骰子输入 的「高熵私钥」最安全。
Q4:别人拿到我公钥可以偷走比特币吗?
A:不行。公钥只能「收币」,不能「花钱」。只有对应的私钥才能解锁资金,这就像你家大门钥匙(私钥)和门牌号码(公钥)一样,门牌路人皆知无碍安全。
Q5:Vanity 地址自己算会不会把电脑烧坏?
A:随机碰撞几十万次即可得到自定义前缀(如 1Love 开头)。现代 CPU/GPU 可在数分钟得出五位数定制前缀,电费不过几分钱,占用资源有限。
5. 实战案例:5 行 Python 生成「压缩地址」
从零到一体验「私钥→公钥→地址」全链路:
from os import urandom
from ecdsa import SigningKey, SECP256k1
from hashlib import sha256, ripemd160
import base58
# 步骤 1:生成随机私钥
sk = SigningKey.generate(curve=SECP256k1)
priv_hex = sk.to_string().hex()
# 步骤 2:导出压缩公钥
vk = sk.verifying_key
pub_hex = "03" + format(vk.pubkey.point.x(), '064x')
# 步骤 3:计算地址
hash160 = ripemd160.new(sha256(bytes.fromhex(pub_hex)).digest()).digest()
address = base58.b58encode_check(b"\x00" + hash160).decode()
print(f"私钥: {priv_hex}\n地址 : {address}")运行输出示例:
私钥: 4dee1f57ab3db0149f1d2e92f0020d47f6cbf234a1e23d8a182c7e1f8f3e2d12
地址 : 1G91L9Ukg6UGsYSeo6PwvN7YjApGmDqXBh提示:仅供学习,放入主网的币要注意离线存储私钥。
6. 总结:掌握钥匙,掌握资产
- 私钥 = 钱包的终极密码,丢失了它就等于永远失去比特币;
- 公钥 = 广播给全网的收据编号,任何人都能验证余额;
- 地址 = 公钥的压缩打印,方便人类眼脑并防人为失误。
把这三者串在一起的数学魔法,就是椭圆曲线。信息稀缺、丢失不可逆 的比特币世界,唯有对「私钥——公钥——地址」的透彻理解,才能让你在链上稳如磐石。