Base64 私钥 → HEX / WIF / 地址
粘贴一个 Base64 编码的 32 字节私钥,得到解码后的 HEX、解码字节数、两个 WIF、两个公钥、hash160 以及全部 5 类地址。Base64 是没有校验和的传输编码,所以本页会先核对解码长度,再决定是否相信它。
请在上方输入内容后点击「转换」。不知道填什么?点「填入示例」即可载入占位符里的演示数据。
本页计算了什么
有些钱包、交易所和基于 OpenSSL 的工具从来不把私钥显示成 64 位十六进制,而是把原始的 32 字节打印成 Base64。原因是 Base64 能安然通过任何「只认文本」的通道:JSON、INI 配置文件、聊天消息、 二维码、剪贴板。本页就是把这一步反过来:把文本解回字节,确认它确实是一个合法的 secp256k1 私钥,然后 在它身上跑完整条推导链。
它从不猜测:解码长度不是 32 字节就报错;输入框为空只会得到「还没有输入」的状态,而不是结果。
1. Base64 字母表,以及为什么是 64 个符号
私钥是 32 字节,而一个字节可以取 256 种值 —— 其中大约一半是控制字符、引号,或者在文本协议里根本 不合法的字节。Base64 绕开这一切的办法,是把比特位重新分组:每 6 位一组,每一组映射到 64 个无害可打印字符之一。
为什么是 64?因为 26 = 64,而 6 位是可以映射到可打印 ASCII 的最大分组:7 位需要 128 个 符号,而 ASCII 高半区大部分是控制码。字母表是固定且公开的,一个字符就代表一个 6 位值 —— 仅此而已:
| 下标 | 字符 | 个数 | 说明 |
|---|---|---|---|
| 0 – 25 | A … Z | 26 | 大写字母 |
| 26 – 51 | a … z | 26 | 所以 A ≠ a |
| 52 – 61 | 0 … 9 | 10 | 数字 |
| 62 | + | 1 | 会破坏 URL |
| 63 | / | 1 | 会破坏文件路径 |
| — | = | — | 不是符号,而是补位标记 |
26 + 26 + 10 + 1 + 1 = 64。从 000000 到 111111 的每一个
6 位值都恰好对应一个字符,每个字符也恰好对应一个值。全部玄机就在这里。
2. 四个字符装三个字节 —— 以及「=」从哪来
一个字符 6 位、一个字节 8 位,两者对不齐。同时是二者整数倍的最小长度是 24 位: 24 = 3 字节 = 4 个 Base64 字符。所以 Base64 总是按 3 字节一块地处理输入、每块输出 4 个字符,在数据流中间不浪费任何一个比特。
32 字节不是 3 的倍数,所以最后一块是残缺的,必须补位。演示私钥的算术如下:
n = 32 字节
完整块数 = floor(32 / 3) = 10 -> 10 × 4 = 40 个字符
剩余 = 32 mod 3 = 2 字节 -> 需要 ceil(2·8 / 6) = 3 个字符
补位 = 4 − 3 = 1 -> 一个「=」标记
合计 = 40 + 3 + 1 = 44 个字符 = 4 · ⌈32/3⌉
这与示例完全吻合:44 个字符,以单个 = 结尾。
| 输入 | 示例 | 编码结果 | 补位 | 字符数 |
|---|---|---|---|---|
| 1 字节 | 01 | AQ== | 2 个 = | 4 |
| 2 字节 | 0102 | AQI= | 1 个 = | 4 |
| 3 字节 | 010203 | AQID | 无 | 4 |
| 20 字节(hash160) | 21f57b6d…189012 | IfV7bevPxbZxgt+0rxZB8KgYkBI= | 1 个 = | 28 |
| 32 字节(私钥) | 本页的演示私钥 | CCTDFHcr…ehcco= | 1 个 = | 44 |
| 33 字节 | 私钥再加一个字节 | — | 无 | 44 |
最后两行很关键:32 字节和 33 字节的数据都编码成 44 个字符,唯一能把它们分开的就是 =
的个数 —— 一个补位表示 n mod 3 = 2,零个补位表示 n mod 3 = 0。光看字符
永远推不出字节长度。
Base64 的长度永远是 4 的倍数,而结尾 = 的个数能反推出 n mod 3:
0 个补位 → n ≡ 0,1 个 → n ≡ 2,2 个 → n ≡ 1。所以解码后的
字节数在解码之前就已经确定 —— 本页把它作为结果的一项显示出来,因为私钥必须正好解码成
32 字节。
3. 编码既不是加密,也不是压缩
- 加密是用秘密把数据藏起来。Base64 没有任何秘密:字母表写在 RFC 4648 里,映射是一一 对应的,任何人拿到字符串都能用一行代码解出来。一个 Base64 私钥就是一把明文私钥。
- 压缩靠利用冗余把数据变小。Base64 恰好相反 —— 它总是让数据变大,因为 8 位输入要 花掉 4/3 个字符。均匀随机的 256 位私钥没有任何冗余可供压缩,所以「压缩过的 Base64 私钥」本身 就是自相矛盾。
- 编码只改变表示形式,好让字节能通过只接受文本的通道。Base64 干的就是 这一件事。
| 同一把 32 字节私钥的表示 | 字符数 | 相对原始字节 | 每字符位数 |
|---|---|---|---|
| 原始字节 | 32 字节 | 1.00×(基准) | 8 位 |
| Base64 | 44 | 1.375×(+37.5 %) | 6 位 |
| 十六进制 | 64 | 2.00×(+100 %) | 4 位 |
| Base58(裸编码) | 43 | 1.344×(+34.4 %) | 约 5.858 位 |
| WIF 压缩(Base58Check) | 52 | 1.625×(+62.5 %) | 约 5.858 位 |
对这个长度来说,Base64 是最紧凑的文本字母表 —— 44 个字符对十六进制的 64 个 —— 但它仍然比原始字节大 37.5 %。它在安全性上什么也没换来,换来的全是兼容性。
4. Base64 与十六进制、Base58、Bech32 的对比
比特币生态里同时存在四种文本字母表,选错解码器是「造出一把没有钱包认得的密钥」的最常见原因之一。
| Base64 | 十六进制 | Base58 / Base58Check | Bech32 / Bech32m | |
|---|---|---|---|---|
| 字母表大小 | 64 | 16 | 58 | 32 |
| 符号集 | A–Z a–z 0–9 + / | 0–9 a–f | 1–9 A–Z a–z 去掉 0 O I l | qpzry9x8gf2tvdw0s3jn54khce6mua7l |
| 每字符位数 | 6 | 4 | 约 5.858 | 5 |
| 区分大小写 | 是 | 否 | 是 | 否,但禁止大小写混用 |
| 校验和 | 没有 | 没有 | 仅 Check 变体有(4 字节 SHA256d) | 有 —— 6 字符 BCH 校验码 |
| 错字检测 | 无 —— 改一个字符就悄悄变成另一份数据 | 无 | 几乎能拦住所有错字 | 可检出错 4 个,可定位 2 个 |
| 典型用途 | PEM/DER 文件、JSON 配置、API 导出 | BIP 测试向量、调试输出 | 传统地址、WIF | SegWit 地址 |
5. Base64 私钥究竟从哪里来
比特币核心自己导出的是 WIF,不是 Base64。Base64 私钥出现在比特币与通用软件之间的接缝处:
- OpenSSL/PEM 私钥文件。 文件正文是 ASN.1 DER 结构的 Base64。把其中 32 字节的原始 标量取出来、再用 Base64 打印,是一条标准的迁移路径。
- 应用配置文件。 JSON 没有字节类型,所以凡是用 JSON 保存签名密钥的服务几乎都存成
Base64 —— PHP 的
base64_encode()、Python 的base64.b64encode()、 .NET 的Convert.ToBase64String()。 - 交易所与 API 导出。 一些托管服务给你的「原始私钥」是 Base64 而不是 WIF,因为 它们后端的密钥体系并非比特币专用。
- 二维码与纸质备份。 44 个字符能塞进低密度二维码 —— 不过 Base64 自己带来了
+//这两类麻烦。
如果一段字符串解出来有 300 个字节,那它是 PEM/DER 密钥文件、keystore 或备份归档,而不是 32 字节的 原始标量。因此本页强制校验精确长度,超过 32 字节就直接拒绝,而不是把它截断成一把看起来合法、实际却 控制着别的东西的密钥。
6. 实例演算 —— 演示私钥的各种表示
下面就是本页对输入框里的示例 Base64 算出的值:
| 步骤 | 值 |
|---|---|
Base64 输入(44 字符,1 个 =) | CCTDFHcrLChZyIlHE5Cja/ZuU6HKFkL5bw8skwehcco= |
| 解码得到的十六进制(64 位) | 0824c314772b2c2859c889471390a36bf66e53a1ca1642f96f0f2c9307a171ca |
| 解码长度 | 32 字节 = 256 位 |
| 补位字符个数 | 1 → 与 32 mod 3 = 2 一致 |
| 重新编码的 Base64 | CCTDFHcrLChZyIlHE5Cja/ZuU6HKFkL5bw8skwehcco= —— 完全一致,说明没有丢信息 |
| WIF(压缩) | KwVYL77Lcs1ckM39NvGjrtfKhU4KKdR2iB9Wq2FSMN6rbGK5tVqG |
| WIF(非压缩) | 5HssbguBnjbaUVZCsH9YuzUG7T4vYQf51iiodi4izdVy6aVNekU |
| P2PKH 地址 | 146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT |
| P2WPKH 地址 | bc1qy86hkm0telzmvuvzm76279jp7z5p3yqjnaerk6 |
现在只改一个字符 —— 开头的 C 换成 0。两者都是合法的 Base64 符号,所以
解码器没有任何理由报错:
原始 —— CC…
CCTDFHcrLChZyIlHE5Cja/ZuU6HKFkL5bw8skwehcco=
解出 0824c314…171ca,P2PKH
146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT
差一个字符 —— 0C…
0CTDFHcrLChZyIlHE5Cja/ZuU6HKFkL5bw8skwehcco=
解出 d024c314…171ca,P2PKH
1HW3HfyXS3UFRJDMQ5LJjVyk12UMf6uoGB
第一个字节从 08 变成 d0,整把私钥、两个 WIF 和所有地址全都跟着变了。
Base64 对此一声不响。
Base58Check 和 Bech32 都把校验和写在字符串内部,所以打错一个字符会立刻被发现(WIF 会直接拒绝 解码)。Base64 什么都没有:写错一个字符会得到一把完全合法却完全不同的私钥,而你第一次 察觉到这件事,通常是在看到余额为零的时候。在把资金转到一个由 Base64 导出推导出的地址之前,请把解码 后的字节重新编码一遍,逐字符对比两个字符串。
7. Base64 与 WIF 不是同一样东西的两种写法
两者都是同一把 32 字节秘密的文本编码,相似之处到此为止。WIF 是
Base58Check(0x80 ‖ 私钥 ‖ 0x01):它多了一个标明网络的版本字节、一个说明该密钥是否按压缩
形式使用的标志字节,以及 4 字节双 SHA256 校验和。Base64 除了补位符什么都没加。
| 演示私钥的形式 | 字母表 | 版本字节 | 压缩标志 | 校验和 | 长度 |
|---|---|---|---|---|---|
| 十六进制 | 16 | — | — | 无 | 64 |
| Base64 | 64 | — | — | 无 | 44 |
| WIF 非压缩 | 58 | 0x80 | 无 | 4 字节 | 51 |
| WIF 压缩 | 58 | 0x80 | 0x01 | 4 字节 | 52 |
最实用的判别方法就是看字母表。Base58 排除 0、O、I、
l,正是为了让手抄的纸钱包不会被看错;它同样排除 +、/、
=。而 Base64 全都在用。所以,含有 +、/ 或 = 的
字符串不可能是 WIF;含有 0、O、I 或
l 的字符串则根本不是 Base58。
反过来的测试才是危险的。Base58 的每一个字符同时也是合法的 Base64 字符,而压缩 WIF 正好是 52 个
字符 —— 恰好能被 4 整除。把 KwVYL77Lcs1ckM39NvGjrtfKhU4KKdR2iB9Wq2FSMN6rbGK5tVqG
丢进 Base64 解码器,它不报错,反而解出 39 个字节。这就是本页要自己检查长度、并把字节数
当成一等结果展示的原因。一个会接受 WIF 的 Base64 输入框,只会递给你一把 39 字节、根本不是你的密钥的
「私钥」。
8. 本页会拒绝什么,为什么拒绝
| 输入 | 结果 | 原因 |
|---|---|---|
CCTDFHcr…ehcco= | 接受 | 44 字符、1 个补位,恰好解出 32 字节 |
CCTDFHcr…ehcco(去掉补位) | 接受 | 多数解码器不强制要求尾部补位;本页会重新编码成规范形式 |
CCTDFHcr…ehcco== | 拒绝 | 最多两个 =,且只能在最末尾 |
CCTDFHcr…cc=o | 拒绝 | 补位符出现在中间 |
CCTDFHcr…cc! | 拒绝 | 出现了 64 个符号之外的字符 |
…cc-cc_=(base64url) | 拒绝 | URL 安全版把 +// 换成 -/_,是另一套字母表 |
| 中间夹着空格或换行 | 接受 | 本页先剥掉空白,所以折行粘贴也能用 |
| 解出 33 或 34 字节 | 拒绝 | 原始私钥必须正好 32 字节 |
| 把 WIF 粘到这里 | 拒绝 | 会解出 39 或 38 字节 —— 被识别并拒绝,而不是被加工成一个错结果 |
| 一个 hash160(20 字节) | 拒绝 | 太短:那是公钥哈希 |
有一个细节值得注意:Base64 不是单射。残缺的最后一块里,放不下的比特会被忽略,所以
对 32 字节的密钥来说,…ehcco= 与 …ehccp= 会解出完全相同的
字节,尽管字符串并不一样,而解码器两者都收。不要用字符串相等判断两把密钥是否相同 —— 先解码,再比字节。
9. 安全须知与常见错误
- Base64 就是明文。 不是混淆、不是加密、也不是密码:任何能读到这串字符的人,都能 花掉它所保护的那些币。
- 永远不要把真实的私钥输进你无法控制的网页。 本页在你正在访问的这台服务器上完成 计算、不向别处发送数据 —— 但有资金的私钥属于硬件钱包或离线机器。
- 没有校验和,就没有错字警报。 如果非要手抄密钥,请抄成 WIF,让那 4 字节校验和 替你干活。
- 把 Base64 当成加密,或者指望它比原始字节更短。「看起来像乱码」不构成保护, 44 个字符也仍然多于 32 字节。
- 把 WIF 或 PEM 文本块粘进来。 WIF 会解码成功(得到 39 字节),因为 Base58 是 Base64 字母表的子集;PEM 正文解出来是 DER,有几百字节长。
- 使用 base64url 数据。 JWT 风格
-/_不是标准 Base64; 转换只需替换两个字符,但解码器会直接拒绝。 - 用字符串比较两把 Base64 密钥,而不是比较解码后的字节。
10. 速查表
| 项目 | 值 |
|---|---|
| 解码后长度 | 必须正好 32 字节(256 位) |
| 字母表 | A–Z a–z 0–9 + /,= 作补位 |
| 长度公式 | 4 · ⌈n/3⌉,永远是 4 的倍数 |
| 补位规则 | n mod 3 = 0 → 无,1 → 两个,2 → 一个 |
| 32 字节私钥的长度 | 44 个字符,比原始字节多 37.5 % |
| 校验和 | 无 —— 错字无法被检测 |
| 是加密/压缩吗 | 都不是:它是一种可逆的传输编码 |