在开始现代密码学的学习之前,我们先来回顾一下古典密码学中的一些基本加解密模式。虽然这些模式在现代密码学中已经不再安全,但它们的设计思想和分析方法对于理解现代密码学的原理仍然非常有帮助。

在这一章中,我们将重点分析单表替换密码(Monoalphabetic Substitution Cipher)。单表替换密码是一种最简单的加密方法,它通过将每个字母替换为另一个字母来实现加密,或者将一种特殊的替换规则应用于每个字母。虽然这种方法看起来很简单,但它的安全性却非常低,很容易被破解。

话不多说,我们直接进入单表替换密码的分析吧!😎

凯撒密码(Caesar Cipher) 🧐

凯撒密码命名自古罗马的凯撒大帝,他使用这种简单的替换方法来保护军事通信。凯撒密码通过将字母表中的每个字母向后移动固定的位数来加密消息。

为了方便理解,我们将字母表中的字母映射为数字,例如,$a=0$, $b=1$, …, $Z=25$。

假设我们选择一个固定的位移量 $k$,那么对于一个明文字符 $P$,其对应的密文字符 $C$ 可以通过以下公式计算:

同样地,解密过程可以通过以下公式实现:

简单举个例,如果我们选择 $k=3$,那么明文 “HELLO” 将被加密为 “KHOOR”。

在凯撒大帝时代,这种加密方法可能足够保护军事通信,但在现代,这种方法非常容易被破解,因为只有 25 种可能的位移量,计算机可以快速尝试所有可能,完全不用管 $k$ 的具体值。

目前网上流传的凯撒密码加解密工具也非常多,甚至一些在线工具都可以直接输入密文进行破解,所以我们在这里就不用代码演示了。😉

仿射密码(Affine Cipher) 👽

有了凯撒密码的基础,我们来看看仿射密码。仿射密码是一种特殊的单表替换密码,它将字母表中的每个字母通过线性变换进行替换。

一样的,我们将字母映射为数字,仿射密码的加密公式如下:

其中 $a$ 和 $b$ 是密钥,$a$ 必须与 $26$ 互质,以确保加密函数是可逆的。

解密过程则需要计算 $a$ 的模逆元 $a^{-1}$,解密公式如下:

虽然仿射密码比凯撒密码更复杂,但它仍然非常容易被破解。$a$ 必须与 $26$ 互质,这意味着 $a$ 的可能值只有 $12$ 个,而 $b$ 的可能值有 $26$ 个,所以总共有 $312$ 种可能的密钥组合,计算机可以轻松尝试所有组合来破解密文。所以一样的,我们也不需要代码演示了。😉

简单替换密码(Simple Substitution Cipher) 😜

简单替换密码是单表替换密码的一个更一般的形式,它允许将字母表中的每个字母替换为任意其他字母,而不仅仅是通过线性变换进行替换。

在简单替换密码中,我们可以使用一个密钥表来定义每个字母的替换关系。例如,如果我们有一个密钥表如下:

明文字母 密文字母 明文字母 密文字母 明文字母 密文字母
A Q K A U X
B W L S V C
C E M D W V
D R N F X B
E T O G Y N
F Y P H Z M
G U Q J
H I R K
I O S L
J P T Z

那么明文 “HELLO” 将被加密为 “ITSSG”。

虽然简单替换密码比前两种方法更复杂,但它仍然非常容易被破解。攻击者可以通过频率分析来破解简单替换密码,因为在自然语言中,某些字母出现的频率较高,例如在英语中,字母 ‘E’ 是最常见的字母,所以攻击者可以通过分析密文中出现频率最高的字母来猜测它可能对应的明文字母。

这里我们简单演示一下如何使用频率分析来破解简单替换密码:

import numpy as np
import matplotlib.pyplot as plt

 #定义字母表和密文
alphabet = 'abcdefghijklmnopqrstuvwxyz'
cipher_text = "wb wi kjb mk rmit bmiq bj rashmwk rmvp yjeryrkb mkd wbi iwokwxwvmkvrmkd"

 #统计密文中每个字母的频率
count = np.zeros(len(alphabet))
for char in cipher_text:
    if char in alphabet:
        index = alphabet.index(char)
        count[index] += 1

 #计算频率并排序
total = sum(count)
frequency = count / total
sorted_indices = np.argsort(-frequency)
sorted_alphabet = ''.join([alphabet[i] for i in sorted_indices])

 #英文字母标准频率(从高到低)
english_frequency_order = 'etaoinshrdlcumwfgypbvkjxqz'

 #初步替换密文字符
translation_table = str.maketrans(sorted_alphabet, english_frequency_order)
decoded_text = cipher_text.translate(translation_table)

print("初步解密结果:", decoded_text)

一般情况下,初步解密结果可能会有一些错误,因为频率分析只是一个猜测工具,实际的替换关系可能与标准频率不完全匹配,所以我们需要手动根据上下文和常见的单词来进一步调整替换关系,直到得到一个合理的明文。

埃特巴什码 (Atbash Cipher) 🧙‍♂️

埃特巴什码是一种特殊的单表替换密码,它将字母表中的每个字母替换为其在字母表中对称位置的字母。例如,$a$ 替换为 $z$,$b$ 替换为 $y$,以此类推。

埃特巴什码的加密和解密过程是相同的,因为它是一种对称替换密码。对于一个明文字符 $P$,其对应的密文字符 $C$ 可以通过以下公式计算:

同样地,解密过程也可以通过相同的公式实现:

但是,一般情况下,我们难以直接看出明文和密文之间的关系,所以我们可以直接将其理解成一个特殊的替换表,然后用字频分析的方法来破解它。解密思路参考前面简单替换密码的破解方法。

培根密码(Bacon’s Cipher) 🥓

培根密码是一种基于二进制编码的单表替换密码,它将每个字母表示为一个五位的二进制数,其中 ‘A’ 表示 0,’B’ 表示 1。例如,字母 ‘A’ 被编码为 “AAAAA”,字母 ‘B’ 被编码为 “AAAAB”,以此类推。

培根密码的加密过程是将每个字母转换为其对应的五位二进制数,然后将这些二进制数连接起来形成密文。解密过程则是将密文分成五位一组,转换回对应的字母。

这里给出映射表:

第一种方式:

字母 编码 字母 编码 字母 编码 字母 编码 字母 编码
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

第二种方式:

字母 编码 字母 编码 字母 编码 字母 编码 字母 编码
a AAAAA b AAAAB c AAABA d AAABB e AABAA
f AABAB g AABBA h AABBB i-j ABAAA k ABAAB
l ABABA m ABABB n ABBAA o ABBAB p ABBBA
q ABBBB r BAAAA s BAAAB t BAABA u-v BAABB
w BABAA x BABAB y BABBA z BABBB

培根密码的安全性非常低,因为它的编码方式非常简单,攻击者可以通过分析密文中的模式来破解它。例如,如果密文中出现了连续的 ‘A’ 或 ‘B’,攻击者可以猜测这些可能对应于某些常见的字母,从而逐步推断出整个密文的内容。网上也有很多在线的培根密码解密工具,可以直接输入密文进行解密,所以我们在这里就不需要代码演示了。😉

摩斯密码(Morse Code) 📡

摩斯密码(大名鼎鼎的电报密码呀)是一种基于点和划的编码系统,它将每个字母和数字表示为一系列的短促信号(点)和长促信号(划)。例如,字母 ‘A’ 被编码为 “.-“,字母 ‘B’ 被编码为 “-…”,以此类推。

摩斯密码的加密过程是将每个字母转换为其对应的点和划的组合,然后将这些组合连接起来形成密文。解密过程则是将密文分成点和划的组合,转换回对应的字母。

当然,实际应用中也经常用 $0$ 和 $1$ 来表示点和划,例如,点用 $0$ 表示,划用 $1$ 表示,那么字母 ‘A’ 就被编码为 “01”,字母 ‘B’ 就被编码为 “1000”,以此类推。

这里给出映射表(由于点线比较难看,就换成图片清晰一点):

摩斯密码映射表

摩斯密码的安全性也非常低,因为它的编码方式非常简单,攻击者可以通过分析密文中的模式来破解它。例如,如果密文中出现了连续的点或划,攻击者可以猜测这些可能对应于某些常见的字母,从而逐步推断出整个密文的内容。网上也有很多在线的摩斯密码解密工具,可以直接输入密文进行解密,所以我们在这里就不需要代码演示了。😉

当然,单表替换密码还有很多其他的变种,积累许多年的古典密码永远无法介绍完,但它们的分析方法基本上都是类似的,都是通过分析密文中的模式和频率来推断出明文的内容。所以,单表替换密码就介绍到这里了,下一章我们将进入更复杂的加密模式分析,敬请期待!😎

上一章:加解密模式分析 - 前言 👈
下一章:加解密模式分析 - 多表替换密码 👈
回到开始:关于我 👈