密码学补完计划 · 编码篇
本文档为社团内部学习资料,详细讲解密码学相关内容。
1. 编码基础概念
1.1 什么是编码
编码是将数据从一种形式转换为另一种形式的过程,目的是: - 便于传输(如Base64将二进制转为文本) - 便于存储(如十六进制) - 便于人类阅读(如ASCII) - 符合特定协议要求(如URL编码)
1.2 编码 vs 加密
| 维度 | 编码 | 加密 |
|---|---|---|
| 目的 | 格式转换 | 保密通信 |
| 密钥 | 无密钥 | 依赖密钥 |
| 算法 | 公开且固定 | 公开但依赖密钥参数 |
| 可逆性 | 任何人可逆 | 仅持有密钥者可逆 |
| 示例 | Base64、URL编码 | 凯撒密码、AES |
1.3 编码识别方法
识别未知编码的核心思路: 1. 观察字符集:看包含哪些类型的字符(大小写字母、数字、特殊符号) 2. 观察模式:是否有重复模式、固定分隔符、特定长度 3. 观察特征:等号、百分号、反斜杠等特殊标记 4. 尝试工具:丢进CyberChef,利用自动检测功能
2. Base家族
Base家族是CTF中最常见的编码类型,核心思想是将二进制数据用有限的字符集表示。
2.1 Base64
原理
- 将3个字节(24位)拆分为4个6位组
- 每个6位组(0-63)映射到字符集中的一个字符
- 若原始数据长度二进制位数不是3的倍数,用
0填充
字符集
索引: 0-25: A-Z
26-51: a-z
52-61: 0-9
62: +
63: /
编码示例
明文: "Man" (3字节)
ASCII: M(77) a(97) n(110)
二进制: 01001101 01100001 01101110
6位分组: 010011 010110 000101 101110
十进制: 19 22 5 46
字符: T W F u
结果: "TWFu"
填充规则
输入1字节: "A" → "QQ=="
输入2字节: "Ab" → "QWI="
输入3字节: "Abc" → "QWJj"
识别特征
- 字符集:A-Z a-z 0-9 + /
- 长度:通常是4的倍数
- 结尾:常有1个或2个
= - 内容:无明显可读单词,混杂大小写
变种:Base64 URL-Safe
- 原因:标准Base64中的
+和/在URL中有特殊含义 - 替换:
+→-,/→_ - 填充:通常省略
= - 示例:
SGVsbG8gd29ybGQ=→SGVsbG8gd29ybGQ(无等号),或进一步替换符号
2.2 Base32
原理
- 将5个字节(40位)拆分为8个5位组
- 每个5位组(0-31)映射到字符集
- 填充使用
=
字符集
A-Z (2-7 不在内,实际是 A-Z 2-7,跳过数字0,1,8,9)
索引: 0-25: A-Z
26-31: 2-7
识别特征
- 字符集:大写字母A-Z + 数字2-7
- 长度:通常是8的倍数
- 结尾:常有
=填充 - 无小写字母
示例
明文: "Hello"
Base32: "JBSWY3DP"
Base32: "JBSWY3DP" → 解码为 "Hello"
2.3 Base16(十六进制)
原理
- 每个字节拆分为两个4位组
- 每个4位组(0-15)映射为0-9或A-F
字符集
0-9, A-F (或 a-f)
识别特征
- 字符集:只有0-9和A-F(或a-f)
- 长度:偶数
- 无填充符号
示例
明文: "Hello"
ASCII: H(72) e(101) l(108) l(108) o(111)
十六进制: 48 65 6C 6C 6F
编码结果: "48656C6C6F"
2.4 Base58
背景
- 比特币等加密货币使用的编码
- 移除易混淆字符:0, O, I, l, +, /
字符集
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
(不含0, O, I, l, +, /)
识别特征
- 无
0、O、I、l - 包含大小写字母和数字
- 通常用于比特币地址、私钥等
示例
比特币地址: "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
2.5 Base62
字符集
0-9 (10个) + A-Z (26个) + a-z (26个) = 62个字符
用途
- 短链接生成(如YouTube视频ID)
- 唯一ID生成
识别特征
- 字符集:大小写字母+数字
- 无特殊符号
- 长度不固定
2.6 Base85 / Ascii85
原理
- 将4个字节(32位)编码为5个字符
- 效率比Base64更高(4→5 vs 3→4)
变种
- Ascii85 (Adobe版):用
<~和~>包裹,字符集为33-117 - RFC 1924 Base85:用于IPv6地址表示
- btoa:另一种变体
识别特征
- 常有
<~开头,~>结尾 - 字符包含各种ASCII可打印字符
示例
明文: "Hello"
Ascii85: "<~87cURD]j~>"
2.7 Base36
字符集
0-9 (10个) + A-Z (26个) = 36个字符
用途
- 大数字的紧凑表示
- URL缩短
示例
数字 16777215 → "ZIK0Z" (Base36)
2.8 Base家族快速识别表
| 类型 | 字符集 | 长度特征 | 填充 | 典型应用 |
|---|---|---|---|---|
| Base64 | A-Z a-z 0-9 + / | 4的倍数 | = | 通用 |
| Base64 URL | A-Z a-z 0-9 - _ | 4的倍数(可省略) | 可选 | URL参数 |
| Base32 | A-Z 2-7 | 8的倍数 | = | 不区分大小写场景 |
| Base16 | 0-9 A-F | 偶数 | 无 | 十六进制表示 |
| Base58 | 不含0OIl+/ | 不固定 | 无 | 比特币地址 |
| Base62 | A-Z a-z 0-9 | 不固定 | 无 | 短链接 |
| Base85 | 33-117等 | 5的倍数 | ~> | PDF、PostScript |
2.9 Base64隐写
原理:base64编码末尾添加的0字符在进行解码时会被舍弃,这意味着在这编码一步骤添加的二进制值 可以不全为0时,并不影响解码结果。

倘若添加的二进制值不全为0,编码变化。但Base64解码的结果依然是Terra:

末尾有两个“=”填充同样如此 对多个base64编码字符串结尾进行修改,即可隐藏更多的信息,这就是base64隐写。
3. 文本与字符编码
3.1 ASCII编码

标准ASCII
- 使用7位表示128个字符(0-127)
- 包括控制字符(0-31)、可打印字符(32-126)、DEL(127)
扩展ASCII
- 使用8位表示256个字符(0-255)
- 不同地区有不同扩展(如CP437、ISO-8859-1)
表示形式
十进制: 72 101 108 108 111
十六进制: 0x48 0x65 0x6C 0x6C 0x6F
八进制: 110 145 154 154 157
二进制: 01001000 01100101 01101100 01101100 01101111
识别特征
- 数字范围:常见于0-127(十进制)
- 格式:空格分隔的数字串
- 前缀:可能有
0x、\x、0(八进制)
3.2 Unicode编码
UTF-8
- 变长编码,1-4字节
- ASCII字符占1字节,与ASCII兼容
- 中文字符通常占3字节
UTF-16
- 固定或变长,基本单元2字节
- 有字节序问题(BE / LE)
UTF-32
- 固定4字节
表示形式
UTF-8 (十六进制): E5 A5 BD (好)
UTF-16 BE: 59 7D
UTF-16 LE: 7D 59
UTF-32: 00 00 59 7D
3.3 HTML实体编码
命名实体
< → <
> → >
& → &
" → "
→ 空格
数字实体(十进制)
H → H
e → e
l → l
数字实体(十六进制)
H → H
e → e
l → l
识别特征
- 格式:
&开头,;结尾 - 命名实体:
&xxx; - 数字实体:
&#数字;或&#x十六进制;
常见场景
- XSS攻击中的HTML注入
- 网页源码中的特殊字符转义
3.4 Unicode转义序列
JavaScript / JSON 格式
\u0048\u0065\u006C\u006C\u006F → "Hello"
Python 格式
\U0001F600 → 😀 (emoji)
识别特征
- 格式:
\u+ 4位十六进制 - 或
\U+ 8位十六进制
3.5 Quoted-Printable
原理
- 将8位数据编码为7位ASCII
- 主要用于电子邮件(MIME)
编码规则
- 普通ASCII字符(33-60, 62-126)保持不变
=符号编码为=3D- 非ASCII字符编码为
=+ 两位十六进制 - 软换行:
=放在行尾表示换行
示例
原文: "你好"
UTF-8: E5 A5 BD E5 A5 BD
Quoted-Printable: =E5=A5=BD=E5=A5=BD
识别特征
- 大量
=符号 =后跟两位十六进制- 常见于邮件源码
4. 网络传输编码
4.1 URL编码
原理
- 将非ASCII字符或保留字符转换为
%xx格式 - 保留字符包括:
! * ' ( ) ; : @ & = + $ , / ? # [ ]
编码规则
- 保留字符:编码为
%+ 十六进制 - 非ASCII字符:先转UTF-8,再编码
- 空格:可编码为
%20或+(表单提交时)
示例
原文: "hello world"
编码: "hello%20world" 或 "hello+world"
原文: "你好"
UTF-8: E4 BD A0 E5 A5 BD
编码: "%E4%BD%A0%E5%A5%BD"
双重URL编码
原始: "?" → %3F
双重: %25%33%46
识别特征
- 格式:
%+ 两位十六进制 - 大量
%出现
示例

4.2 MIME编码(嘻嘻没咋见过)
Base64 在邮件中
Content-Transfer-Encoding: base64
SGVsbG8gV29ybGQ=
Quoted-Printable 在邮件中
Content-Transfer-Encoding: quoted-printable
=E4=BD=A0=E5=A5=BD
识别特征
- 邮件头中包含
Content-Transfer-Encoding字段 - 常见于
.eml文件
4.3 multipart/form-data(嘻嘻也没见过,去问web爷)
格式
-----------------------------123456789
Content-Disposition: form-data; name="field1"
value1
-----------------------------123456789
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
file content
-----------------------------123456789--
识别特征
- 边界字符串(以
--开头) - 包含
Content-Disposition头 - 常用于HTTP文件上传
5. 符号与图形编码
5.1 摩尔斯电码
编码表
A: .- N: -. 1: .----
B: -... O: --- 2: ..---
C: -.-. P: .--. 3: ...--
D: -.. Q: --.- 4: ....-
E: . R: .-. 5: .....
F: ..-. S: ... 6: -....
G: --. T: - 7: --...
H: .... U: ..- 8: ---..
I: .. V: ...- 9: ----.
J: .--- W: .-- 0: -----
K: -.- X: -..-
L: .-.. Y: -.--
M: -- Z: --..
分隔规则
- 字母间:空格(一个空格)
- 单词间:
/或三个空格
示例
.... . .-.. .-.. --- / .-- --- .-. .-.. -..
解码: "HELLO WORLD"
识别特征
- 只有两种符号(通常是
.和-) - 有空格或
/分隔 - 符号组合有规律(最长5个符号)
变种
- 可用任意两种符号替代,如
1和0 - 可用长短音(音频CTF题)
5.2 猪圈密码
例:猪圈密码详解
基本原理
- 将字母映射到网格符号
- 基于2×2网格加点的组合
编码表
基础网格(无点):
┌───┬───┐ ┌───┬───┐
│ A │ B │ │ C │ D │
└───┴───┘ └───┴───┘
左网格 右网格
加点网格:
┌───┬───┐ ┌───┬───┐
│ E │ F │ │ G │ H │
└───┴───┘ └───┴───┘
其他网格类似...
识别特征
- 图形符号:类似“回”字形、L形、角形
- 文本表示:常用Unicode字符或ASCII art
- 常见于图片隐写、密室逃脱谜题
5.3 培根密码
原理
- 用5位二进制表示字母(A=00000, B=00001, ..., Z=11010)
- 但通常用两种不同的状态表示
编码表
A: aaaaa B: aaaab C: aaaba D: aaabb
E: aabaa F: aabab G: aabba H: aabbb
I: abaaa J: abaab K: ababa L: ababb
M: abbaa N: abbab O: abbba P: abbbb
Q: baaaa R: baaab S: baaba T: baabb
U: babaa V: babab W: babba X: babbb
Y: bbaaa Z: bbaab
隐藏方式
- 大小写字母:
HeLLo中的大小写表示二进制 - 字体差异:正常/斜体、正常/粗体
- 符号替换:A/B、0/1
识别特征
- 只有两种状态(大小写、字体等)
- 长度是5的倍数
- 隐藏在普通文本中
示例
原文: "HeLLo WoRLd"
大小写表示: 大写=1, 小写=0
H(0) e(1) L(1) L(1) o(0) 空格 W(1) o(0) R(1) L(1) d(0)
二进制: 01110 10110
解码: 01110=O, 10110=W → "OW"
5.4 盲文
结构
- 2列 × 3行 = 6个点
- 点的位置编号(左列从上到下1-3,右列4-6)
表示方法
点阵图:
● ○ = 1号点有凸起
○ ○
○ ○
文本表示:
●○
○○
○○
数字表示:
1 0
0 0
0 0
编码表(部分)
A: ●○ B: ●● C: ●○
○○ ○○ ●○
○○ ○○ ○○
识别特征
- 2×3的点阵图案
- 常用
●和○或1和0表示 - 多行且每行长度相同
6. 数字映射编码
6.1 A1Z26
原理
- A=1, B=2, ..., Z=26
- 有时包含0表示空格或其他含义
格式
- 空格分隔的数字
- 范围通常1-26
示例
8 5 12 12 15 → HELLO
23 15 18 12 4 0 23 15 18 12 4 → WORLD WORLD
识别特征
- 数字范围1-26
- 空格分隔
- 常见于简单谜题
变种
- A=0, B=1, ..., Z=25
- 或A=1, B=0, Z=26等自定义映射
6.2 手机九宫格
键盘布局
1(.,) 2(abc) 3(def)
4(ghi) 5(jkl) 6(mno)
7(pqrs) 8(tuv) 9(wxyz)
0(空格)
T9输入法
- 每个单词按一次数字键,通过词典匹配
- 示例:
43556→HELLO
识别特征
- 数字范围2-9
- 可能包含0表示空格
- 长度不固定
6.3 电话键盘多击编码
原理
- 每个按键按多次表示不同字母
- 用暂停或特殊符号分隔
编码表
2: 1次=A, 2次=B, 3次=C
3: 1次=D, 2次=E, 3次=F
...
示例
2 22 222 → ABC
44 33 555 555 666 → HELLO
分隔方式
- 空格分隔:
44 33 555 555 666 - 特殊符号:
44-33-555-555-666 - 无分隔但需上下文识别
识别特征
- 重复数字
- 数字范围2-9
- 常见于老式手机输入法
7. 编程语言类编码
7.1 Brainfuck
符号说明
> 指针右移
< 指针左移
+ 当前单元格加1
- 当前单元格减1
. 输出当前单元格的ASCII字符
, 读取一个字符到当前单元格
[ 如果当前单元格为0,跳转到对应的 ]
] 如果当前单元格不为0,跳转到对应的 [
示例1
# 目标打印'a'
++++++++++ # 格子0 = 10
[ # 循环开始(格子0从10开始)
>++++++++++ # 格子1 +10
<- # 格子0 -1
] # 循环10次,格子1 = 10×10 = 100
> # 指针移到格子1(现在是100)
--- # 格子1 -3(100-3=97)
. # 打印 → 'a'
示例2
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
输出: "Hello World!"
识别特征
- 只有8种字符:
><+-.,[] - 通常是长串符号,无明显可读内容
- 常见于CTF的MISC和REVERSE题
7.2 Ook!
原理
- Brainfuck的变种,用
Ook.Ook?Ook!组合表示 - 每个Ook语句由三个单词组成
映射
Ook. Ook. → >
Ook. Ook? → <
Ook. Ook! → +
Ook? Ook. → -
Ook? Ook? → .
Ook? Ook! → ,
Ook! Ook. → [
Ook! Ook? → ]
Ook! Ook! → 无操作
示例
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook.
对应Brainfuck的++++++++++。
识别特征
- 只有
Ook、.、?、!的组合 - 大小写敏感(Ook必须大写O)
- 每三个单词一组
7.3 JSFuck
原理
- 只用6种字符:
[ ] ( ) + ! - 利用JavaScript的类型转换构造任意代码
基本构造
false → ![]
true → !![]
undefined → [][[]]
NaN → +[![]]
0 → +[]
1 → +!+[]
...
示例
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+...]
这个表达式会输出"alert"字符串。
识别特征
- 只有
[ ] ( ) + !六种字符 - 非常长的表达式
- 常见于XSS payload、代码混淆
8. 特殊格式编码
8.1 JWT
结构
Header.Payload.Signature
Header示例
{
"alg": "HS256",
"typ": "JWT"
}
Base64URL编码后:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload示例
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Base64URL编码后:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
Signature
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
识别特征
- 两个点分隔的三段结构
- 每段都是Base64 URL-Safe字符集
- 第一段解码后通常是JSON
8.2 PEM
格式
-----BEGIN CERTIFICATE-----
MIIDITCCAgmgAwIBAgI...
-----END CERTIFICATE-----
常见类型
-----BEGIN CERTIFICATE-----:X.509证书-----BEGIN RSA PRIVATE KEY-----:RSA私钥-----BEGIN PUBLIC KEY-----:公钥
识别特征
- 以
-----BEGIN ...-----开头 - 以
-----END ...-----结尾 - 中间是Base64编码的数据
8.3 UUencode / XXencode
UUencode
- 历史:Unix邮件传输
- 格式:
begin 644 filename
M"B!`@`!`0`!`@`!`0`!`@`!`0`!`@`!`0`!`@`!`0`!`@`!`0`!`@`!`0`!`
`
end
- 特征:开头有
begin,每行以字符M(或)开头
XXencode
- 类似UUencode,但字符集不同
- 字符集:
+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
识别特征
- UUencode:开头有
begin,第一行有文件名 - XXencode:无
begin标记,字符集与Base64不同
8.4 BinHex
用途
- Mac OS经典编码格式
- 将二进制数据编码为ASCII
格式
(This file must be converted with BinHex 4.0)
:$$$@D0%!!!!!!%!!%!!!!!%!!%!!!!!%!!%!!!!!%!!%!!!!!%!!%!!!!!
...
识别特征
- 开头有
(This file must be converted with BinHex 4.0) - 大量
!、%、@等符号
9. 编码识别流程图
输入文本
│
▼
┌─────────────────────────────────────┐
│ 观察字符集 │
└─────────────────────────────────────┘
│
├── 只有 . 和 - ──────────────────→ 莫尔斯电码
│
├── 只有 A-Z 2-7 + = ────────────→ Base32
│
├── 只有 0-9 A-F (或a-f) ────────→ Base16 / Hex
│
├── 只有 0-9 和空格 ──────────────→ A1Z26 / ASCII十进制
│
├── 大量 % + 十六进制 ────────────→ URL编码
│
├── 大量 = + 十六进制 ────────────→ Quoted-Printable
│
├── 大量 &# 或 &xxx; ─────────────→ HTML实体编码
│
├── 大量 \u + 十六进制 ───────────→ Unicode转义
│
├── 只有 > < + - . , [ ] ────────→ Brainfuck
│
├── 只有 Ook . ? ! ───────────────→ Ook!
│
├── 只有 [ ] ( ) + ! ─────────────→ JSFuck
│
├── 两段 Base64 用 . 分隔 ────────→ JWT (三段)
│
├── 包含 + 和 / 可能有 = ─────────→ Base64
│
├── 包含 - 和 _ 可能无 = ─────────→ Base64 URL-Safe
│
└── 其他 ─────────────────────────→ 尝试CyberChef自动检测
10. 工具推荐
| 工具 | 用途 | 特点 |
|---|---|---|
| CyberChef | 万能加解密 | 可视化拖拽、支持复杂流水线、自动检测 |
| Ciphey | 自动化解密 | 支持50+种编码/加密的自动识别与破解 |
| dCode | 在线工具集 | 分类详细,支持上百种密码/编码 |
| Base64解码器 | Base系列专用 | 支持多种Base变体 |
| Python | 自定义脚本 | 灵活处理批量或嵌套编码 |
CyberChef 常用Recipe示例
# Base64解码
From Base64
# URL解码
URL Decode
# 多重嵌套
From Base64
From Hex
URL Decode
# 自动检测
Magic (开启 Intensive mode)