作为安全保障的一项重要技术,密码学不仅仅是保证银行金库、公司保险箱、商店大门的安全,更是现代信息系统必不可少的一环,从手机锁屏密码的设置到服务器访问的加密传输,再到软件分发的签名,都离不开密码学的帮助,可以说,没有密码学,我们就不能在网络安全的交流,更不可能在网络上随意交易而不用防备盗窃。
古典密码
在过去,特别是战场上,如何将情报安全地传输到指挥部而不被敌方截获,成为密码研究者的核心课题。为此,人们发明了多种古典密码技术,如凯撒密码通过字母位移隐藏信息,维吉尼亚密码利用关键词实现多表替换以抵抗频率分析,而斯巴达的斯奇泰尔密码棒则借助物理装置改变文字排列顺序。这些方法虽在今日看来简单,却在缺乏电子通信与计算能力的时代,为军事指挥、外交联络和秘密行动提供了至关重要的安全保障,也奠定了现代密码学的基础。
凯撒密码
恺撒密码(Caesar Cipher) 是一种经典的替换加密技术。其原理是将明文中的每个字母在字母表中按照固定的偏移量向前或向后移动,从而生成密文。
例如,当偏移量为 3 时:
- A → D
- B → E
- ……
- Z → C(循环处理)
示例:
- 明文:
I LOVE YOU(偏移量为 3) - 密文:
L ORYH BRX
常见的特定偏移量及其名称:
| 偏移量 | 名称 | 说明 |
|---|---|---|
| +10 | Avocat | A → K |
| +13 | ROT13 | 常用于简单文本混淆 |
| -5 | Cassis | 有时记作 K6 |
| -6 | Cassette | 有时记作 K7 |
小测试:
你知道 I LOVE YOU 经过 ROT13 编码后的结果是什么吗?
你可以在这里验证答案:Bugku 在线加解密工具
仿射加密
仿射加密法是单表替换密码的一种,属于古典密码学中的线性加密方法。它通过一个数学函数对明文中的每个字母进行变换,从而生成密文。
基本原理
首先,将英文字母映射为数字:
- a → 0,b → 1,c → 2,…,z → 25。
加密过程使用如下仿射变换公式:
E(x) = (a \cdot x + b) \mod 26
其中:
-
x 是明文字母对应的数字(0–25);
-
a 和 b 是密钥,且必须满足:
- a 与 26 互质(即 \gcd(a, 26) = 1),以确保解密可行;
- b 可取 0 到 25 之间的任意整数。
因此,密钥是一个有序对 (a, b),例如 (5, 8)、(3, 17) 等。
解密公式
若已知密钥 (a, b),解密时需先求出 a 在模 26 下的乘法逆元 a^{-1},使得:
解密公式为:
其中 y 是密文字母对应的数字。
示例
假设密钥为 (a=5, b=8),对明文 "HELLO" 加密:
-
转换为数字:H=7, E=4, L=11, L=11, O=14
-
应用公式 E(x) = (5x + 8) \mod 26:
- H: (5×7 + 8) mod 26 = 43 mod 26 = 17 → R
- E: (5×4 + 8) = 28 mod 26 = 2 → C
- L: (5×11 + 8) = 63 mod 26 = 11 → L
- O: (5×14 + 8) = 78 mod 26 = 0 → A
-
密文为:RCLLA
注意:由于 a 必须与 26 互质,合法的 a 值仅有 12 个:1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25。因此,仿射密码的总密钥空间为 12 \times 26 = 312 种可能,安全性较低,易受穷举或频率分析攻击。
埃特巴什码
埃特巴什码(Atbash Cipher)是一种古老的单表替换密码,起源于希伯来语加密。其核心思想非常简单:将字母表完全反转,即第一个字母对应最后一个,第二个对应倒数第二个,依此类推。
字母对照表
| 明文 | A | B | C | D | E | F | G | H | I | J | K | L | M |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 密文 | Z | Y | X | W | V | U | T | S | R | Q | P | O | N |
| 明文 | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 密文 | M | L | K | J | I | H | G | F | E | D | C | B | A |
也可以简记为:
A ↔ Z,B ↔ Y,C ↔ X,…,M ↔ N
该方法无需额外密钥,本质上是一种固定的对称替换规则。
示例
- 密文:
gsv jfrxp yildm ulc qfnkh levi gsv ozab wlt - 明文:
the quick brown fox jumps over the lazy dog
注:此例使用小写字母,但 Atbash 规则同样适用于大写。空格和标点通常保留不变。
特点
- 对称性:加密与解密过程完全相同。对密文再次应用 Atbash 即可还原明文。
- 无密钥:算法固定,安全性极低,仅适用于趣味性或教学场景。
- 历史意义:最早用于希伯来圣经中的隐写,如将 "Babel"(巴别)写作 "Sheshak"。
您可以使用在线工具验证或练习 Atbash 加解密:
[HiEncode - Atbash 在线加解密
培根加密
培根密码是一种二元替换密码,由16世纪英国哲学家弗朗西斯·培根(Francis Bacon)提出。它将每个英文字母用一个由5个字符组成的序列表示,通常使用两个不同的符号(传统上为 A 和 B)来编码。
编码规则(标准26字母版)
| 字母 | 编码 | 字母 | 编码 |
|---|---|---|---|
| A | aaaaa | N | abbaa |
| B | aaaab | O | abbab |
| C | aaaba | P | abbba |
| D | aaabb | Q | abbbb |
| E | aabaa | R | baaaa |
| F | aabab | S | baaab |
| G | aabba | T | baaba |
| H | aabbb | U/V | baaba |
| I/J | abaaa | W | babaa |
| K | abaab | X | babab |
| L | ababa | Y | babba |
| M | ababb | Z | babbb |
注意:
- 传统培根密码中,I 与 J、U 与 V 常共用同一编码(因当时字母表仅24个字母)。
- 实际应用中,A/B 可替换为任意两种可区分的符号(如大/小写、字体差异、0/1 等),用于隐写术(steganography)。
示例 1:加密
-
明文:
T H E F O X -
对应编码:
- T →
baaba - H →
aabbb - E →
aabaa - F →
aabab - O →
abbab - X →
babab
- T →
-
密文:
baaba aabbb aabaa aabab abbab babab
示例 2:解密
-
密文:
abbbb abaaa aaaaa abbaa babab abaaa abbaa -
分组解码:
abbbb→ Qabaaa→ I(或 J)aaaaa→ Aabbaa→ Nbabab→ Xabaaa→ Iabbaa→ N
-
明文:
QIANXIN
注:此处按现代26字母独立编码处理,I 与 J 分开,故
abaaa解为 I。
在线工具
您可以使用以下工具进行培根密码的加解密验证:
🔗 Bugku 培根密码加解密工具
栅栏密码
栅栏密码是一种换位密码(Transposition Cipher) ,通过将明文按“之”字形(或分组)写入多行,再按行读取生成密文。最常见的是 2栏(2行)栅栏密码。
加密原理(以2栏为例)
- 去除空格和标点(通常处理为纯字母字符串);
- 将明文字符交替分配到两行中:第1个字符放第1行,第2个放第2行,第3个放第1行,第4个放第2行……依此类推;
- 最后将第1行与第2行依次拼接,形成密文。
注:虽然常被描述为“分组”,但严格来说,2栏栅栏是按位置奇偶性分配,而非固定长度分组。
加密示例
- 明文:
The quick brown fox jumps over the lazy dogs - 去空格:
Thequickbrownfoxjumpsoverthelazydogs(共39个字符)
分配到两行:
- 第1行(奇数位索引 0,2,4,…):
T e u c b o n o j m s v r h l z d g→Teucbonojmsvrhlzdg - 第2行(偶数位索引 1,3,5,…):
h q i k r w f x u p o e t e a y o s→hqikrwfxupoeteayos - 密文:
Teucbonojmsvrhlzdghqikrwfxupoeteayos
解密方法(2栏)
- 计算密文长度 L ;
- 第1行长度为 \lceil L/2 \rceil ,第2行为 \lfloor L/2 \rfloor ;
- 将密文前半部分作为第1行,后半部分作为第2行;
- 交替从两行取字符(第1行取一个,第2行取一个……)还原明文;
- 可根据语义恢复空格。
示例解密:
- 密文:
Teucbonojmsvrhlzdghqikrwfxupoeteayos(39字符) - 第1行(前20字符):
Teucbonojmsvrhlzdg - 第2行(后19字符):
hqikrwfxupoeteayos
交替合并:
T + h → Th
e + q → eq
u + i → ui
c + k → ck
...
g + s → gs
→ 得到:Thequickbrownfoxjumpsoverthelazydogs
- 加回空格:
The quick brown fox jumps over the lazy dog
在线工具
您可以使用以下工具进行栅栏密码的加解密:
🔗 Bugku 栅栏密码在线解密
补充说明
- 栅栏密码可扩展为 N栏(N行) ,加密时按“之”字形写入N行,再逐行读出;
- N越大,密文越混乱,但密钥空间仍很小,易被暴力破解;
- 常用于CTF竞赛中的简单密码题。
摩斯密码
摩尔斯电码是由美国发明家萨缪尔·摩尔斯(Samuel Morse) 于1836年提出的一种时通时断的电信号编码系统。它通过不同长度的信号组合——“点”(·)和“划”(–)——来表示字母、数字、标点符号等,广泛应用于早期电报通信。
基本组成元素
摩尔斯电码的书写与识别依赖以下五种基本单位:
- 点(Dot) :短信号,记作
. - 划(Dash) :长信号,约为点的三倍时长,记作
- - 字符内间隔:点与划之间无额外符号,但需自然停顿
- 字符间停顿:用单个空格分隔不同字母
- 单词间停顿:用斜杠
/或多个空格表示(通常写作/)
示例:
HELLO WORLD→.... . .-.. .-.. --- / .-- --- .-. .-.. -..
示例:加密
-
明文:
ILOVEQIANXIN -
对应摩尔斯电码:
- I →
.. - L →
.-.. - O →
--- - V →
...- - E →
. - Q →
--.- - I →
.. - A →
.- - N →
-. - X →
-..- - I →
.. - N →
-.
- I →
-
密文(字母间以空格分隔) :
.. .-.. --- ...- . --.- .. .- -. -..- .. -.
解密提示
解密时需:
- 按空格分割出每个字母的摩尔斯码;
- 查表还原为对应字母;
- 若存在
/,则表示单词分隔。
在线工具
您可以使用以下工具进行摩尔斯电码的加解密:
🔗 Bugku 摩尔斯电码在线解密
键盘密码
电脑键盘
这类的CTF题主要是通过键盘的布局,通过一些特定的排列位置进行组合获得明文
密文:ujm,loi 2wsdr43 5tghu76
明文:KEY
手机键盘(老式按键手机)
这类的CTF题主要是通过键盘的布局,通过一些特定的排列位置进行组合获得明文
密文:523293
明文:KEY
现代密码
DES算法
DES(Data Encryption Standard,数据加密标准)是一种对称加密算法,由 IBM 在 1970 年代初设计,并于 1977 年被美国国家标准局(NIST 前身)采纳为联邦标准。虽然如今 DES 已因密钥太短而不再安全,但它在密码学发展史上具有里程碑意义,也是理解现代分组密码(如 AES)的重要基础。
一、基本概念
1. 对称加密
- 加密和解密使用同一个密钥。
- 速度快,适合加密大量数据。
- 密钥必须安全地共享(密钥分发是挑战)。
2. 分组密码(Block Cipher)
- DES 是一种分组密码:每次处理固定长度的数据块。
- 明文分组长度:64 位(8 字节)
- 密钥长度:56 位(实际输入 64 位,其中 8 位是奇偶校验位,不参与加密)
⚠️ 注意:56 位密钥在今天很容易被暴力破解(1998 年已有专用机器几天内破解),因此 DES 已不推荐用于实际安全场景。其改进版 3DES(Triple DES) 曾作为过渡方案,现在也逐渐被 AES 取代。
二、DES 的整体结构:Feistel 网络
DES 采用 Feistel 结构,这是一种经典的对称加密设计框架,特点包括:
- 将明文分成左右两半:
和
(各 32 位)
- 经过 16 轮 相同的操作
- 每轮使用一个子密钥(从主密钥派生)
- 加密和解密过程几乎相同(只需逆序使用子密钥)
Feistel 轮函数公式(第 i 轮):
其中:
表示按位异或(XOR)
是轮函数(核心混淆部分)
是第 i 轮的子密钥(48 位)
经过 16 轮后,左右交换(最后一轮不交换,但 DES 实际做了交换后再进行最终置换,等效于交换),得到密文。
三、DES 加密步骤详解
步骤 1:初始置换(IP, Initial Permutation)
- 输入 64 位明文
- 按照一个固定的置换表 IP 重新排列位顺序(无密钥参与,只是打乱)
- 输出仍是 64 位,分为左半
和右半
(各 32 位)
例如:原第 1 位移到第 58 位,第 2 位移到第 50 位……(查 IP 表)
步骤 2:16 轮 Feistel 迭代
每轮操作如下:
(a)扩展置换(E-Box)
- 将 32 位的
扩展为 48 位(通过重复某些位)
- 目的:使输入与 48 位子密钥长度一致,并引入扩散
(b)与子密钥异或
- 将扩展后的 48 位与本轮子密钥
异或
(c)S-盒替换(S-Boxes,核心非线性部分!)
-
将 48 位分成 8 组,每组 6 位 → 共 8 个 S-盒(S1 ~ S8)
-
每个 S-盒将 6 位输入映射为 4 位输出(查预定义的 4×16 表)
- 第 1 和第 6 位决定行(0~3)
- 中间 4 位决定列(0~15)
- 查表得 4 位输出
-
S-盒是 DES 安全性的关键,提供混淆(confusion)
8 个 S-盒共输出 8 × 4 = 32 位
(d)P-置换(Permutation)
- 对 S-盒输出的 32 位进行固定位置重排(扩散 diffusion)
(e)与左半部分异或
- 将 P-置换结果与
异或,得到新的
- 原
直接成为新的
步骤 3:左右交换 & 最终置换(IP⁻¹)
- 16 轮结束后,将
和 R_{16} 合并为
(注意顺序!)
- 应用 IP 的逆置换(IP⁻¹) ,得到最终 64 位密文
解密时,只需将子密钥顺序倒过来(
),其余结构完全相同!
四、密钥调度(子密钥生成)
主密钥:64 位(实际有效 56 位)
步骤:
-
去除奇偶校验位
- 每 8 位中第 8 位是校验位(用于检测传输错误),丢弃
- 得到 56 位密钥
-
初始密钥置换(PC-1)
- 按 PC-1 表打乱 56 位,分为
和
(各 28 位)
- 按 PC-1 表打乱 56 位,分为
-
每轮循环左移
-
每轮对
和
进行循环左移(1 位或 2 位,取决于轮数)
- 轮数 1,2,9,16:左移 1 位
- 其他轮:左移 2 位
-
-
压缩置换(PC-2)
- 将
(56 位)通过 PC-2 表压缩为 48 位 → 得到子密钥
- 将
共生成 16 个 48 位子密钥。
五、一个简化示例(概念演示)
假设:
- 明文 =
0x0123456789ABCDEF(64 位) - 密钥 =
0x133457799BBCDFF1(64 位)
经过 IP → 16 轮 Feistel → IP⁻¹ 后,得到密文(具体值需查表计算)。
实际计算非常繁琐,需查多个置换表和 S-盒。通常用程序实现。
六、DES 的安全性问题
| 问题 | 说明 |
|---|---|
| 密钥太短(56 位) | 暴力破解可行(1998 年 EFF 的 "Deep Crack" 机器 56 小时破解;如今普通 GPU 几分钟) |
| S-盒设计曾受质疑 | 初期有人怀疑 NSA 植入后门,后来发现 S-盒其实能抵抗差分密码分析(NSA 提前掌握了该技术) |
| 块大小较小(64 位) | 在加密大量数据时可能暴露模式(如 Sweet32 攻击) |
改进方案:
- 3DES(Triple DES) :加密-解密-加密(EDE)三次,有效密钥长度 112 或 168 位
C = E_{K3}(D_{K2}(E_{K1}(P))) - AES(Advanced Encryption Standard) :2001 年取代 DES,支持 128/192/256 位密钥,更安全高效
七、Python 示例(使用 PyCryptodome 库)
from Crypto.Cipher import DES
import binascii
# 注意:DES 密钥必须是 8 字节(64 位),但只有 56 位有效
key = b'12345678' # 8 bytes
plaintext = b'HelloDES' # 必须是 8 字节倍数(DES 是分组密码)
# 创建 DES 对象
cipher = DES.new(key, DES.MODE_ECB) # ECB 模式(不安全,仅教学)
# 加密(需填充至 8 字节倍数)
# 这里 plaintext 刚好 8 字节
ciphertext = cipher.encrypt(plaintext)
print("密文 (hex):", binascii.hexlify(ciphertext).decode())
# 解密
decrypted = cipher.decrypt(ciphertext)
print("解密:", decrypted.decode())
⚠️ 警告:ECB 模式不安全(相同明文块产生相同密文块),实际应使用 CBC、GCM 等模式,并加填充(如 PKCS#7)。
八、总结
| 项目 | DES 参数 |
|---|---|
| 类型 | 对称分组密码 |
| 明文分组 | 64 位 |
| 密钥长度 | 56 位(输入 64 位) |
| 轮数 | 16 轮 |
| 结构 | Feistel 网络 |
| 核心组件 | 初始/最终置换、E-扩展、S-盒、P-置换、密钥调度 |
| 安全性 | 已不安全,仅用于学习或遗留系统 |
| 替代方案 | AES(推荐)、3DES(过渡) |
RSA算法
RSA 是一种非对称加密算法,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 于1977年提出,因此得名 RSA。它广泛应用于数据加密、数字签名等领域。下面为初学者详细讲解 RSA 的加解密原理与步骤,尽量用通俗易懂的方式说明。
一、基本概念
1. 对称 vs 非对称加密
-
对称加密:加密和解密使用同一个密钥(如 AES)。速度快,但密钥分发困难。
-
非对称加密:使用一对密钥——公钥(public key)和私钥(private key):
- 公钥可以公开,用于加密或验证签名;
- 私钥必须保密,用于解密或生成签名。
在 RSA 中:
- 用公钥加密 → 只能用对应的私钥解密
- 用私钥签名 → 可用对应的公钥验证
二、RSA 加密/解密的数学基础
RSA 基于大整数分解难题:给定两个大质数 p 和 q ,计算 n = p \times q 很容易;但反过来,给定 n ,想分解出 p 和 q 极其困难(当 n 足够大时)。
需要用到的数学知识:
- 模运算(Modular Arithmetic)
- 欧拉函数(Euler’s totient function) :
- 模逆元(Modular Inverse)
- 费马小定理 / 欧拉定理
三、RSA 密钥生成步骤(核心!)
假设我们要生成一对 RSA 密钥:
步骤 1:选择两个大质数
选两个不同的大质数 p 和 q 。
(实际应用中,它们通常有1024位或2048位以上;教学示例可用小数字)
例如:
p = 61
q = 53
步骤 2:计算 n = p \times q
这是模数(modulus) ,也是公钥和私钥的一部分。
步骤 3:计算欧拉函数 \phi(n)
因为 p 和 q 是质数,所以:
步骤 4:选择公钥指数 e
选一个整数 e ,满足:
(即 e 与
互质)
常用选择:65537(= 2^{16} + 1) ,因为它效率高且安全。教学中可选小一点的,比如 17。
选 e = 17 (因为
)
步骤 5:计算私钥指数 d
找一个整数 d ,使得:即 d 是 e 在模
下的乘法逆元。
可通过扩展欧几里得算法求解。
求 d 使得
解得: d = 2753 (因为)
四、得到密钥对
- 公钥 = (e, n) = (17, 3233)
- 私钥 = (d, n) = (2753, 3233)
注意: n 是公开的,但
必须保密!
五、加密过程(用公钥)
假设要加密明文消息 m (必须是整数,且 0 \le m < n )。
例如: m = 65 (比如字母 'A' 的 ASCII 码)
密文 c 计算公式:
直接算很大,可用快速幂取模算法(也叫模幂运算)。
结果: c = 2790
六、解密过程(用私钥)
收到密文 c = 2790 ,用私钥解密:
明文恢复公式:
同样用快速幂取模,结果: m = 65
七、为什么能解密?(简要原理)
根据欧拉定理,若 m 与 n 互质,则:
而我们构造了 ,即存在整数 k 使得:
所以:
即使 m 与 n 不互质(比如 m 是 p 或 q 的倍数),也可以通过中国剩余定理证明解密仍成立。
八、注意事项(初学者常犯错误)
-
明文必须小于 n
如果消息太长,需分块(但 RSA 不适合直接加密长文本,通常用于加密对称密钥)。 -
不要直接用 RSA 加密原始数据
实际系统中,RSA 通常用于:- 加密一个随机生成的 AES 密钥(混合加密)
- 数字签名(对消息哈希值签名)
-
必须使用填充方案(如 PKCS#1 OAEP)
原始 RSA(“教科书 RSA”)不安全!容易受到多种攻击(如选择密文攻击)。实际应用必须加填充。 -
密钥长度
- 1024 位:已不推荐
- 2048 位:目前主流
- 3072 或 4096 位:更高安全需求
九、Python 示例(教学用,无填充)
# 教学示例:小数字 RSA
p = 61
q = 53
n = p * q
phi = (p - 1) * (q - 1)
e = 17
# 求 d(私钥指数)
def modinv(a, m):
# 扩展欧几里得算法求模逆元
g, x, y = extended_gcd(a, m)
if g != 1:
raise Exception('模逆元不存在')
return x % m
def extended_gcd(a, b):
if a == 0:
return b, 0, 1
gcd, x1, y1 = extended_gcd(b % a, a)
x = y1 - (b // a) * x1
y = x1
return gcd, x, y
d = modinv(e, phi)
print(f"公钥: (e={e}, n={n})")
print(f"私钥: (d={d}, n={n})")
# 加密
m = 65
c = pow(m, e, n)
print("密文:", c)
# 解密
m2 = pow(c, d, n)
print("解密后:", m2)
输出:
公钥: (e=17, n=3233)
私钥: (d=2753, n=3233)
密文: 2790
解密后: 65
十、总结
| 步骤 | 内容 |
|---|---|
| 1 | 选两个大质数 p, q |
| 2 | 计算 n = pq |
| 3 | 计算 |
| 4 | 选 e ,满足 |
| 5 | 求 d ,使得 |
| 6 | 公钥 = (e, n) ,私钥 = (d, n) |
| 7 | 加密: |
| 8 | 解密: |
编码
在 CTF 竞赛中,编码(Encoding)常被用作信息隐藏或混淆手段。需注意:编码 ≠ 加密——编码是可逆的、无密钥的格式转换,目的是便于传输或存储。
1. ASCII 编码
-
作用:将字符映射为数字(0–127),便于计算机处理。
-
标准 ASCII:使用 7 位二进制(0–127);扩展 ASCII 使用 8 位(0–255)。
-
示例:
- 明文:
The quick brown fox jumps over the lazy dog - ASCII(十进制):
84 104 101 32 113 117 105 99 107 32 98 114 111 119 110 32 102 111 120 32 106 117 109 112 115 32 111 118 101 114 32 116 104 101 32 108 97 122 121 32 100 111 103
- 明文:
🔗 ASCII 对照表(OSChina)
🔗 在线 ASCII 编解码
2. Hex(十六进制)
-
原理:将每个字节(8 位)转为两位十六进制数(0–9, A–F)。
-
特点:常见于内存转储、网络协议、文件存储。
-
示例:
- 明文:
The quick... - Hex:
54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67
- 明文:
✅ 对比:ASCII 十进制 → Hex 是直接进制转换。
3. Escape 编码(%u 编码)
-
格式:
%uXXXX,其中XXXX是 Unicode 码点的十六进制(通常为 4 位)。 -
用途:早期 JavaScript 中用于表示 Unicode 字符。
-
示例:
The quick brown fox jumps over the lazy dog→%u0054%u0068%u0065%u0020%u0071%u0075%u0069%u0063%u006b%u0020%u0062%u0072%u006f%u0077%u006e%u0020%u0066%u006f%u0078%u0020%u006a%u0075%u006d%u0070%u0073%u0020%u006f%u0076%u0065%u0072%u0020%u0074%u0068%u0065%u0020%u006c%u0061%u007a%u0079%u0020%u0064%u006f%u0067
-
解码:可用浏览器控制台执行
unescape("%u0054%u0068%u0065")
4. Base 系列编码
Base64
-
字符集:
A–Z,a–z,0–9,+,/(共 64 字符),末尾用=补齐。 -
原理:
- 每 3 字节(24 位)分为 4 组,每组 6 位;
- 每组映射到 Base64 表中的字符。
-
示例:
test base64 code→dGVzdCBiYXNlNjQgY29kZQ==
Base32
- 字符集:
A–Z,2–7(共 32 字符),无小写,无特殊符号。 - 特点:数据膨胀至原长的 8/5,抗错性强。
- 示例:
test→ORSXG5A=
Base16(即 Hex)
- 字符集:
0–9,A–F - 等价于:十六进制表示。
5. Unicode 编码
Unicode 为全球字符提供唯一编号(码点)。常见表示形式:
| 格式 | 示例("The") |
|---|---|
| HTML 十六进制实体 | The |
| HTML 十进制实体 | The |
| Python 风格 | \u0054\u0068\u0065 |
| 带加号形式 | \u+0054\u+0068\u+0065 |
💡 解题关键:识别前缀(
&#x,\u,U+等)选择对应解码方式。
6. HTML 实体编码
-
用途:在 HTML 中安全显示保留字符(如
<,>,&)。 -
格式:
&#DEC;或&#xHEX; -
示例:
test→test<script>→<script>
7. URL 编码(Percent-Encoding)
-
规则:非安全字符 →
%+ ASCII 十六进制 -
安全字符:字母、数字、
-_.~等 -
示例:
- 空格 →
%20 The quick→%54%68%65%20%71%75%69%63%6b
- 空格 →
8. UUencode / XXencode
| 特性 | UUencode | XXencode |
|---|---|---|
| 起源 | Unix 邮件系统 | 改进版 UUencode |
| 字符集 | 可打印 ASCII(含 !"#$%&'() 等) | 仅字母、数字、+、- |
| 可读性 | 较差 | 较好 |
| 示例(首行) | M5&AE... | hJ4VZ... |
示例:The quick brown fox jumps over the lazy dog
UUencode:M5&AE('%U:6-K(&)R;W=N(&9O>"!J=6UP<R!O=F5R('1H92!L87IY(&1O9PH*
XXencode:hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNkc+
✅ XXencode 比 Base64 多
-、少/,更兼容某些系统。
9. 代码混淆与趣味编码
JSFuck
- 仅用 6 字符:
[ ] ( ) ! + - 原理:利用 JS 类型转换生成任意字符
- 示例:
alert(1)→ 数千字符的[]()!+组合 - 执行:可在浏览器 Console 直接运行
jjencode / aaencode
- jjencode:将 JS 转为符号字符串(含
゚ω゚ノ等) - aaencode:转为“颜文字”风格(如
( ゚∀゚)ノ) - 特征:大量日式符号、表情,一眼可识别
Brainfuck
-
指令集:仅 8 个符号
> < + - . , [ ] -
图灵完备,但极难阅读
-
示例(Hello World) :
+++++ +++++ [->++ +++++ +++<] >++++ .---. ...