比特币私钥、公钥与地址:一篇读懂加密货币所有权的关键

·

当你知晓 私钥、公钥、地址 的真正含义,就能看懂比特币「收发」全过程——甚至亲手用代码生成它们。

1. 收发比特币为何只靠「两把钥匙」

比特币的 所有权控制 完全依赖「非对称加密技术」。
换句话说,你只需创建一组 私钥与公钥对,即可:

👉 深入了解数字签名的数学奥秘,亲自体验一笔链上转账

数字签名与公钥之间存在 独一无二 的数学关系——只有拥有对应私钥的人才能正确签名,但整个过程无需暴露私钥,杜绝了别人窃取分毫的可能。这正是「公钥密码学」早已验证的安全机制,中本聪拿来直接用。

为了人类可读与防错,公钥最终被压缩成一个更短的字符串——地址。你在收款时看到的 bc1...1...3...,就是这些地址。

2. 私钥:一行十六进制数字,串起所有财富

严格意义上,私钥是一个 256 位随机整数
十六进制表示示例:

86fe5f1faa83a8446834408c95974847e28bb34de3798ea01370d5c3a19c4431
只要真·随机,无论你在宇宙任何角落,生成相同私钥的概率都可以忽略不计。

3. 公钥:私钥的「数学倒影」

通过 椭圆曲线 ( secp256k1),把私钥映射为一个坐标点 (x, y),得到公钥。

03fb35af01a88ee95ca11005bb9b03ed442cf05c40040a53353af30f92bb888bbf

👉 立刻用在线可视化工具把任意私钥转成压缩公钥

若需要原始坐标,可通过数学推导还原 y,但绝大多数钱包默认启用压缩公钥,以减少链上体积并节省手续费。

4. 地址:给公钥穿上「人类友好的外套」

4.1 为什么用地址而不用公钥直接转账

特性地址公钥
长度约 25~34 位64/66 位
校验码自动包含校验和
人为手抄容易极易出错

简而言之:地址拥有 内置检查和错误检测,打字有误也能及时发现,降低永远丢币的风险。

4.2 常见地址类型一览

  1. Legacy (P2PKH)
    1 开头,例如:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
  2. P2SH (多重签名/嵌套脚本)
    3 开头,例如:3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy
  3. Bech32 (SegWit)
    bc1q 开头,可节省约 42% 手续费,例如:bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kygt080
  4. 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. 总结:掌握钥匙,掌握资产

把这三者串在一起的数学魔法,就是椭圆曲线。信息稀缺、丢失不可逆 的比特币世界,唯有对「私钥——公钥——地址」的透彻理解,才能让你在链上稳如磐石。