Skip to content

Base 系列编码

Base 系列编码(Base-N Encoding)的目的是 将不可读、易出错的“二进制数据”转换成安全的“可打印字符”。

一、 Base 编码的核心原理

Base 家族的名字(如 Base16, Base32, Base64)中的数字 N,代表了这种编码使用了多少个不同的可打印字符来构建。

其底层逻辑是“重新划分比特(Bit)”:

  1. 计算机里的数据都是 8 比特(8-bit)为一个字节(Byte)。

  2. Base 编码会将这些连续的 8-bit 数据流打散,然后按照 新的比特长度 重新分组。

  3. 把新分出来的组,转换为十进制数字,最后去对应的“Base 字典”里查表,替换成对应的字母或符号。

二、 Base 家族核心成员详解

1. Base16 (十六进制编码)

  • 字典集 (16个字符): 0-9,A-F(大小写均可)。

  • 工作原理: 取二进制数据的每 4 个比特 (4-bit) 作为一个组,映射到一个字符。(因为 \(2^4 = 16\))。

  • 优缺点: 编码后完全不会出现特殊符号,极度安全。但效率最低,1 个字节(8-bit)原本需要 1 个字符表示,Base16 编码后需要 2 个字符,数据体积膨胀 100%。

  • 应用场景: 报错日志中的内存地址、URL 编码(如 %20 代表空格)、密码学散列值(如 MD5、SHA256 的输出)。

2. Base32

  • 字典集 (32个字符): A-Z,2-7。

  • 工作原理: 取每 5 个比特 (5-bit) 作为一个组,映射到一个字符。(因为 \(2^5 = 32\))。

  • 优缺点: 它的字典特意排除了容易混淆的字符(如数字 0 和字母 O,数字 1 和字母 I),并且不区分大小写。所以它非常适合需要人类肉眼识别或口头传递的场景。数据体积膨胀 60%。

  • 应用场景: 动态令牌密钥(如 Google Authenticator 扫码前的密钥串)、树莓派等某些嵌入式系统的短标识符。

3. Base64

  • 字典集 (64个字符): A-Z,a-z,0-9,+,/。(结尾可能用 = 作为填充符)。

  • 工作原理: 取每 6 个比特 (6-bit) 作为一个组。(因为 \(2^6 = 64\))。

    • 3 个字节(\(3 \times 8 = 24\) bits)刚好可以被完美切分成 4 个 Base64 字符(\(4 \times 6 = 24\) bits)。

    • 填充(Padding): 如果原文最后不够 3 个字节,Base64 会用零补齐比特,并在最终结果末尾加上 =(差一个字节加一个 =,差两个加 ==)。看到尾部的 = 是识别 Base64 最直观的特征。

  • 效率: 数据体积膨胀 33%。这是安全性与效率之间的最佳平衡点。

  • 应用场景: 电子邮件附件编码(MIME)、网页内嵌小图片(Data URI)、JSON Web Token (JWT) 的载荷。

4. Base85 / Ascii85

  • 字典集 (85个字符): 包含大小写字母、数字以及大量 ASCII 标点符号(如 !, <, >, @, ~ 等)。

  • 工作原理: 与 Base64 简单的按位截断不同,Base85 使用了高位数学运算。它将 4 个字节(32-bit)当作一个巨大的 32 位整数,然后用进制转换的方法将其转换为 5 个 85 进制的数字。

  • 效率: 4 个字节变成 5 个字符,数据体积仅膨胀 25%。效率显著高于 Base64。

  • 应用场景: Adobe PDF 文件格式底层使用的就是 Ascii85 来压缩二进制流;IPv6 地址表示机制中也有用到。

5. Base91 / Base92

  • 字典集: 几乎用尽了键盘上所有非控制类的可打印字符(91 或 92 个)。

  • 工作原理: 算法比 Base85 更复杂,通常是将 13 或 14 个比特映射到 2 个字符上,甚至包含动态的位移计算。

  • 效率: 体积膨胀率可以压到 22% 左右。

  • 应用场景: 实际工程极少使用(因为含有太多在 HTTP/Shell 中有特殊含义的标点符号,容易引起解析崩溃)。

三、 总结与特征对比表

在 CTF 比赛或安全分析中,快速辨认出是哪种 Base 编码是关键。你可以参考这个特征表:

编码类型 数据膨胀率 核心字符特征 结尾填充符
Base16 100% 仅含有 0-9, A-F (像一串纯十六进制数) 无
Base32 60% 仅大写字母,数字只有 2-7 可能会有 =
Base64 33% 大小写混杂,有 + 和 / 常常有 = 甚至 ==
Base85/91 22% ~ 25% 大量特殊标点符号 (如 <!@%~; 满天飞) 通常无