密码学的黎明:从古代密文到恩尼格玛
密码学的故事,始于人类对秘密的渴望与对泄露的恐惧。早在古埃及墓室的墙壁上,先民们就用藏头诗隐藏着通往永生的咒语;在斯巴达的军事训练中,少年们用密码棒传递战令;而凯撒的铁蹄下,移位密码成为帝国扩张的隐形脉络。这些古老的智慧,看似简陋,却已蕴含密码学的核心悖论:算法可以公开,但密钥必须保密——这一原则在两千多年后终被Formalize为柯克霍夫原则(Kerckhoffs's principle),成为现代密码学的基石。本章将穿越时空,探访这些古典密码的数学灵魂,剖析它们为何在历史长河中相继崩塌,并聚焦二战中恩尼格玛(Enigma)机的辉煌与陨落,揭示图灵(Alan Turing)如何以逻辑为刃,剖开机械加密的幻象,最终点燃现代计算机科学的火种。
古埃及的隐写术:秘密的 first 痕迹
人类最早对“秘密”的追求,往往与宗教、权力和生存紧密交织。在尼罗河畔的古老文明中,秘密并非总是通过复杂的数学变换隐藏,而是借助文化共识与物理媒介的巧妙结合。公元前1900年左右的一块美索不达米亚泥板(通常被视为现存最古老的加密文本)上,工匠用不寻常的符号替换了普通楔形文字,记录了陶罐的配方。但用户指向的古埃及,同样留下了隐秘的智慧。
在埃及神庙的墙壁和莎草纸上,学者们发现了“藏头诗”(acrostic)的雏形。例如,在《亡灵书》(Book of the Dead)的某些版本中,诗节的首字母被精心排列,形成对神明或法老的赞颂,而表面文字则是对来世的描述。这种技术并非严格意义上的加密(因为信息是公开的),却体现了“隐藏于显眼之处”的隐写术(steganography)思想。更直接的加密证据出现在公元前2世纪的埃及文献中:一些商业契约和私人信件使用了简单的字母替换,例如用“🜂”代替“A”,用“𓋹”代替“B”——这些符号来自埃及圣书体,但被赋予新的音值。这种替换本质上是单表代换密码(monoalphabetic substitution cipher) 的原始形态:每个明文字母被唯一、固定地映射到另一个符号。
从数学角度看,单表代换是一个置换(permutation)。设明文字母表为$\mathcal{A} = \{A, B, ..., Z\}$,加密函数$f: \mathcal{A} \to \mathcal{A}$是一个双射。密文$C = f(P)$。解密则是求逆置换$f^{-1}$。这种密码的强度完全取决于置换的随机性。如果置换是随机生成且保密的,理论上它有$26! \approx 4 \times 10^{26}$种可能,暴力破解不可行。但古埃及的实践表明,人们往往使用有规律的替换(如基于符号形状或发音),使得置换易于猜测。更重要的是,任何单表代换都无法抵御频率分析(frequency analysis),因为字母频率分布被完整保留——只是标签改变了。
频率分析的思想最早由阿拉伯学者阿尔·金迪(Al-Kindi)在9世纪系统阐述,但其原理在古埃及的实践中已若隐若现。假设一种替换:英语中最常见的字母“E”在密文中必然对应出现频率最高的符号。通过统计长文本中符号的分布,攻击者可以逐步还原替换表。古埃及的短文本和有限符号集反而降低了破译难度。这揭示了一个永恒真理:在缺乏随机性的情况下,算法的简单性就是脆弱性的根源。这些早期尝试虽未形成系统理论,却已埋下两颗种子:一是对“秘密”的工程化追求,二是对“密钥”概念的朦胧认知——这里的“密钥”就是替换表本身。
斯巴达的密码棒:转置的机械启蒙
如果说古埃及的密码是艺术与神秘主义的混合,那么斯巴达的密码棒(scytale)则是军事工程对秘密通信的第一次理性设计。公元前5世纪,斯巴达将军需要在前线传递加密军令。他们使用一根特定直径的木棒(scytale),将一条羊皮纸或皮革带子螺旋缠绕其上,然后沿木棒轴向书写信息。解开带子后,文字变得杂乱无章;只有将同直径的木棒重新缠绕,才能恢复可读的明文。这是一种典型的转置密码(transposition cipher):它不改变字母本身,只改变顺序。
数学上,转置密码可视为一个位置置换。设明文长度为$n$,加密时按照某种规则(如按列写入、按行读出)重新排列字符位置。scytale的规则是:将带子看作一个矩阵,缠绕木棒相当于按列写入,展开后按行读出。例如,木棒周长为$k$(即每圈字符数),明文“WE ARE DISCOVERED”缠绕在$k=4$的棒上,写入矩阵为: ``` W E A R E D I S C O V E R E D ? ``` (最后一行不足补?)。展开后按行读为“W E A R E D I S C O V E R E D ?”,实际是“WEAREDISCOVERED?”。解密时需知道$k$,并按$k$列重排。
scytale的密钥是木棒直径(或等价地,每圈字符数$k$)。其强度取决于$k$的保密和消息长度。然而,它存在致命弱点:如果攻击者知道或猜出是转置密码,只需尝试所有可能的$k$(从1到消息长度)即可破译。对于较长的消息,$k$的可能性远小于字母替换的密钥空间,且转置不改变字母频率,攻击者甚至可以通过分析密文中连续字母的分布来推断$k$(例如,英语中“TH”、“HE”等双字母频率高,转置后可能被拆散,但统计特征仍可辅助判断)。更重要的是,scytale是物理设备依赖型密码:一旦木棒尺寸泄露,系统即告崩溃。这暗示了一个重要教训:密钥必须易于更换和保密,而物理载体往往成为单点故障。
尽管如此,scytale代表了密码学思想的一次飞跃:它首次将秘密通信与机械结构绑定,启发了后世对转子、齿轮等物理加密装置的设计。其核心思想——通过改变位置而非内容来混淆信息——至今仍是现代分组密码中置换层(permutation layer) 的雏形。
凯撒的移位:置换密码的数学启蒙
公元前1世纪,罗马将军盖乌斯·尤利乌斯·凯撒(Gaius Julius Caesar)在征战中采用了一种简单而有效的加密方法:将明文中的每个字母在字母表中向前移动固定位数。例如,移动3位:A→D,B→E,…,Z→C。这种密码后世称为凯撒密码(Caesar cipher),是移位密码(shift cipher) 的特例,属于单表代换的一种。
其数学表达极为简洁。设字母表大小为$n=26$,密钥$k \in \{1,2,\dots,25\}$(移动0或26相当于无加密)。加密函数为: $$C \equiv P + k \pmod{26}$$ 解密为: $$P \equiv C - k \pmod{26}$$ 其中$P, C$分别表示明文和密文字母的数值(A=0, B=1, …, Z=25)。这本质上是一个循环群上的平移。密钥空间仅25种可能,在现代计算机面前微不足道,但在古代已足够抵御不识字的敌人。
凯撒密码的脆弱性在文艺复兴时期被彻底揭露。9世纪,阿拉伯学者阿尔·金迪已指出频率分析可破解任何单表代换。具体到凯撒密码,由于移位是全局一致的,密文的字母频率分布与英语标准频率分布完全一致,仅发生循环偏移。设英语中字母$X$的频率为$f_X$,密文中字母$Y$的频率为$f_Y$,则存在$k$使得$f_Y = f_{(Y-k) \mod 26}$。攻击者只需计算密文中各字母的频率,找到峰值,假设它对应英语中最常见的字母“E”(频率约12.7%),即可估计$k$。例如,若密文中“H”出现最频繁,则$k = (H - E) \mod 26 = (7 - 4) = 3$,即凯撒当年使用的密钥。
这一破译方法无需知道算法细节,仅依赖语言统计特性。它标志着密码分析从“猜测密钥”的艺术转向基于概率和统计的科学。凯撒密码的教训是深刻的:即使算法简单且密钥保密,只要加密是确定性的单表代换,就必然暴露语言结构。这也引出了后续密码设计的核心目标:隐藏语言统计特征。维吉尼亚密码正是这一目标的第一次成功尝试。
文艺复兴的智慧:维吉尼亚的多表代换革命
16世纪,法国密码学家布莱斯·德·维吉尼亚(Blaise de Vigenère)提出了一种看似“不可破译”的加密方案——维吉尼亚密码(Vigenère cipher)。它使用一个关键词(如“CRYPTO”)重复填充,对每个明文字母应用不同的凯撒移位。例如,关键词“CRYPTO”对应移位序列[2, 17, 24, 15, 19, 14](C=2, R=17, …),明文“HELLO”加密过程为:H+2=J,E+17=V,L+24=J,L+15=A,O+14=C,得到密文“JVJAC”。这是一种多表代换密码(polyalphabetic substitution cipher)。
数学上,设关键词长度为$m$,关键词字母对应的移位值为$k_0, k_1, \dots, k_{m-1}$。对第$i$个明文字母$P_i$,使用密钥$K_{i \mod m}$加密: $$C_i \equiv P_i + K_{i \mod m} \pmod{26}$$ 解密类似。密钥空间急剧扩大:若关键词为随机字母串,则密钥数为$26^m$。当$m$足够大时,暴力破解不可行。
维吉尼亚密码的突破性在于它破坏了字母频率的恒常性。同一明文字母“L”在例子中被加密为“J”和“A”,取决于它在关键词中的位置。因此,密文的整体频率分布变得平坦,接近随机,从而抵御了简单频率分析。这使得维吉尼亚密码在三个世纪内被誉为“不可破译的密码”,甚至被误认为“万能密码”(le chiffre indéchiffrable)。
然而,其安全性建立在关键词真正随机且长度不小于明文的假设上。实际使用中,人们常选用易记的单词或短语(如“QUEEN”“SECRET”),导致$m$很小(通常<10)。这就引入了周期性弱点:加密过程每$m$个字母循环一次。攻击者若获取足够长的密文,可发现每$m$个位置上的字母序列实际上是由同一个凯撒密码加密的。破译的关键是确定$m$。
卡西斯基测试与弗里德曼测试
1863年,普鲁士军官弗里德里希·卡西斯基(Friedrich Kasiski)提出了一种确定密钥长度的方法——卡西斯基测试(Kasiski examination)。其思想是:若密文中出现相同的连续字母串(如“XYZ”),且它们之间的距离是密钥长度$m$的倍数,则这些密文片段很可能由相同的明文片段和相同的密钥片段加密而来。通过收集多个这样的重复片段,计算它们距离的公因数,最可能的公因数即为$m$。例如,密文中“ABC”出现在位置10和50,距离40;“DEF”出现在位置20和80,距离60;40和60的最大公约数为20,故猜测$m=20$。
1920年,威廉·弗里德曼(William Friedman)提出了更精确的弗里德曼测试(Friedman test),基于重合指数(index of coincidence, IC)。IC定义为随机选取密文中两个字母相等的概率。对于英文文本,IC≈0.067;对于均匀随机文本,IC≈0.0385。对于周期为$m$的多表代换,密文可视为$m$个独立子序列的拼接。每个子序列的IC接近0.067(如果子序列足够长),而整体IC为: $$\text{IC}_{\text{total}} \approx \frac{1}{m} \times 0.067 + \left(1 - \frac{1}{m}\right) \times 0.0385$$ 通过计算密文的实际IC,可反解$m$。例如,若$\text{IC}_{\text{total}} = 0.045$,则$m \approx 5$。
一旦$m$确定,攻击者将密文按位置模$m$分组,每组相当于一个凯撒密码,可用频率分析破解。维吉尼亚密码的破译标志着单表代换时代终结,多表代换的脆弱性暴露。它证明:密钥的随机性和长度是关键,而非代换表的数量。这一教训直接催生了现代流密码和一次一密(one-time pad)的理念。
恩尼格玛的诞生:机械加密的巅峰
如果说维吉尼亚密码是古典密码学的最高艺术,那么二战时期的恩尼格玛机则是机械加密的巅峰之作。它由德国工程师阿瑟·谢
恩尼格玛机的机械结构极为精巧,其核心由多个可旋转的转子(rotor)组成,每个转子内部有复杂的电线连接,实现字母到另一字母的映射。典型的三转子恩尼格玛包含三个可旋转的转子(I、II、III)和一个固定的反射器(reflector),此外还有一个插线板(plugboard)用于在输入和输出前进行额外的字母交换。整个加密过程可以视为一系列置换的复合:首先,键盘输入的电流经过插线板进行初步置换;然后依次通过三个转子,每个转子执行一个固定的单表代换;接着电流到达反射器,被反射回转子路径(反射器确保加密可逆,即相同设置下加密和解密使用同一过程);最后电流逆向经过三个转子和插线板,点亮对应的密文字母灯。
从数学角度,每个转子可以表示为一个长度为26的置换$\sigma_i$,反射器是一个对合(involution,即$\rho = \rho^{-1}$),插线板是另一个置换$\pi$。设转子顺序为$R_1, R_2, R_3$,当前转子位置为$p_1, p_2, p_3$(影响置换的循环移位),则加密函数为: $$E = \pi^{-1} \circ \sigma_1^{-p_1} \circ \sigma_2^{-p_2} \circ \sigma_3^{-p_3} \circ \rho \circ \sigma_3^{p_3} \circ \sigma_2^{p_2} \circ \sigma_1^{p_1} \circ \pi$$ 其中$\sigma_i^{p_i}$表示将转子$\sigma_i$循环移位$p_i$位(因为转子每按一次键会旋转,但初始位置由密钥设定)。由于反射器的存在,整个映射是一个对合,即$E = E^{-1}$,这意味着加密和解密使用相同的设置——只需将密文输入即可得到明文。
为了具体理解,考虑一个简化的恩尼格玛模型:只有两个转子和一个反射器,忽略插线板。设转子I的置换为$\sigma_I = (A \to D, B \to K, \dots)$,转子II为$\sigma_{II}$,反射器$\rho$将A↔Y, B↔X, …(成对交换)。假设初始转子位置为AA(即无偏移)。加密字母A的路径:A进入转子I,变为$\sigma_I(A)=D$;进入转子II,变为$\sigma_{II}(D)=?$;进入反射器,变为$\rho(\sigma_{II}(D))$;然后逆向经过转子II和I,最终输出某个字母。每次按键后,最右边的转子会旋转一步(类似里程表),当转子转动到特定位置(如右侧转子的 notch 位置)时,会带动中间转子旋转,有时甚至带动左侧转子——这种转子步进机制导致密钥流随位置变化,使得即使相同字母在不同位置加密结果也不同,从而抵抗了简单的频率分析。
恩尼格玛的密钥空间看似巨大:每个转子有26种初始位置,转子顺序有$3! = 6$种可能(实际有5个转子选3个,组合更多),插线板有$\frac{26!}{2^{10} \cdot 10!} \approx 1.5 \times 10^{14}$种连接方式(选择10对字母交换)。总密钥数可达$10^{23}$量级,远超暴力破解能力。然而,实际安全依赖于密钥管理,而非算法复杂度。德国军队在使用恩尼格玛时制定了严格的密钥表:每天更换转子顺序、 ring setting(环位置)和插线板设置,此外每条消息还有独立的消息密钥(由操作员选择,并通过当日密钥加密传输)。但操作中的疏忽成为致命弱点:例如,一些消息密钥被重复使用(如“AAA”),或操作员选择简单密钥(如“CAESAR”);更重要的是, reflector 的设计导致加密对称,即$E_K(P)=C$蕴含$E_K(C)=P$,这虽然方便解密,却给攻击者提供了数学上的突破口——如果攻击者能猜测一段明文(crib)及其对应的密文位置,就可以推导出部分转子设置。
波兰密码学家在1932年就首次破译了恩尼格玛,他们利用数学天才马里安·雷耶夫斯基(Marian Rejewski)的洞察:通过分析大量用相同密钥加密的密文,可以建立关于转子 wiring 的方程。雷耶夫斯基还发明了“bomba”(一种机电设备,类似后来的Bombe)来自动测试密钥假设。但1938年德国增加转子数量和反射器类型,使波兰方法失效。图灵在1939年加入布莱切利园后,提出了更通用的“Bombe”设计思路:Bombe不是直接破译,而是利用已知明文片段(crib)来测试密钥假设的一致性。假设攻击者猜测某段密文对应明文“HEILHITLER”,则对于每个可能的 rotor 设置、插线板设置和转子位置,Bombe会检查加密“HEILHITLER”是否恰好产生该密文片段。如果一致,则该设置是候选;否则排除。Bombe通过电路模拟多台恩尼格玛并行工作,快速排除不可能的组合。
图灵的真正突破在于“banburismus”——一种统计方法,用于确定 rotor 的 wiring 和消息密钥。它利用了恩尼格玛加密的固有偏差:尽管多表代换使频率平坦,但由于反射器和转子步进,某些字母对(bigram)的出现概率仍与随机不同。通过计算密文中字母对的“偏差”与期望的匹配程度,可以评估某个 rotor 设置假设的合理性。这本质上是一种最大似然估计,将密码破译转化为统计假设检验问题。此外,图灵还发展了“Turingery”针对更复杂的洛伦兹(Lorenz)密码,展示了他在密码学上的普适思维。
恩尼格玛的破译不仅是二战的转折点,更孕育了现代计算机科学。图灵在布莱切利园的工作直接启发了他的通用计算机设计(ACE)。Bombe机作为第一批可编程电子设备之一,证明了用机器解决逻辑问题的可行性。更重要的是,破译过程本身成为算法思维的典范:将秘密通信还原为数学结构(置换群),利用已知信息(crib)和统计规律,设计搜索策略(深度优先、启发式剪枝),最终在巨大密钥空间中定位答案。这些思想——形式化、算法化、机械化——正是计算机科学的核心。
恩尼格玛的兴衰最终印证了柯克霍夫原则的绝对性:恩尼格玛算法本身(包括转子 wiring)在战前已通过专利公开,德国人相信其安全性完全依赖于密钥(每日密钥表、操作规范)。然而,正是密钥管理的失败——重复使用消息密钥、弱选择习惯、密钥表分发漏洞——导致了系统的彻底崩溃。这证明了一个深刻道理:任何加密系统的强度,最终由最薄弱的环节决定,而这一环节往往是人的因素,而非数学复杂性。古典密码的演进至此完成其历史使命:从古埃及的隐写术到恩尼格玛的机械巅峰,人类不断追求更复杂的混淆与扩散,却一次次在密钥管理上栽跟头。这为现代密码学转向基于数学难题的公钥密码埋下伏笔——在那里,密钥管理本身成为可形式化研究的对象,而非依赖操