Base58 编码器和解码器
输入
Base58 是一种二进制到文本的编码,设计时避开了若干容易混淆的字符。Bitcoin 字母表不使用 0 O I l 和 + /,其他系统则会以不同顺序排列相同的 58 个符号。旧式 Bitcoin Base58Check 地址和 IPFS CIDv0 字符串是常见示例。此工具完全在浏览器中运行,可使用 Bitcoin、Ripple 或 Flickr 字母表转换 UTF-8 文本或精确的十六进制字节,并拒绝所选字母表以外的字符。
如何编码和解码 Base58
-
1
输入字节或 Base58 字符串
编码方向接受十六进制或原始文本;解码方向接受 Base58。
-
2
需要时选择字母表
默认是 Bitcoin 的 Base58;也提供 Ripple 和 Flickr 变体用于兼容。
-
3
运行转换
Base58 不会分成整齐的 5 比特或 6 比特组;它会被当作一个大端整数,并反复除以 58。
-
4
复制结果
编码后的字符串会把开头的零字节保留为开头的 `1` 字符(Bitcoin 字母表中表示零的字形)。
Bitcoin Base58 字母表
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
注意缺少的字符:0、O、I、l。字母表中的第一个字符是 1,代表整数 0。
它实际如何工作
不同于 Base64 把比特分成固定组,Base58 会把整个字节串看作一个大端整数 N,并用 58 进制表示:
result = []
while N > 0:
result.prepend(alphabet[N mod 58])
N = N / 58
for each leading zero byte in input:
result.prepend(alphabet[0]) # i.e. '1'
这就是为什么 Base58 编码不适合简单流式处理,你需要拿到整个数字后才能输出任何字符。
Base58 vs Base58Check
旧式 P2PKH 地址的典型 Base58Check 负载为 25 字节:1 字节版本、20 字节哈希和 4 字节校验和。校验和取版本与哈希进行两次 SHA-256 后的前 4 字节。将完整负载编码为 Base58,便得到常见的地址字符串。
此工具只转换普通 Base58。需要检查地址版本和校验和时,请使用专门的 Base58Check 校验器。
字母表变体
| 变体 | 使用场景 | 与 Bitcoin 的差异 |
|---|---|---|
| Bitcoin | BTC 地址、IPFS CIDv0 | 基准 |
| Ripple | XRP 地址 | 位置有交换 |
| Flickr | 短图片 URL | 小写在大写之前 |
为什么不直接用 Base64?
Base64 在二进制和编码文本之间的长度变化固定(每 3 个字节变 4 个字符),效率很高。Base58 开销略有变化,但没有歧义字符;当有人必须手动复制地址或在电话里念出来时,这正是你想要的。
常见问题
不是普遍更好。人类处理字符串时 Base58 更好;机器传输时 Base64 更好。Base64 每个字符编码 6 比特,而 Base58 约为 5.86,所以 Base64 略紧凑。
Base58 编码的是一个大整数,所以长度会根据高位比特不同而差一两个字符。典型的 P2PKH 地址是 34 个字符,但 33 个也可能出现。
此工具可以把字符串解码为原始字节;请选择十六进制输出,以便无损显示任意字节。它不会检查版本或校验和,因此能够解码并不代表地址有效。验证地址需要使用 Base58Check 校验器。
可以。输入开头的每个零字节都会在输出中变成一个 1 字符,这正是以 1 开头的 Bitcoin 地址的工作方式。
相关工具
bcrypt 哈希生成器
生成 bcrypt 哈希,或用明文密码对照已有的 bcrypt 哈希进行验证。一个工具内并排支持生成和验证。
凯撒密码编码器
使用凯撒密码加密和解密文本。支持任意 1-25 位移,ROT13 可作为特殊情况处理,并保留标点和大小写。
Atbash 密码编码器
使用 Atbash 密码编码或解码文本,这是一种把 A-Z 映射为 Z-A 的希伯来替换法。同一个操作既可加密也可解密。
Base32 编码器和解码器
使用 RFC 4648 字母表编码和解码 Base32 字符串。适用于 TOTP 密钥、大小写不敏感的令牌和人工输入的标识符。
bcrypt 生成器
从 plaintext password 生成 bcrypt hash。Cost factor 可在 4 到 14 之间调整,兼容 Laravel、Django、Node 和 PHP。
A1Z26 密码编码器
使用 A1Z26 密码(A=1, B=2, ... Z=26)编码文本,或把数字序列解码回字母,并可自定义分隔符。