跳转至

密码学补完计划 · 编码篇

本文档为社团内部学习资料,详细讲解密码学相关内容。


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填充

字符集

Text Only
1
2
3
4
5
索引: 0-25: A-Z
      26-51: a-z
      52-61: 0-9
      62: +
      63: /

编码示例

Text Only
1
2
3
4
5
6
7
明文: "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"

填充规则

Text Only
1
2
3
输入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)映射到字符集
  • 填充使用=

字符集

Text Only
1
2
3
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的倍数
  • 结尾:常有=填充
  • 无小写字母

示例

Text Only
1
2
3
明文: "Hello"
Base32: "JBSWY3DP"
Base32: "JBSWY3DP" → 解码为 "Hello"

2.3 Base16(十六进制)

原理

  • 每个字节拆分为两个4位组
  • 每个4位组(0-15)映射为0-9或A-F

字符集

Text Only
0-9, A-F (或 a-f)

识别特征

  • 字符集:只有0-9和A-F(或a-f)
  • 长度:偶数
  • 无填充符号

示例

Text Only
1
2
3
4
明文: "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, +, /

字符集

Text Only
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
(不含0, O, I, l, +, /)

识别特征

  • 0OIl
  • 包含大小写字母和数字
  • 通常用于比特币地址、私钥等

示例

Text Only
比特币地址: "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"

2.5 Base62

字符集

Text Only
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可打印字符

示例

Text Only
明文: "Hello"
Ascii85: "<~87cURD]j~>"

2.7 Base36

字符集

Text Only
0-9 (10个) + A-Z (26个) = 36个字符

用途

  • 大数字的紧凑表示
  • URL缩短

示例

Text Only
数字 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时,并不影响解码结果。

image-20260327140711504

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

image-20260327140725992

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


3. 文本与字符编码

3.1 ASCII编码

image-20231001150346015

标准ASCII

  • 使用7位表示128个字符(0-127)
  • 包括控制字符(0-31)、可打印字符(32-126)、DEL(127)

扩展ASCII

  • 使用8位表示256个字符(0-255)
  • 不同地区有不同扩展(如CP437、ISO-8859-1)

表示形式

Text Only
1
2
3
4
十进制: 72 101 108 108 111
十六进制: 0x48 0x65 0x6C 0x6C 0x6F
八进制: 110 145 154 154 157
二进制: 01001000 01100101 01101100 01101100 01101111

识别特征

  • 数字范围:常见于0-127(十进制)
  • 格式:空格分隔的数字串
  • 前缀:可能有0x\x0(八进制)

3.2 Unicode编码

UTF-8

  • 变长编码,1-4字节
  • ASCII字符占1字节,与ASCII兼容
  • 中文字符通常占3字节

UTF-16

  • 固定或变长,基本单元2字节
  • 有字节序问题(BE / LE)

UTF-32

  • 固定4字节

表示形式

Text Only
1
2
3
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实体编码

命名实体

Text Only
1
2
3
4
5
&lt;   → <
&gt;   → >
&amp;  → &
&quot; → "
&nbsp;→ 空格

数字实体(十进制)

Text Only
1
2
3
&#72;  → H
&#101; → e
&#108; → l

数字实体(十六进制)

Text Only
1
2
3
&#x48; → H
&#x65; → e
&#x6C; → l

识别特征

  • 格式:&开头,;结尾
  • 命名实体:&xxx;
  • 数字实体:&#数字;&#x十六进制;

常见场景

  • XSS攻击中的HTML注入
  • 网页源码中的特殊字符转义

3.4 Unicode转义序列

JavaScript / JSON 格式

Text Only
\u0048\u0065\u006C\u006C\u006F → "Hello"

Python 格式

Text Only
\U0001F600 → 😀 (emoji)

识别特征

  • 格式:\u + 4位十六进制
  • \U + 8位十六进制

3.5 Quoted-Printable

原理

  • 将8位数据编码为7位ASCII
  • 主要用于电子邮件(MIME)

编码规则

  • 普通ASCII字符(33-60, 62-126)保持不变
  • = 符号编码为 =3D
  • 非ASCII字符编码为 = + 两位十六进制
  • 软换行:= 放在行尾表示换行

示例

Text Only
1
2
3
原文: "你好"
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+(表单提交时)

示例

Text Only
1
2
3
4
5
6
原文: "hello world"
编码: "hello%20world" 或 "hello+world"

原文: "你好"
UTF-8: E4 BD A0 E5 A5 BD
编码: "%E4%BD%A0%E5%A5%BD"

双重URL编码

Text Only
原始: "?" → %3F
双重: %25%33%46

识别特征

  • 格式:% + 两位十六进制
  • 大量%出现

示例

image-20260327152044659

项目源

4.2 MIME编码(嘻嘻没咋见过)

Base64 在邮件中

Text Only
Content-Transfer-Encoding: base64
SGVsbG8gV29ybGQ=

Quoted-Printable 在邮件中

Text Only
Content-Transfer-Encoding: quoted-printable
=E4=BD=A0=E5=A5=BD

识别特征

  • 邮件头中包含Content-Transfer-Encoding字段
  • 常见于.eml文件

4.3 multipart/form-data(嘻嘻也没见过,去问web爷)

格式

Text Only
-----------------------------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 摩尔斯电码

编码表

Text Only
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: --..

分隔规则

  • 字母间:空格(一个空格)
  • 单词间:/ 或三个空格

示例

Text Only
.... . .-.. .-.. --- / .-- --- .-. .-.. -..
解码: "HELLO WORLD"

识别特征

  • 只有两种符号(通常是.-
  • 有空格或/分隔
  • 符号组合有规律(最长5个符号)

变种

  • 可用任意两种符号替代,如10
  • 可用长短音(音频CTF题)

5.2 猪圈密码

例:猪圈密码详解

基本原理

  • 将字母映射到网格符号
  • 基于2×2网格加点的组合

编码表

Text Only
基础网格(无点):
┌───┬───┐  ┌───┬───┐
│ A │ B │  │ C │ D │
└───┴───┘  └───┴───┘
  左网格      右网格

加点网格:
┌───┬───┐  ┌───┬───┐
│ E │ F │  │ G │ H │
└───┴───┘  └───┴───┘

其他网格类似...

识别特征

  • 图形符号:类似“回”字形、L形、角形
  • 文本表示:常用Unicode字符或ASCII art
  • 常见于图片隐写、密室逃脱谜题

5.3 培根密码

原理

  • 用5位二进制表示字母(A=00000, B=00001, ..., Z=11010)
  • 但通常用两种不同的状态表示

编码表

Text Only
1
2
3
4
5
6
7
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的倍数
  • 隐藏在普通文本中

示例

Text Only
1
2
3
4
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)

表示方法

Text Only
点阵图:
● ○   = 1号点有凸起
○ ○
○ ○

文本表示:
●○
○○
○○

数字表示:
1 0
0 0
0 0

编码表(部分)

Text Only
1
2
3
A: ●○    B: ●●    C: ●○
    ○○       ○○       ●○
    ○○       ○○       ○○

识别特征

  • 2×3的点阵图案
  • 常用10表示
  • 多行且每行长度相同

6. 数字映射编码

6.1 A1Z26

原理

  • A=1, B=2, ..., Z=26
  • 有时包含0表示空格或其他含义

格式

  • 空格分隔的数字
  • 范围通常1-26

示例

Text Only
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 手机九宫格

键盘布局

Text Only
1
2
3
4
1(.,)   2(abc)  3(def)
4(ghi)  5(jkl)  6(mno)
7(pqrs) 8(tuv)  9(wxyz)
0(空格)

T9输入法

  • 每个单词按一次数字键,通过词典匹配
  • 示例:43556HELLO

识别特征

  • 数字范围2-9
  • 可能包含0表示空格
  • 长度不固定

6.3 电话键盘多击编码

原理

  • 每个按键按多次表示不同字母
  • 用暂停或特殊符号分隔

编码表

Text Only
1
2
3
2: 1次=A, 2次=B, 3次=C
3: 1次=D, 2次=E, 3次=F
...

示例

Text Only
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

符号说明

Text Only
1
2
3
4
5
6
7
8
> 指针右移
< 指针左移
+ 当前单元格加1
- 当前单元格减1
. 输出当前单元格的ASCII字符
, 读取一个字符到当前单元格
[ 如果当前单元格为0,跳转到对应的 ]
] 如果当前单元格不为0,跳转到对应的 [

示例1

Text Only
1
2
3
4
5
6
7
8
9
# 目标打印'a'
++++++++++          # 格子0 = 10
[                   # 循环开始(格子0从10开始)
    >++++++++++     # 格子1 +10
    <-              # 格子0 -1
]                   # 循环10次,格子1 = 10×10 = 100
>                   # 指针移到格子1(现在是100)
---                 # 格子1 -3(100-3=97)
.                   # 打印 → 'a'

示例2

Text Only
1
2
3
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
输出: "Hello World!"

识别特征

  • 只有8种字符:><+-.,[]
  • 通常是长串符号,无明显可读内容
  • 常见于CTF的MISC和REVERSE题

7.2 Ook!

原理

  • Brainfuck的变种,用Ook. Ook? Ook! 组合表示
  • 每个Ook语句由三个单词组成

映射

Text Only
1
2
3
4
5
6
7
8
9
Ook. Ook.  → >
Ook. Ook?  → <
Ook. Ook!  → +
Ook? Ook.  → -
Ook? Ook?  → .
Ook? Ook!  → ,
Ook! Ook.  → [
Ook! Ook?  → ]
Ook! Ook!  → 无操作

示例

Text Only
1
2
3
4
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的类型转换构造任意代码

基本构造

Text Only
1
2
3
4
5
6
7
false     → ![]
true      → !![]
undefined → [][[]]
NaN       → +[![]]
0         → +[]
1         → +!+[]
...

示例

Text Only
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+...]
这个表达式会输出"alert"字符串。

识别特征

  • 只有[ ] ( ) + !六种字符
  • 非常长的表达式
  • 常见于XSS payload、代码混淆

8. 特殊格式编码

8.1 JWT

结构

Text Only
Header.Payload.Signature

JSON
1
2
3
4
{
  "alg": "HS256",
  "typ": "JWT"
}
Base64URL编码后:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload示例

JSON
1
2
3
4
5
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
Base64URL编码后:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

Signature

Text Only
1
2
3
4
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

识别特征

  • 两个点分隔的三段结构
  • 每段都是Base64 URL-Safe字符集
  • 第一段解码后通常是JSON

8.2 PEM

格式

Text Only
1
2
3
-----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邮件传输
  • 格式:
    Text Only
    1
    2
    3
    4
    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

格式

Text Only
1
2
3
(This file must be converted with BinHex 4.0)
:$$$@D0%!!!!!!%!!%!!!!!%!!%!!!!!%!!%!!!!!%!!%!!!!!%!!%!!!!!
...

识别特征

  • 开头有(This file must be converted with BinHex 4.0)
  • 大量!%@等符号

9. 编码识别流程图

Text Only
输入文本
┌─────────────────────────────────────┐
│ 观察字符集                           │
└─────────────────────────────────────┘
    ├── 只有 . 和 - ──────────────────→ 莫尔斯电码
    ├── 只有 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示例

Text Only
# Base64解码
From Base64

# URL解码
URL Decode

# 多重嵌套
From Base64
From Hex
URL Decode

# 自动检测
Magic (开启 Intensive mode)