Base64 是最常见的编码,但除此之外还有 Base16、Base32、Base58、Base85、Base100 等。它们最明显的区别在于使用了不同数量的可打印字符来对任意字节数据进行编码。例如 Base64 使用 64 个可打印字符(A-Z、a-z、0-9、+、/),Base16 使用 16 个可打印字符(A-F、0-9)。
本文只讲如何快速识别,各 Base 系列的主要特征如下:
| 编码 | 结尾等号 | 字母/数字比例 | 其他特征 |
|---|---|---|---|
| Base16 | 无等号 | 数字多于字母 | 只有 0-9、A-F |
| Base32 | 可能有多个等号 | 字母多于数字 | 明文超过 10 个字符时结尾常有多个等号 |
| Base58 | 无等号 | 字母多于数字 | 无 +、/、0、O、I、l,常见于加密货币地址 |
| Base64 | 通常有 1-2 个等号 | 字母、数字、+、/ 混合 | 明文极短时可能没有等号 |
| Base85 | 等号出现在字符串中间 | 字母数字外含较多特殊字符 | 含 !、#、%、& 等奇怪字符 |
| Base100 | 无 | 无 | 密文完全由 Emoji 表情组成 |
识别原理
这些特征本质上由字符集大小决定:
- Base16 字符集只有 16 个字符(0-9、A-F),数字占一半以上,故数字多于字母,且字节对齐无余数,天然不带等号。
- Base32 字符集为 A-Z2-7,字母占绝对多数;每 5 个比特一组,输入长度与 5 字节的块不对齐时会产生
=填充,长明文常有多个等号。 - Base64 每 6 个比特一组,4 个字符表示 3 字节;余 1 字节补 1 个
=,余 2 字节补 2 个=,因此通常结尾带 1-2 个等号。 - Base58 为去重设计,剔除了
0、O、I、l以及+、/,且不采用=填充,所以无等号、字母偏多。 - Base85 字符集含 ASCII 特殊字符,且填充符
=可能出现在密文中间,一眼即可与 Base64 区分。 - Base100 直接用 Emoji 作为字符集,特征最明显。
一句话总结:看字符集大小 → 看字母数字比例 → 看等号位置,三步就能锁定具体是哪一种 Base 编码。
加解密方法
识别出编码后,加解密可直接使用 Python 的 base64 标准库:
python
import base64
# Base16
base64.b16encode(b"hello") # b'68656C6C6F'
base64.b16decode("68656C6C6F")
# Base32
base64.b32encode(b"hello") # b'NBSWY3DP'
base64.b32decode("NBSWY3DP")
# Base64
base64.b64encode(b"hello") # b'aGVsbG8='
base64.b64decode("aGVsbG8=")Base58、Base85 和 Base100 在标准库中没有直接支持:Base58 可用 base58 第三方库,Base85 可用 base64.b85encode(Python 3.4+),Base100 多为 CTF 自定义实现,通常使用现成脚本或在线工具处理。
- 本文链接: https://diyuyizhu.github.io/posts/base-encoding-identification/
- 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。
