1. 项目概述:从“凯撒”到“维吉尼亚”,古典密码的魅力与基石
如果你对密码学感兴趣,或者想了解现代加密技术背后的历史脉络,那么古典密码绝对是一个无法绕开的起点。这不仅仅是历史课,更是理解密码学核心思想的绝佳途径。古典密码,顾名思义,指的是在计算机出现之前,主要依靠纸笔、简单工具或机械装置实现的加密方法。它们不像今天的AES、RSA那样复杂,但其设计思想——替换、移位、置换——却构成了现代密码学的基石。我最初接触密码学,就是从亲手用纸笔“破解”一段凯撒密码开始的,那种亲手揭开秘密的成就感,至今难忘。
“古典密码(一)”这个标题,意味着我们将系统性地深入这个领域。本文的目标,是为你搭建一个清晰、实用的古典密码知识框架。我们将从最基础的凯撒密码出发,逐步深入到更复杂的多表替换密码,如维吉尼亚密码。我不会只停留在“是什么”的层面,而是会详细拆解“为什么”这么设计,以及“如何”手工实现和破解。无论你是计算机专业的学生、信息安全爱好者,还是单纯对谜题和逻辑感兴趣的朋友,都能从这些看似简单的“游戏”中,窥见信息隐藏与保护的原始智慧。你会发现,在没有计算机的时代,人类的智慧是如何在保密通信的攻防中不断演进的。
2. 古典密码的核心思想与分类体系
在深入具体算法之前,我们必须先理解古典密码赖以生存的两种最核心、最根本的操作思想:替换和置换。几乎所有古典密码都是这两种思想的组合或变体。
2.1 替换:让字母“改头换面”
替换,顾名思义,就是将明文中的每一个字母,按照某种固定的规则,替换成另一个字母(或符号)。这是古典密码中最直观、也最常用的方法。
- 核心原理:建立一个从明文字母表到密文字母表的一一映射。例如,规定 A->D, B->E, C->F, ... Z->C。
- 生活类比:就像我们小时候玩的“密码本”,把“苹果”写成“香蕉”,把“回家”写成“出门”。只要通信双方持有同一本“密码本”(即相同的替换规则),就能进行秘密通信。
- 安全性根源:替换密码的安全性完全依赖于这个映射规则的保密性。一旦规则泄露,所有加密信息将一览无余。更致命的是,由于规则固定,密文中字母的统计特性(频率分布)与明文一致,这为破解留下了巨大漏洞。
2.2 置换:给字母“重新排队”
置换,也称为“重排”或“换位”,它不改变字母本身,而是打乱字母在明文中的出现顺序。
- 核心原理:按照某种算法重新排列明文中的字符位置。解密时,再按照逆序规则排列回来。
- 生活类比:想象你把一句话的每个字写在单独的卡片上,然后像洗牌一样彻底打乱顺序,再把打乱后的卡片序列交给对方。对方只有知道你是怎么“洗牌”的,才能把卡片按原顺序排好,读出原文。
- 安全性根源:置换密码保留了明文的所有字符,因此密文的字母频率分布与明文完全相同。破解者的主要任务是找出那个“洗牌”的规律。单纯的置换密码通常比单纯的替换密码更容易被破解,因为它不改变字符的“身份”。
在实际应用中,古典密码常常将替换和置换结合使用,以增强安全性。例如,先对明文进行一次替换加密,再对结果进行一次置换加密,这样能同时扰乱字符的“身份”和“位置”。
2.3 古典密码的三大分类
基于上述核心思想,我们可以将古典密码分为三大类,这有助于我们建立清晰的学习路径:
- 单表替换密码:整个加密过程只使用一个固定的替换表。这是最简单,也最脆弱的一类。凯撒密码是其最著名的代表,而仿射密码则为其增加了一点数学复杂度。
- 多表替换密码:使用多个替换表,在加密过程中根据某个密钥动态地选择使用哪个表。这极大地破坏了密文的统计特性,安全性显著提高。维吉尼亚密码是这一类中的佼佼者,在几个世纪内都被认为是“不可破译”的。
- 置换密码:专注于打乱字符顺序。栅栏密码和矩阵置换密码是典型的例子。它们通常不单独使用,而是作为增强其他密码安全性的辅助手段。
理解这个分类体系,就像拿到了一张地图。接下来,我们将沿着这条路径,逐一深入探索。
3. 单表替换密码的典范:凯撒密码与仿射密码
让我们从最简单的单表替换密码开始,这是理解所有替换密码的基石。
3.1 凯撒密码:位移的艺术
凯撒密码得名于古罗马的凯撒大帝,据说他曾用此方法传递军情。它的规则简单到令人惊讶:将明文中的每个字母在字母表中向后(或向前)移动一个固定的位数。
- 加密公式(数学描述):
C = (P + K) mod 26P: 明文字母的序号(A=0, B=1, ..., Z=25)K: 偏移量(密钥),例如凯撒常用的是3C: 密文字母的序号mod 26: 取模26运算,确保结果仍在0-25的字母表范围内。
- 手工实操示例:
- 明文:HELLO
- 密钥(偏移量):K=3
- 加密过程:
- H(7) -> (7+3)=10 -> K
- E(4) -> (4+3)=7 -> H
- L(11) -> (11+3)=14 -> O
- L(11) -> (11+3)=14 -> O
- O(14) -> (14+3)=17 -> R
- 密文:KHOOR
- 解密公式:
P = (C - K) mod 26。收到“KHOOR”后,将每个字母序号减3再取模,即可恢复“HELLO”。
注意:这里的“mod”是取余运算。例如,(25+3)=28, 28 mod 26 = 2,对应字母C。这保证了字母表循环衔接。
为什么凯撒密码不安全?因为它只有26种可能的密钥(偏移量0-25,其中偏移0等于没加密)。攻击者甚至不需要任何高深技巧,简单地尝试所有26种可能的偏移(称为“暴力破解”或“穷举攻击”),最多几分钟就能得到原文。此外,它完全保留了明文的词频、单词边界等统计特征,有经验的分析者一眼就能看出端倪。
3.2 仿射密码:为凯撒增加一道乘法锁
仿射密码可以看作是凯撒密码的升级版,它在加法移位的基础上,增加了一个乘法运算,使得替换规则不再仅仅是平移,而是一次线性变换。
- 加密公式:
C = (a * P + b) mod 26a和b是密钥。a必须与26互质(即最大公约数 gcd(a, 26) = 1),否则会导致多个明文字母加密到同一个密文字母,解密时无法唯一确定。
- 为什么要求a与26互质?这是为了保证加密函数是一个“双射”,即每个明文字母唯一对应一个密文字母,且每个密文字母也唯一对应一个明文字母。如果a与26有公因数(比如a=2,gcd(2,26)=2),那么明文A(0)和明文N(13)加密后都是
(2*0+b) mod 26 = b和(2*13+b) mod 26 = (26+b) mod 26 = b,都对应同一个密文,解密时遇到密文b,你无法确定它来自A还是N,信息就丢失了。 - 解密公式:
P = a^(-1) * (C - b) mod 26- 这里的
a^(-1)不是简单的倒数,而是指a在模26下的乘法逆元。即寻找一个数x,使得(a * x) mod 26 = 1。
- 这里的
- 手工实操示例:
- 假设密钥
a=5,b=8。首先验证 gcd(5,26)=1,符合要求。 - 明文:AFFINE (对应 A=0, F=5, F=5, I=8, N=13, E=4)
- 加密过程:
- A(0) -> (5*0+8) mod 26 = 8 -> I
- F(5) -> (5*5+8)=33 mod 26 = 7 -> H
- F(5) -> 同上 -> H
- I(8) -> (5*8+8)=48 mod 26 = 22 -> W
- N(13) -> (5*13+8)=73 mod 26 = 21 -> V
- E(4) -> (5*4+8)=28 mod 26 = 2 -> C
- 密文:IHHWVC
- 假设密钥
仿射密码的安全性提升了吗?确实比凯撒密码好。因为密钥空间变大了。a有12种可能(与26互质的小于26的数:1,3,5,7,9,11,15,17,19,21,23,25),b有26种可能,总密钥数为12*26=312个。虽然对于计算机来说仍是瞬间可破,但手工穷举的难度大大增加。然而,它依然是单表替换,密文中字母的频率分布与明文完全对应,通过统计频率分析(例如,英文中E的出现频率最高),结合可能的单词试探,依然可以较容易地被破解。
4. 多表替换的里程碑:维吉尼亚密码
当人们意识到单表替换的致命缺陷——固定的频率特征——之后,密码设计者开始思考如何让同一个明文字母,在不同的位置被替换成不同的密文字母。这就是多表替换的思想,而维吉尼亚密码是其最经典、最系统的实现。
4.1 核心原理:用密钥决定“哪张表”
维吉尼亚密码的本质,是使用了26个不同的凯撒密码表。这26张表,分别对应密钥字母A到Z。A表是偏移量为0的凯撒表(即明文=密文),B表是偏移量为1的凯撒表,……,Z表是偏移量为25的凯撒表。
加密时,你需要一个关键词(比如“KEY”)。然后,用这个关键词来决定对明文的每一个字母,使用哪一张凯撒表进行加密。
- 加密公式:
C_i = (P_i + K_i) mod 26P_i: 明文中第i个字母的序号K_i: 密钥中对应第i个字母的序号。密钥会被循环重复使用以覆盖整个明文。C_i: 密文中第i个字母的序号
- 手工实操示例(使用维吉尼亚方阵表): 维吉尼亚方阵是一个26x26的表格,第一行是明文行(A-Z),第一列是密钥字母列(A-Z)。每一行就是一个以该行首字母为密钥的凯撒密码表。
- 明文:ATTACKATDAWN
- 密钥:LEMON (循环使用:LEMONLEMONLE)
- 加密过程(查表法):
- 明文字母A,对应密钥字母L,找到L行与A列交叉点:L
- 明文字母T,对应密钥字母E,找到E行与T列交叉点:X
- 明文字母T,对应密钥字母M,找到M行与T列交叉点:F
- 明文字母A,对应密钥字母O,找到O行与A列交叉点:O
- 明文字母C,对应密钥字母N,找到N行与C列交叉点:P
- ... 以此类推。
- 密文:LXFOPVEFRNHR
维吉尼亚密码的威力何在?它成功地掩盖了字母的频率特征。在明文里,字母T出现了多次。在密文里,因为对应不同的密钥字母(E, M, O...),这些T被加密成了X, F, V等完全不同的字母。这使得单纯的频率分析方法失效,安全性得到了质的飞跃。在长达数百年里,它被誉为“不可破译的密码”。
4.2 破解维吉尼亚密码的钥匙:卡西斯基试验与重合指数法
没有绝对安全的密码。19世纪,查尔斯·巴贝奇和弗里德里希·卡西斯基几乎同时独立发现了破解维吉尼亚密码的方法。其核心思路是:如果密钥长度被猜出或求出,那么维吉尼亚密码就退化成了多个独立的凯撒密码。
第一步:确定密钥长度——卡西斯基试验
- 原理:在密文中寻找重复出现的、长度至少为3的字母片段。这些重复很可能是因为明文中相同的单词(如“THE”),恰好被密钥中相同的部分加密所致。
- 操作:记录这些重复片段起始位置之间的距离。例如,“ABC”在位置5和20出现,距离为15。计算所有这些距离的最大公约数(GCD),这个GCD很可能就是密钥的长度。
- 举例:假设多次计算得到的距离有15,30,45,那么GCD是15,密钥长度很可能为15或15的因数(5,3等)。
第二步:分割与频率分析——重合指数法
- 分割:假设密钥长度为
L。将密文字母按位置分成L组:- 第1组:第1, 1+L, 1+2L, ... 个字母
- 第2组:第2, 2+L, 2+2L, ... 个字母
- ...
- 第L组:第L, 2L, 3L, ... 个字母 由于每组内的字母都是用同一个密钥字母(即同一张凯撒表)加密的,因此每一组都是一个单表替换密码。
- 分析:对每一组密文,计算其重合指数。重合指数是文本中随机抽取两个字母相同的概率。对于一段有意义的英文文本,这个值大约在0.065左右;对于完全随机的字母串,这个值约为0.038。
- 破解:对每一组,尝试所有26种可能的凯撒偏移(即假设该组密钥字母是A到Z),分别计算解密后文本的重合指数。当偏移正确时,解密出的文本接近英文,重合指数会接近0.065;偏移错误时,文本杂乱,重合指数接近0.038。从而可以确定每一组的密钥字母。
- 还原:将各组求出的密钥字母按顺序组合,就得到了完整的密钥。再用此密钥解密整个密文即可。
实操心得:手工进行卡西斯基试验和重合指数计算非常繁琐,但却是理解多表密码破解精髓的最佳方式。现代我们可以用Python等工具快速实现这些算法。真正动手算一遍,你会对“密钥空间”、“统计特性”这些概念有刻骨铭心的理解。这也是为什么古典密码教学价值极高的原因——它把复杂的密码学原理,浓缩成了可触摸、可计算的过程。
5. 置换密码的代表:栅栏密码
最后,我们来看另一大类:置换密码。它不改变字符本身,只改变顺序。
栅栏密码是最简单的置换密码,它的加密过程就像把文字写在栅栏的栏杆上。
- 加密步骤(以深度2为例):
- 将明文按“之”字形写成两行。
- 按行读出,形成密文。
- 示例:
- 明文:HELLOWORLD
- 写成两行: 第一行:H L O O L 第二行:E L W R D
- 按行读出密文:HLOOLELWRD
- 解密步骤:
- 计算密文长度(10),深度为2,则每行应约有5个字母。
- 将密文前半部分(HLOOL)放在第一行,后半部分(ELWRD)放在第二行。
- 按“之”字形(先第一行第一个,再第二行第一个,然后第一行第二个...)的规则竖着读,即可恢复明文。
栅栏密码的安全性:极低。它不提供任何语义上的混淆,只是打乱了顺序。对于较短的文本,可能造成阅读困难,但一旦意识到是换位密码,通过尝试不同的“栅栏深度”(2,3,4...)很容易破解。它通常作为其他加密方法的一层额外混淆,或用于趣味谜题。
6. 古典密码的实战演练与手工破解体验
理解了原理,最好的巩固方式就是动手。这里我设计一个综合性的手工破解练习,带你体验一次完整的“密码分析员”工作。
挑战:你截获了一段密文,并怀疑它使用的是古典密码。密文如下:WKH HDVLHVW PHWKRG RI HQFLSKHULQJ D PHVVDJH LV WR UHSODFH HDFK OHWWHU EB DQRWKHU XVLQJ D ILAHG UXOH.
第一步:初步观察与判断
- 密文由字母和空格组成,保留了单词分隔。这提示我们,它可能是一种简单替换密码(单表替换),因为复杂的多表或现代加密通常会处理掉这种自然语言特征。
- 密文中有一些非常短的单词,如
WKH,LV,EB。在英文中,三字母单词极有可能是THE,IS,BY等。这给了我们突破口。
第二步:频率分析与单词猜测
- 统计单字母频率(可以借助简单工具或手工粗略估算)。你会发现,出现次数最多的字母可能是
H,W,D等。 - 关键猜测:密文开头的
WKH,极大概率对应英文中最常见的单词THE。- 如果
W = T,K = H,H = E。
- 如果
- 代入验证:看密文第三行
D PHVVDJH,根据猜测,D对应T?这不太对,因为T在英文中频率很高,D在这里是单独一个字母,很可能对应A。让我们先保留WKH=THE的假设。 - 寻找其他高频词:密文中有
HQFLSKHULQJ,根据H=E,这个词里有多个H,可能是ing结尾的动词。PHWKRG,根据H=E,可能是method。假设P=M,W=O?这与之前W=T冲突。说明我们的WKH=THE假设需要调整。
第三步:系统性的替换尝试(基于凯撒猜想)既然可能是单表替换,我们试试最简单的凯撒密码。写一个字母表,然后尝试不同的偏移量。
- 尝试偏移量3(凯撒本人的偏好):
- A -> D, B -> E, C -> F, ..., W -> Z, X -> A, Y -> B, Z -> C。
- 将密文
W替换为T,K替换为H,H替换为E。看,WKH变成了THE!成功了第一步。 - 继续全文替换:
WKH HDVLHVW PHWKRG...->THE EASIEST METHOD... - 全文解密后为:
THE EASIEST METHOD OF ENCIPHERING A MESSAGE IS TO REPLACE EACH LETTER BY ANOTHER USING A FIXED RULE. - 语义完全通顺!
破解完成!这段密文使用的正是偏移量为3的凯撒密码。它本身是一句描述密码学的话:“最简单的加密信息的方法,就是使用一个固定的规则,将每个字母替换成另一个字母。” 这恰恰是对单表替换密码的完美诠释。
这个练习给你的启示:
- 模式识别是关键:短词、高频字母、常见词缀(如-ing, -tion)是破解单表替换的突破口。
- 先假设,后验证:密码分析是一个提出假设并用证据验证或推翻的过程。从
WKH=THE开始是一个合理的起点。 - 凯撒密码的脆弱性:一旦识别出是凯撒移位,26次尝试内必破。在实际中,攻击者会编写脚本瞬间完成所有尝试。
7. 从古典到现代:核心思想的传承与演变
当我们回顾凯撒、仿射、维吉尼亚这些密码时,绝不能仅仅视其为过时的玩具。它们所蕴含的思想,至今仍在深刻地影响着现代密码学。
- 混淆与扩散:这是香农提出的密码设计两大原则。混淆指密文与密钥之间的关系应尽可能复杂(如仿射密码中的乘法和加法,维吉尼亚的多表),让攻击者无法从密文推知密钥。扩散指明文中的微小改变应引起密文的巨大变化(古典密码中这点较弱,但在现代分组密码如AES中至关重要)。古典密码的替换操作是“混淆”的雏形,置换操作是“扩散”的雏形。
- 密钥与算法分离:维吉尼亚密码清晰地区分了算法(维吉尼亚方阵/模加运算)和密钥(那个关键词)。算法可以公开,但密钥必须保密。这正是现代密码学的基石——“柯克霍夫原则”的体现:系统的安全性不应依赖于算法的保密,而应依赖于密钥的保密。即使敌人知道你的加密机(算法),只要他拿不到密钥,就无法破译信息。
- 统计分析与安全性:古典密码的破解史,就是一部与统计特征斗争的历史。单表替换败于字母频率分析,维吉尼亚密码通过多表消除了单一频率特征,但又因重复使用密钥而暴露出周期性,被卡西斯基试验攻破。这直接推动了现代密码设计必须能够抵抗各种统计攻击。现代加密算法(如AES)的输出,在统计上看应该与真正的随机序列无法区分。
- 计算安全与理论安全:古典密码在计算能力低下的时代有其价值。但随着计算能力的飞跃,它们的密钥空间太小,在暴力搜索面前不堪一击。这引出了计算安全性的概念:一个密码系统在当前和可预见的未来计算能力下是安全的,即可认为是安全的。与之相对的是信息论安全(如一次一密),那是理论上绝对不可破的,但实用性很差。现代密码学追求的是在实用性和计算安全性之间取得平衡。
亲手实现并破解这些古典密码,是一个不可替代的学习过程。它让你直观地感受到,一个微小的设计变化(比如从单表到多表)如何带来安全性的巨大提升,也让你深刻理解,为何现代加密算法会设计得如此复杂——它们是在与无数聪明绝顶的攻击者进行长达数十年的攻防博弈中进化而来的产物。当你下次使用HTTPS连接网站时,或许会想起,这条安全通道的起点,正是源于千百年前人们用纸笔进行的、关于秘密的朴素思考。