Private Key Tools

Base64 私钥 → HEX / WIF / 地址

粘贴一个 Base64 编码的 32 字节私钥,得到解码后的 HEX、解码字节数、两个 WIF、两个公钥、hash160 以及全部 5 类地址。Base64 是没有校验和的传输编码,所以本页会先核对解码长度,再决定是否相信它。

标准 Base64(A–Z a–z 0–9 + /),= 补位可省略。空白字符会被忽略,所以折行粘贴也能用。解码结果必须正好 32 字节;更长的输入会被拒绝,而不是被截断。它和 Base58 的 WIF 不是一回事。
还没有输入

请在上方输入内容后点击「转换」。不知道填什么?点「填入示例」即可载入占位符里的演示数据。

技术原理详解

本页计算了什么

有些钱包、交易所和基于 OpenSSL 的工具从来不把私钥显示成 64 位十六进制,而是把原始的 32 字节打印成 Base64。原因是 Base64 能安然通过任何「只认文本」的通道:JSON、INI 配置文件、聊天消息、 二维码、剪贴板。本页就是把这一步反过来:把文本解回字节,确认它确实是一个合法的 secp256k1 私钥,然后 在它身上跑完整条推导链。

Base64 长度 = 4 · ⌈n / 3⌉  个字符(n 为输入字节数)
Base64 文本→ 6 位分组→ 原始字节→ 32 字节私钥 k→ WIF/公钥→ 地址

它从不猜测:解码长度不是 32 字节就报错;输入框为空只会得到「还没有输入」的状态,而不是结果。

1. Base64 字母表,以及为什么是 64 个符号

私钥是 32 字节,而一个字节可以取 256 种值 —— 其中大约一半是控制字符、引号,或者在文本协议里根本 不合法的字节。Base64 绕开这一切的办法,是把比特位重新分组:每 6 位一组,每一组映射到 64 个无害可打印字符之一。

为什么是 64?因为 26 = 64,而 6 位是可以映射到可打印 ASCII 的最大分组:7 位需要 128 个 符号,而 ASCII 高半区大部分是控制码。字母表是固定且公开的,一个字符就代表一个 6 位值 —— 仅此而已:

下标字符个数说明
0 – 25A … Z26大写字母
26 – 51a … z26所以 A ≠ a
52 – 610 … 910数字
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 字节01AQ==2 个 =4
2 字节0102AQI=1 个 =4
3 字节010203AQID无4
20 字节(hash160)21f57b6d…189012IfV7bevPxbZxgt+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. 编码既不是加密,也不是压缩

开销 = 4·⌈n/3⌉ / n − 1 = +33.3 %(n 很大时)  →  32 字节私钥为 +37.5 %(44 字符 vs 32 字节)
同一把 32 字节私钥的表示字符数相对原始字节每字符位数
原始字节32 字节1.00×(基准)8 位
Base64441.375×(+37.5 %)6 位
十六进制642.00×(+100 %)4 位
Base58(裸编码)431.344×(+34.4 %)约 5.858 位
WIF 压缩(Base58Check)521.625×(+62.5 %)约 5.858 位

对这个长度来说,Base64 是最紧凑的文本字母表 —— 44 个字符对十六进制的 64 个 —— 但它仍然比原始字节大 37.5 %。它在安全性上什么也没换来,换来的全是兼容性。

4. Base64 与十六进制、Base58、Bech32 的对比

比特币生态里同时存在四种文本字母表,选错解码器是「造出一把没有钱包认得的密钥」的最常见原因之一。

Base64十六进制Base58 / Base58CheckBech32 / Bech32m
字母表大小64165832
符号集A–Z a–z 0–9 + /0–9 a–f1–9 A–Z a–z 去掉 0 O I lqpzry9x8gf2tvdw0s3jn54khce6mua7l
每字符位数64约 5.8585
区分大小写是否是否,但禁止大小写混用
校验和没有没有仅 Check 变体有(4 字节 SHA256d)有 —— 6 字符 BCH 校验码
错字检测无 —— 改一个字符就悄悄变成另一份数据无几乎能拦住所有错字可检出错 4 个,可定位 2 个
典型用途PEM/DER 文件、JSON 配置、API 导出BIP 测试向量、调试输出传统地址、WIFSegWit 地址

5. Base64 私钥究竟从哪里来

比特币核心自己导出的是 WIF,不是 Base64。Base64 私钥出现在比特币与通用软件之间的接缝处:

Base64 数据块常常根本不是私钥

如果一段字符串解出来有 300 个字节,那它是 PEM/DER 密钥文件、keystore 或备份归档,而不是 32 字节的 原始标量。因此本页强制校验精确长度,超过 32 字节就直接拒绝,而不是把它截断成一把看起来合法、实际却 控制着别的东西的密钥。

6. 实例演算 —— 演示私钥的各种表示

下面就是本页对输入框里的示例 Base64 算出的值:

步骤值
Base64 输入(44 字符,1 个 =)CCTDFHcrLChZyIlHE5Cja/ZuU6HKFkL5bw8skwehcco=
解码得到的十六进制(64 位)0824c314772b2c2859c889471390a36bf66e53a1ca1642f96f0f2c9307a171ca
解码长度32 字节 = 256 位
补位字符个数1 → 与 32 mod 3 = 2 一致
重新编码的 Base64CCTDFHcrLChZyIlHE5Cja/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 对此一声不响。

Base64 没有校验和 —— 一个错字就是另一把私钥

Base58Check 和 Bech32 都把校验和写在字符串内部,所以打错一个字符会立刻被发现(WIF 会直接拒绝 解码)。Base64 什么都没有:写错一个字符会得到一把完全合法却完全不同的私钥,而你第一次 察觉到这件事,通常是在看到余额为零的时候。在把资金转到一个由 Base64 导出推导出的地址之前,请把解码 后的字节重新编码一遍,逐字符对比两个字符串。

7. Base64 与 WIF 不是同一样东西的两种写法

两者都是同一把 32 字节秘密的文本编码,相似之处到此为止。WIF 是 Base58Check(0x80 ‖ 私钥 ‖ 0x01):它多了一个标明网络的版本字节、一个说明该密钥是否按压缩 形式使用的标志字节,以及 4 字节双 SHA256 校验和。Base64 除了补位符什么都没加。

演示私钥的形式字母表版本字节压缩标志校验和长度
十六进制16——无64
Base6464——无44
WIF 非压缩580x80无4 字节51
WIF 压缩580x800x014 字节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. 安全须知与常见错误

10. 速查表

项目值
解码后长度必须正好 32 字节(256 位)
字母表A–Z a–z 0–9 + /,= 作补位
长度公式4 · ⌈n/3⌉,永远是 4 的倍数
补位规则n mod 3 = 0 → 无,1 → 两个,2 → 一个
32 字节私钥的长度44 个字符,比原始字节多 37.5 %
校验和无 —— 错字无法被检测
是加密/压缩吗都不是:它是一种可逆的传输编码