跳转至

古典密码总结

概述

古典密码学主要考虑消息的保密性,使得只有持有密钥的人才能解密密文获得消息内容,对于消息的完整性和不可否认性则没有太多考虑。

古典密码的分析思路(唯密文攻击): 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 (埃特巴什码)

原理:简单替换密码的特例——字母表中的最后一个字母代表第一个字母,倒数第二个代表第二个字母,依此类推。

\[ \text{明密文映射:} A \leftrightarrow Z, B \leftrightarrow Y, C \leftrightarrow X, \dots \]

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\):

\[ y_1 - y_2 \equiv a(x_1 - x_2) \pmod{26} \]

二、多表代换加密

对于多表替换加密,加密后的字母几乎不再保持原来的频率,一般只能通过寻找算法实现的弱点进行破解。

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 加密:用字母表替换键盘上的排列顺序。

QWE加密