古典密码总结¶
概述¶
古典密码学主要考虑消息的保密性,使得只有持有密钥的人才能解密密文获得消息内容,对于消息的完整性和不可否认性则没有太多考虑。
古典密码的分析思路(唯密文攻击): 1. 确定密码类型:根据题目提示、加密方式、密文字符集、密文展现形式等信息。 2. 确定攻击方法:包括直接分析、蛮力攻击、统计分析等。 3. 确定分析工具:以在线工具与 Python 脚本为主。
| 攻击方法 | 适用场景 | 举例 |
|---|---|---|
| 直接分析法 | 由密码类型可确定映射关系的代换密码 | 凯撒密码、猪圈密码等 |
| 蛮力攻击法 | 密钥空间较小的代换密码或置换密码 | 移位密码、栅栏密码等 |
| 统计分析法 | 密钥空间较大的代换密码 | 简单替换密码、仿射密码等 |
一、单表代换加密¶
通用特点:明密文一一对应。破解方法: - 密钥空间较小时,暴力破解。 - 密文长度足够长时,使用词频分析(如 http://quipqiup.com/ )。
1.1 凯撒密码 (Caesar Cipher)¶
原理:将明文中的每个字母按字母表向后(或向前)循环移动固定数目。
特定偏移量变种: - 偏移量为 10:Avocat (A → K) - 偏移量为 13:ROT13 - 偏移量为 -5:Cassis - 偏移量为 -6:Cassette
基于密钥的凯撒密码 (Keyed Caesar):将密钥的每一位转换为字母表对应顺序的数字,分别以此数字为偏移量加密明文的每一位。
破解:遍历 26 个偏移量(普遍情况),或使用词频分析(密文较长时)。
1.2 移位密码¶
与凯撒密码类似,区别在于移位密码还会处理数字和特殊字符,常用 ASCII 码表进行移位。破解方法为遍历所有可能。
1.3 Atbash Cipher (埃特巴什码)¶
原理:简单替换密码的特例——字母表中的最后一个字母代表第一个字母,倒数第二个代表第二个字母,依此类推。
1.4 简单替换密码 (Simple Substitution Cipher)¶
原理:将每个明文字母替换为唯一对应且不同的字母,字母表是任意排列(完 全混乱),与凯撒密码的区别在于字母表不是简单移位。
密钥空间为 \(26!\),几乎不可能暴力破解,一般采用词频分析。
1.5 仿射密码 (Affine Cipher)¶
原理:
- 加密函数:\(E(x) = (ax + b) \bmod m\)
- 解密函数:\(D(x) = a^{-1}(x - b) \bmod m\)
其中: - \(x\) 为明文数字编码 - \(a\) 与 \(m\) 互质 - \(m\) 是编码系统中字母的数目(一般为 26) - \(a^{-1}\) 是 \(a\) 在 \(\mathbb{Z}_m\) 群的乘法逆元
当 \(a=1\) 时退化为凯撒密码。字母集为 26 时,与 26 互素的 \(a\) 共有 \(\phi(26)=12\) 个,算上 \(b\) 的偏移,密钥空间为 \(12 \times 26 = 312\)。
已知明文攻击:若知道两个密文字母 \(y_1, y_2\) 对应的明文字母 \(x_1, x_2\),可通过以下公式求解 \(a\):
二、多表代换加密¶
对于多表替换加密,加密后的字母几乎不再保持原来的频率,一般只能通过寻找算法实现的弱点进行破解。
2.1 Playfair 密码¶
原理: 1. 选取一串英文字母,除去重复字母,将剩下的字母逐个加入 \(5 \times 5\) 的矩阵,剩余空间按 a-z 顺序填入(去掉 q,或将 i 和 j 视作同一字)。 2. 将明文分成两个一组。若组内字母相同,将 X 加到第一个字母后重新分组。若剩下一个字,也加入 X。 3. 在矩阵中找出每组两个字母的位置: - 不同行不同列:取矩形另外两个角(第一个字母对应行优先)。 - 同行:取各自右方的字母(最右方则取最左方)。 - 同列:取各自下方的字母(最下方则取最上方)。
2.2 Polybius 密码(棋盘密码)¶
原理:将明文加密为两两组合的数字,使用 \(5 \times 5\) 密码表(行列用 1-5 或 ADFGX 标记)。
ADFGX 密码是 Polybius 密码和置换密码的双重加密方案,始于 1918 年德军。
密文特征:纯数字且只包含 1 到 5,密文长度为偶数。
2.3 Vigenere 密码(维吉尼亚密码)¶
原理:使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的简单形式。

密钥循环使用,若密钥长度不足,则重复填充至与明文等长。加密时查 Vigenère 表格,以明文字母为行、密钥字母为列,交叉点即为密文。
破解:关键在于密钥是循环重复的。若知道密钥长度,密文可看作交织在一起的凯撒密码。
- 卡西斯基试验:利用常用单词(如 "the")可能被同样的密钥字母加密,从而在密文中重复出现。计算重复片段之间的字母间隔,取公约数可得密钥长度候选。
- 弗里德曼试验:基于重合指数分析。
2.4 Nihilist 密码¶
原理:明文 + 关键字 = 密文。利用密钥构造 \(5 \times 5\) 棋盘矩阵(类似 Polybius 密码),字母 i 和 j 等价。加密时查找明文字母在矩阵中的行列坐标,将行列号拼接作为密文。
密文特征:纯数字、只包含 1 到 5、密文长度为偶数。
2.5 Hill 密码(希尔密码)¶
原理:将明文字母编码为数字(A=0, B=1, ...),然后组织成 n 维向量,与一个 \(n \times n\) 的可逆矩阵相乘,结果模 26 得密文。
加密矩阵必须满足行列式与 26 互质才可逆。
2.6 Autokey Cipher(自动密钥密码)¶
原理:与维吉尼亚密码类似,但密钥生成方式不同。主要分为关键词自动密钥和原文自动密钥两种。
以关键词自动密钥为例:初始密钥为关键词,然后用明文本身填充剩余密钥。
三、其它类型加密¶
3.1 培根密码 (Baconian Cipher)¶
原理:使用两种不同的字体(代表 A 和 B),结合加密表进行加解密。每个字母用 5 位 A/B 组合表示。
特点: - 只有两种字符 - 每段长度为 5 - 加密内容有特殊的字体之分,亦或大小写之分
3.2 栅栏密码 (Rail Fence Cipher)¶
原理:将明文分成 N 个一组,然后把每组的第 i 个字连起来,形成密文。属于换位密码。
3.3 曲路密码 (Curve Cipher)¶
原理:换位密码,将明文填入约定的行列数表格,按约定的曲线路径依次取出即为密文。


3.4 列移位加密 (Columnar Transposition Cipher)¶
原理:将明文填入约定的表格,按密钥字母在字母表中的顺序对列编号,然后按列的编号顺序依次读出各列即得密文。


3.5 云影密码 (01248 密码)¶
原理:使用 0, 1, 2, 4, 8 四个数字,其中 0 表示间隔,其他数字以加法表示 1-26,分别对应 A-Z。
特点:密文中只有 0, 1, 2, 4, 8。
3.6 JSFuck¶
原理:只用 6 个字符 []()!+ 来编写 JavaScript 程序。利用 JavaScript 的类型转换特性和属性访问实现任意代码。
基本元素:
- false → ![]
- true → !![]
- undefined → [][[]]
- NaN → +[![]]
- 0 → +[]
- 1 → +!+[]
3.7 BrainFuck¶
一种极小化的计算机语言,由 Urban Müller 在 1993 年创建。与其对应的还有 Ook 语言。
3.8 猪圈密码 (Pigpen Cipher)¶
原理:以格子为基础的简单替代式密码,每个格子或区域代表一个字母。


3.9 舞动的小人密码¶
出自福尔摩斯探案集。每个跳舞的小人对应一个英文字母,小人手中的旗子表示该字母是单词的最后一个字母。

3.10 键盘密码¶
手机键盘密码:用两位数字表示字母(第一位为数字键,第二位为该键上的第几个字母)。密文不可能以 1 开头,第二位不超过 4。

电脑键盘棋盘加密:利用电脑键盘的方阵布局。

电脑键盘坐标加密:利用键盘上的字母行和数字行,用行列坐标表示字母。

电脑键盘 QWE 加密:用字母表替换键盘上的排列顺序。
