密码学补完计划 · 古典密码篇¶
本文档为社团内部学习资料,系统讲解密码学相关内容。
1. 古典密码概述¶
1.1 定义¶
古典密码是指计算机出现之前使用的密码技术,主要分为两大类: - 替代密码:将明文中的字符替换为其他字符 - 换位密码:重新排列明文中的字符顺序
1.2 发展历程¶
| 时期 | 密码 | 特点 |
|---|---|---|
| 古罗马 | 凯撒密码 | 最早的移位密码 |
| 中世纪 | 简单替换密码 | 字母表随机映射 |
| 文艺复兴 | 维吉尼亚密码 | 多表替代,破解难度提升 |
| 19世纪 | 维吉尼亚破解 | 巴贝奇、卡西斯基发现破解方法 |
| 二战 | 恩尼格玛 | 机械密码机,多表替代的终极形态 |
1.3 古典密码 vs 现代密码¶
| 维度 | 古典密码 | 现代密码 |
|---|---|---|
| 密钥长度 | 短(几字节到几十字节) | 长(128位以上) |
| 安全性 | 可被手工或简单程序破解 | 依赖数学难题 |
| 实现方式 | 手工、简单机械 | 计算机算法 |
| 应用 | 军事、外交 | 互联网安全、区块链等 |
2. 单表替代密码¶
单表替代密码是指使用固定的映射关系将明文字母替换为密文字母。
2.1 凯撒密码¶
原理¶
- 将字母表循环移位固定位数
- 密钥:移位量k(1-25)
加密公式¶
$$ C = (P + k)\pmod{26} $$ 其中P为明文数字(A=0),C为密文数字
解密公式¶
\[
P = (C - k)\pmod{26}
\]
示例¶
识别特征¶
- 密文保持字母结构(单词长度不变)
- 词频分布与英文相同,只是整体偏移
- 暴力破解只需尝试25次
变种:ROT家族¶
| 变种 | 适用范围 | 示例 |
|---|---|---|
| ROT5 | 数字0-9 | 0→5, 1→6, ..., 9→4 |
| ROT13 | 字母A-Z | 最常用,加密两次恢复原文 |
| ROT18 | 字母+数字 | ROT13+ROT5 |
| ROT47 | ASCII 33-126 | 对可打印字符进行47位移位 |
ROT13示例¶
2.2 Atbash密码¶
原理¶
- 字母表对称映射:A↔Z, B↔Y, C↔X, ...
- 公式:
C = 25 - P(A=0, Z=25)
映射表¶
示例¶
识别特征¶
- 字母映射是对称的
- 解密方法同加密方法
- 常见于简单谜题和CTF签到题
2.3 简单替换密码¶
原理¶
- 建立字母表的一对一随机映射
- 密钥空间:26! ≈ 2^88(约288位)
示例¶
| Text Only | |
|---|---|
识别特征¶
- 密文字母频率分布与英文相同,但字母对应关系改变
- 单词长度模式保留
- 可通过频率分析破解
破解方法¶
- 频率分析:英文中E、T、A出现频率最高
- 常见单词:寻找"the"、"and"等常见词
- 字母组合:分析常见双字母组(th、he、in等)
2.4 仿射密码¶
原理¶
-
凯撒密码的扩展,使用线性变换
-
加密公式:
$$ C = (a \times P + b) \pmod{26} $$
- 解密公式:
$$ P = a^{-1} \times (C - b) \pmod{26} $$
参数要求¶
- a 与 26 互质 $$ \gcd(a, 26) = 1 $$
- a 的取值:1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25(共12种)
- b 取值:0-25(26种)
- 密钥空间:12 × 26 = 312
示例¶
| Text Only | |
|---|---|
识别特征¶
- 字母映射有数学规律(不是完全随机)
- 密文字母分布可能呈现周期性
- 可通过求解线性方程破解
破解方法¶
- 找到两个字母的对应关系,列方程求解
- 暴力尝试所有312种组合
2.5 键盘布局密码¶
原理¶
- 利用键盘布局进行映射
- 常见类型:
- QWERTY移位:每个字母替换为相邻键
- 键盘行列映射:按键盘行列重新编码
QWERTY移位示例¶
| Text Only | |
|---|---|
识别特征¶
- 密文看起来像随机字母,但实际是键盘相邻键
- 常见于CTF简单题和趣味密码
变种¶
- 上下移位:H→Y, E→D
- 对角线移位:Q→A, A→Z
- 键盘倒序:Q↔P, W↔O
3. 多表替代密码¶
多表替代密码使用多个替换表,根据密钥选择不同的映射,抵抗频率分析。
3.1 维吉尼亚密码¶
原理¶
- 使用关键词,每个位置使用不同的凯撒移位
- 移位量由密钥字母决定(A=0, B=1, ..., Z=25)
加密公式¶
\[C_i = (P_i + K_i) \mod{26}\]
其中\(K_i\)为密钥字母对应的数字
维吉尼亚方阵¶
| A | B | C | ... | Z | |
|---|---|---|---|---|---|
| A | A | B | C | ... | Z |
| B | B | C | D | ... | A |
| C | C | D | E | ... | B |
| ... | ... | ... | ... | ... | ... |
| Z | Z | A | B | ... | Y |
加密示例¶
| Text Only | |
|---|---|
解密示例¶
| Text Only | |
|---|---|
识别特征¶
- 相同明文可能对应不同密文(消除单表替代的频率特征)
- 密文整体字母频率分布更均匀
- 存在周期性重复模式
破解方法¶
- Kasiski测试:寻找重复的密文片段,推测密钥长度
- 重合指数:计算不同偏移下的重合指数,找出密钥长度
- 确定密钥长度后:将密文按密钥长度分组,每组独立进行频率分析破解凯撒
3.2 博福特密码¶
原理¶
-
维吉尼亚密码的变种
-
加密公式:
$$ C_i = (K_i - P_i) \mod{26} $$
- 解密公式:(加密和解密相同)
$$ P_i = (K_i - C_i) \mod{26} $$
示例¶
| Text Only | |
|---|---|
特点¶
- 加密和解密过程相同
- 使用与维吉尼亚相同的方阵,但查找方式不同
3.3 滚动密钥密码¶
原理¶
- 维吉尼亚密码的变种
- 密钥与明文等长,通常是一段文本
示例¶
特点¶
- 理论上更安全(无密钥重复)
- 实际使用中密钥可能被猜测(如常见书籍)
3.4 自动密钥密码¶
原理¶
- 维吉尼亚密码的变种
- 密钥 = 初始密钥 + 明文本身(或密文本身)
两种变体¶
- 明文字典式:密钥 = 初始密钥 + 明文
- 密文字典式:密钥 = 初始密钥 + 密文
示例(明文自动密钥)¶
4. 换位密码¶
换位密码不改变字母本身,只改变字母的顺序。
4.1 栅栏密码¶
原理¶
- 将明文按一定宽度写成多行,再按列读取
普通栅栏(2栏)¶
示例2(3栏)¶
| Text Only | |
|---|---|
W型栅栏(曲径密码)¶
- 按波浪形写入,再按行读取
| Text Only | |
|---|---|
识别特征¶
- 字母频率与明文相同(只是顺序改变)
- 密文长度与明文相同
- 常见于CTF签到题
破解方法¶
- 暴力尝试所有可能的栏数和排列方式
4.2 列换位密码¶
原理¶
- 将明文按行写入矩阵,再按列读取
- 列的顺序由密钥决定
示例¶
识别特征¶
- 密文长度与明文相同
- 解密需要知道密钥(列的顺序)
- 可通过分析列数猜测
4.3 螺旋密码¶
原理¶
- 将明文按螺旋顺序写入矩阵,再按行读取(或相反)
示例¶
识别特征¶
- 密文长度与明文相同
- 需要知道矩阵大小和螺旋方向
5. 其他古典密码¶
5.1 波利比乌斯方阵¶
原理¶
- 使用5×5网格(I和J合并)
- 每个字母用行号和列号表示(两位数字)
方阵¶
示例¶
识别特征¶
- 密文是两位数字组合
- 数字范围1-5
- 常见于CTF和密室逃脱
变种¶
- 使用6×6方阵(包含数字)
- 使用不同顺序的字母排列
5.2 阿伯哈姆密码¶
原理¶
- 波利比乌斯方阵的变种
- 使用特定关键词填充方阵
示例¶
| Text Only | |
|---|---|
5.3 跳舞的小人¶
背景¶
- 柯南·道尔《福尔摩斯探案集》中的密码
- 使用不同姿势的小人代表字母
原理¶
- 每个小人姿势对应一个字母
- 旗帜表示单词结束
识别特征¶
- 图形符号,小人姿势
- 常见于CTF图片隐写题
6. 古典密码的破解方法¶
6.1 频率分析¶
英文单字母频率¶
| Text Only | |
|---|---|
英文双字母组频率¶
| Text Only | |
|---|---|
英文三字母组频率¶
| Text Only | |
|---|---|
破解步骤¶
- 统计密文字母频率
- 与英文频率对比,猜测E、T等高频字母的对应关系
- 寻找常见单词(如"the"),验证猜测
- 逐步替换,形成可读文本
6.2 重合指数¶
定义¶
- 随机选取两个字母,它们相同的概率
- 英文重合指数:约0.065 $$ I = \frac{\sum n_i (n_i - 1)}{N (N - 1)} $$
用途¶
- 判断密文是否为英文
- 推测维吉尼亚密码的密钥长度
计算方法¶
$$ I = \frac{\sum n_i (n_i - 1)}{N (N - 1)} $$ 其中f_i为字母i的频率,N为总字母数
破解维吉尼亚的应用¶
- 假设密钥长度为L
- 将密文分成L组
- 计算每组的重合指数
- 如果某组重合指数接近0.065,则该分组可能是正确的
6.3 Kasiski测试¶
原理¶
- 寻找密文中重复的片段
- 重复片段之间的距离可能是密钥长度的倍数
步骤¶
- 找出所有重复的3-4字母片段
- 记录片段之间的距离
- 计算这些距离的最大公约数
- GCD很可能就是密钥长度
示例¶
| Text Only | |
|---|---|
6.4 暴力破解¶
适用范围¶
- 密钥空间较小的密码(凯撒、仿射、简单栅栏等)
凯撒暴力破解¶
| Text Only | |
|---|---|
仿射暴力破解¶
| Text Only | |
|---|---|
7. CTF中的古典密码¶
7.1 常见题型¶
| 题型 | 描述 | 难度 |
|---|---|---|
| 签到题 | 直接解码凯撒、Base64等 | ⭐ |
| 多重编码 | 多层嵌套,需要逐层解码 | ⭐⭐ |
| 混合密码 | 多种古典密码组合 | ⭐⭐⭐ |
| 带提示题 | 提示密钥或关键信息 | ⭐⭐ |
| 无提示题 | 需要频率分析等手段 | ⭐⭐⭐⭐ |
7.2 解题思路¶
- 识别密码类型
- 观察密文特征(字母、数字、符号)
- 尝试常见编码和密码
- 尝试简单破解
- 凯撒:暴力破解
- 栅栏:尝试不同栏数
- Base系列:直接解码
- 频率分析
- 统计字母频率
- 与英文频率对比
- 猜测常见单词
- 工具辅助
- 使用CyberChef的Magic功能
- 多层嵌套
- 先解码外层
- 重复直到得到可读文本
7.3 工具推荐¶
| 工具 | 用途 | 特点 |
|---|---|---|
| CyberChef | 通用加解密 | 支持所有古典密码,可视化操作 |
| Ciphey | 自动化解密 | 支持50+种编码/密码 |
| dCode | 在线工具集 | 分类详细,每种密码都有单独页面 |
| Python | 自定义脚本 | 灵活处理特殊需求 |
7.4 Python脚本示例¶
凯撒暴力破解¶
| Python | |
|---|---|
维吉尼亚解密¶
频率分析辅助¶
8. 练习¶
基础题¶
-
凯撒密码
Text Only -
ROT13
Text Only -
Atbash
Text Only -
栅栏密码(2栏)
Text Only -
仿射密码
Text Only -
简单替换密码
-
维吉尼亚密码
-
波利比乌斯方阵
Text Only -
多层嵌套
提示:先ROT13,再凯撒,得到一句话Text Only -
混合密码
答案¶
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOGTHE QUICK BROWN FOX JUMPS OVER THE LAZY DOGTHE IS A BRILLIANT THING AND HAZYHELLOWORLDHELLOThe secret key is the same key(示例)KEEP YOUR FRIENDS CLOSEHELLOWORLD(需合并I/J)Hello, world! The key is: pipeTHIS IS A TEST(示例)