Base32 的用途
Base32 解决与 Base64 相同的基本问题:它用一小组可打印字符重写任意字节,使它们能通过只接受文本的通道。让它与众不同的是其字母表的形状。Base32 只使用 26 个大写字母 A-Z 和数字 2-7,共 32 个符号。它有意省略 0、1 和 8,并且大小写不敏感。这使它难以读错,也便于安全地输入、在电话中口述或印在标签上,而不会把 O 与 0 或 l 与 1 混淆。
这种稳健性的代价是体积。Base64 以每三个字节四个字符的比率打包数据,而 Base32 密度较低,因此对相同的输入其输出明显更长。
5 位分组如何工作
Base64 以 6 位为一组工作,因为 2⁶ = 64。Base32 以 5 位为一组工作,因为 2⁵ = 32。每个 5 位片段是一个 0 到 31 的数字,每个值对应字母表中的一个字符(A=0 到 Z=25,然后 2=26 到 7=31)。
不方便之处在于 5 不能整除 8。Base64 的 24 位窗口(3 个字节作为 4 组)干净地对齐;Base32 最小的干净窗口是 40 位,也就是编码为 8 个字符的 5 个字节。因此 Base32 每次读取五个字节的输入,每块输出八个字符。
填充至 8 个字符的块
由于自然块是八个字符,当输入不在 5 字节边界结束时,编码器用 = 把最后一块填充到八个字符。只有某些剩余大小是有效的:填充前长度为 2、4、5 或 7 的最后一块对应整数个字节,而长度 1、3 和 6 不能,会标志着一个格式错误的字符串。与 Base64 一样,= 不是数据;它只是恢复块长度,使解码器能够还原出确切的原始字节。
取输入 foobar。它的 Base32 编码是 MZXW6YTBOI======:八个数据字符,后跟六个填充字符以补全第二块。把它解码,六个原始字节就回来了。
你会在哪里遇到它
Base32 出现在人直接处理编码值的地方。 和 的双因素密钥以 Base32 字符串共享,这就是为什么一个身份验证应用的设置密钥全是大写字母和 2 到 7 的数字。 的 onion 地址是用 Base32 编码的公钥。某些 DNS 记录和文件同步系统出于同样的原因使用它:该值可能被朗读、手动输入或在不区分大小写的情况下存储,而 Base32 能容忍这三者。
当一个字符串全是大写字母 A-Z 和 2-7,也许以 = 结尾时,Base32 是个不错的猜测。
试一试
在 codec 工具中选择 Base32,把文本编码为 Base32 或解码一个 Base32 字符串,全部在你的浏览器中完成。它容忍小写输入和缺失的填充,并标记出二进制而非可读文本的结果。