土法炼钢兴趣小组的算法知识备份

【密码学百科】密码学简史:从凯撒密码到量子时代

目录

密码学(Cryptography)是一门关于”秘密书写”的学问。它的名字源自希腊文 kryptós(隐藏)与 gráphein(书写),其核心追求贯穿三千年未曾改变:如何在敌手窃听的信道上安全地传递信息。然而,实现这一目标的手段却经历了翻天覆地的变化——从古埃及石匠在墓室中刻下变形的象形文字,到今天数学家们用格(lattice)上的最短向量问题抵御量子计算机的攻击,密码学的每一次跃迁都深刻地重塑了军事、外交、商业乃至个人隐私的边界。

本文试图沿着时间的脉络,勾勒密码学从古典到量子时代的完整演进图景。我们将看到:古典密码如何在频率分析面前瓦解;机械化加密如何在二战的烽火中被天才数学家攻破;信息论如何为密码学奠定理论根基;公钥密码学如何解决了困扰人类几千年的密钥分发难题;以及量子计算的幽灵如何迫使密码学再一次自我革命。

一、古典密码:替换与置换的艺术

人类加密通信的历史可追溯至公元前十九世纪的古埃及。在贵族赫努姆霍特普二世(Khnumhotep II)的墓室中,石匠使用了非标准的象形文字来记录铭文——这虽然更接近于隐写术(Steganography)而非密码术,但已体现了对信息进行”变换”以限制读者的朴素思想。

凯撒密码:替换的起点

真正具有密码学意义的最早系统之一,是古罗马时期尤利乌斯·凯撒(Julius Caesar)使用的替换密码(Substitution Cipher),后世称之为凯撒密码(Caesar Cipher)。其原理极为简单:将明文中的每个字母在字母表上向后移动固定位数。凯撒本人据称使用的移位量为三,即 A 变为 D,B 变为 E,以此类推。

用现代数学语言表达,凯撒密码的加密函数为:

\[E(x) = (x + k) \mod 26\]

其中 \(x\) 为明文字母的编号(A=0, B=1, …, Z=25),\(k\) 为密钥(移位量),\(\mod 26\) 表示模 26 运算。解密则为:

\[D(y) = (y - k) \mod 26\]

凯撒密码的密钥空间(Keyspace)极其有限——仅有 25 种可能的非平凡密钥(\(k=1\)\(k=25\))。攻击者只需逐一尝试即可破解,这就是穷举攻击(Brute-force Attack)的最原始形态。

单表替换与频率分析

凯撒密码是单表替换密码(Monoalphabetic Substitution Cipher)的特殊情形。更一般的单表替换允许将 26 个字母映射到任意排列,密钥空间骤增至 \(26! \approx 4 \times 10^{26}\),看似足够安全。然而,九世纪的阿拉伯学者肯迪(Al-Kindi)在其著作《论解读加密信息》(Risalah fi Istikhraj al-Mu’amma)中首次系统性地描述了频率分析法(Frequency Analysis):自然语言中字母出现的频率并不均匀。在英语中,字母 E 的频率约为 12.7%,T 约为 9.1%,而 Z 不足 0.1%。由于单表替换不会改变字母频率分布的形状,攻击者只需统计密文中各符号的频率并与目标语言的已知频率进行比对,便能逐步还原映射关系。

频率分析的发明是密码学史上第一次重大的”攻防转换”——它宣告了所有单表替换密码在理论上的终结。此后数百年间,密码设计者与分析者之间的军备竞赛不断升级。

多表替换:维吉尼亚密码

为了对抗频率分析,十六世纪的意大利密码学家乔万·巴蒂斯塔·贝拉索(Giovan Battista Bellaso)提出了一种使用多个替换表的加密方案,后被错误地归功于布莱斯·德·维吉尼亚(Blaise de Vigenère),因而得名维吉尼亚密码(Vigenère Cipher)。

维吉尼亚密码使用一个关键词作为密钥。加密时,明文的第 \(i\) 个字母与密钥的第 \((i \mod m)\) 个字母相加(模 26),其中 \(m\) 是密钥长度。这意味着同一个明文字母在不同位置会被加密为不同的密文字母,使得简单的频率分析失效。维吉尼亚密码因此被称为”不可破译的密码”(le chiffre indéchiffrable),这一美誉持续了近三百年。

然而,十九世纪中叶,英国数学家查尔斯·巴贝奇(Charles Babbage)与普鲁士军官弗里德里希·卡西斯基(Friedrich Kasiski)各自独立地找到了破解之法。卡西斯基检验法(Kasiski Examination)的核心洞察在于:如果密文中出现重复的字母序列,其间距很可能是密钥长度的倍数。一旦确定密钥长度 \(m\),便可将密文拆分为 \(m\) 组,每组实质上是一个独立的凯撒密码,可分别用频率分析攻破。

置换密码

与替换密码平行发展的另一大分支是置换密码(Transposition Cipher)。置换不改变字母本身,而是改变字母的排列顺序。

最早的置换工具之一是古希腊斯巴达人使用的密码棒——斯库塔莱(Scytale)。发送者将一条羊皮纸带螺旋缠绕在特定直径的木棒上,然后沿棒的长度方向横向书写消息。解开纸带后,字母的顺序被打乱;只有拥有相同直径木棒的接收者才能恢复原文。

更系统化的置换方法是列置换密码(Columnar Transposition):将明文按行写入固定列数的矩阵,然后按照密钥指定的列顺序逐列读出密文。列置换可以多轮叠加使用,增加安全性。

古典密码为何注定失败

从现代视角审视,古典密码的根本弱点在于它们无法消除明文的统计特征。无论是替换还是置换,自然语言固有的冗余度(Redundancy)——字母频率、二连字母(bigram)频率、语法结构——都会像水印一样渗透到密文中。密钥空间的大小只是防线的一部分;如果密码的数学结构允许攻击者利用语言统计规律将有效搜索空间大幅缩小,那么即便 \(26!\) 这样的天文数字也无法提供真正的安全。

这一认识直到二十世纪中叶才被克劳德·香农(Claude Shannon)用信息论的语言精确表述,但古典时代的密码分析实践已经反复验证了这一原理。

二、机械密码时代:Enigma 与密码学的战争化

二十世纪初,电气与机械工程的发展催生了一类全新的加密装置——转子密码机(Rotor Machine)。在众多转子机中,德国的恩尼格玛(Enigma)因其在第二次世界大战中的关键角色而成为密码学史上最具标志性的符号。

Enigma 的机械结构

恩尼格玛机的核心由三个(后期海军型号使用四个)可旋转的转子(Rotor)、一个反射器(Reflector)和一个接线板(Plugboard)组成。操作员按下键盘上的一个字母后,电流依次通过接线板、三个转子、反射器,再反向通过三个转子和接线板,最终点亮灯板上的一个字母——该字母即为密文。

每按一次键,最右侧的快速转子(Fast Rotor)前进一步;当快速转子完成一整圈后,中间转子前进一步,以此类推,类似于机械式里程表。这意味着每按一次键,加密用的替换表就会改变,使得恩尼格玛成为一种极其复杂的多表替换密码。

Enigma 的数学结构

从数学角度看,恩尼格玛的每一次击键所执行的加密可以表示为一连串置换(Permutation)的复合:

\[E = P \cdot R_3 \cdot R_2 \cdot R_1 \cdot U \cdot R_1^{-1} \cdot R_2^{-1} \cdot R_3^{-1} \cdot P^{-1}\]

其中 \(P\) 表示接线板置换,\(R_1, R_2, R_3\) 表示三个转子的置换,\(U\) 表示反射器。反射器的存在使得加密函数成为对合(Involution),即加密与解密使用相同的操作——这是一个工程上的便利,但也是一个密码学上的致命弱点:任何字母都不会被加密为它自身。

接线板将多达 13 对字母互换,理论上可提供约 \(1.5 \times 10^{14}\) 种组合。加上转子选择(从五个中选三个)、转子排列顺序和初始位置,恩尼格玛的总密钥空间约为 \(1.59 \times 10^{20}\)——在当时看来,绝对不可能通过穷举破解。

波兰密码学家的先驱工作

然而,恩尼格玛的密码并非不可攻破。1932年,年仅27岁的波兰数学家马里安·雷耶夫斯基(Marian Rejewski)利用从法国情报机构获取的部分密钥资料,结合群论(Group Theory)中的置换分析方法,成功还原了恩尼格玛转子的内部接线。

雷耶夫斯基的突破性洞察在于:当时恩尼格玛的操作规程要求操作员将每日密钥重复发送两次(连续六个字母构成一个指示器),这在密文中引入了可被利用的数学结构。他发现第一个字母与第四个字母的映射关系构成一个置换,该置换可以分解为若干循环(cycle),循环的长度暴露了转子设置的信息。

在同事耶日·鲁热茨基(Jerzy Różycki)和亨里克·齐加尔斯基(Henryk Zygalski)的协助下,雷耶夫斯基团队开发了一系列破解工具,包括密码炸弹机(Bomba kryptologiczna)——一种利用多台恩尼格玛复制品并行搜索的电气机械装置。波兰的这项成果在1939年德国入侵前夕被紧急移交给英国和法国,为后续的工作奠定了基础。

图灵与布莱切利园

1939年,艾伦·图灵(Alan Turing)在英国布莱切利园(Bletchley Park)领导了对恩尼格玛的进一步攻击。图灵改进了波兰的炸弹机设计,开发出更强大的英国炸弹机(Bombe),利用”已知明文”(Known Plaintext)——例如德军电报中反复出现的程式化用语——来大幅缩小搜索空间。

图灵的方法巧妙地利用了恩尼格玛”任何字母不加密为自身”的性质。当一段猜测的明文与密文对齐时,如果某个位置上明文字母与密文字母相同,该猜测便可立即排除。这种看似微小的信息泄露,经过炸弹机的逻辑推理链条不断放大,最终使得每日密钥的破解成为可能。

在高峰时期,布莱切利园每天破译约三千份德军通信。这一能力——代号”超级机密”(Ultra)——对盟军战略产生了深远影响。在大西洋战役中,Ultra情报帮助盟军舰队规避德国U型潜艇的伏击,是扭转战局的关键因素之一。在太平洋战场,美国对日本海军密码JN-25的破解同样具有决定性作用——中途岛海战(Battle of Midway)的胜利在很大程度上归功于密码分析提供的先手情报。

机械时代的教训

恩尼格玛的故事留下的最深刻教训是:机械的复杂性并不等同于数学的安全性。恩尼格玛的设计者认为,天文数字般的密钥空间足以抵御任何攻击,但他们忽略了操作规程中的弱点、反射器引入的不动点性质,以及攻击者可能拥有部分明文信息这一现实。这一教训指向了现代密码学的核心原则之一——柯克霍夫原则(Kerckhoffs’s Principle):密码系统的安全性不应依赖于算法的保密,而应完全依赖于密钥的保密。

三、Shannon 与现代密码学的诞生

如果说恩尼格玛的破解展示了密码分析的巨大威力,那么克劳德·香农(Claude Shannon)在1949年发表的论文《保密系统的通信理论》(Communication Theory of Secrecy Systems)则为密码学的严格化奠定了数学根基。这篇论文标志着密码学从一门经验性的技艺转变为一门建立在信息论之上的精确科学。

完善保密与一次性密码本

香农提出了”完善保密”(Perfect Secrecy)的概念:一个密码系统具有完善保密性,当且仅当密文不泄露关于明文的任何信息,即对于所有明文 \(m\) 和密文 \(c\)

\[P(M = m \mid C = c) = P(M = m)\]

换言之,无论攻击者截获了什么密文,他对明文的后验概率分布与先验概率分布完全相同。

香农证明了一次性密码本(One-Time Pad, OTP)是满足完善保密的密码系统——也是唯一实用的完善保密系统。一次性密码本的操作极为简单:密钥是一串与明文等长的真随机比特序列,加密就是将明文与密钥逐比特异或(XOR)。然而,香农同时证明了一个令人沮丧的定理:要达到完善保密,密钥长度必须大于或等于消息长度。

\[H(K) \geq H(M)\]

这意味着一次性密码本虽然在理论上完美,在实践中却面临巨大的密钥管理困难——你需要安全地传输与消息等量的密钥材料。这一矛盾指明了实用密码学的必然方向:放弃信息论意义上的绝对安全,转而追求计算意义上的条件安全。

混淆与扩散

香农在同一篇论文中提出了密码设计的两个核心原则——混淆(Confusion)与扩散(Diffusion)。

混淆指的是让密文与密钥之间的关系尽可能复杂,使得攻击者难以从密文推断密钥。在实现上,这通常通过非线性的替换操作(如 S 盒)来实现。

扩散指的是让明文的统计特征尽可能均匀地”扩散”到整个密文中,使得明文中任何一个比特的变化都会影响密文中的大量比特。在实现上,这通常通过线性的置换操作(如比特重排、矩阵乘法)来实现。

混淆消除了密钥与密文之间的简单对应关系,扩散消除了明文与密文之间的统计关联——这两个原则构成了此后所有分组密码(Block Cipher)设计的基石。

从信息论安全到计算安全

香农的工作清晰地划定了两种安全范式之间的界限:信息论安全(Information-Theoretic Security)不对攻击者的计算能力做任何假设,即使拥有无限算力也无法破解;计算安全(Computational Security)则假设攻击者的算力有限,密码的安全性归结为某些数学问题(如大整数分解、离散对数)的计算困难性。

由于信息论安全在实用场景中要求等长密钥,代价过于高昂,现代密码学几乎全面转向了计算安全范式。这一转向的深远影响在于:密码学从此与计算复杂性理论(Computational Complexity Theory)紧密地联结在一起。密码的强度不再取决于机器的齿轮数量或接线方式,而是取决于数学问题的固有困难程度——这正是香农为现代密码学指明的方向。

四、DES:公开密码学的兴起

二十世纪七十年代之前,密码学几乎完全是军事与情报机构的专属领域。民间既缺乏标准化的加密算法,也缺乏公开的密码学研究传统。这一局面在数据加密标准(Data Encryption Standard, DES)的出现后发生了根本性转变。

从 Lucifer 到 DES

1971年,IBM 研究员霍斯特·费斯特尔(Horst Feistel)设计了名为 Lucifer 的分组密码,采用了一种优雅的迭代结构——后被称为费斯特尔网络(Feistel Network)。在费斯特尔网络中,每一轮将数据块分为左右两半,右半部分经过轮函数 \(F\) 处理后与左半部分异或,再将左右互换。这种结构的精妙之处在于:即使轮函数 \(F\) 不是可逆的,整个加密过程也天然可逆——解密只需将子密钥的使用顺序反转。

1973年,美国国家标准局(NBS,即后来的NIST)公开征集用于保护非机密政府数据的加密标准,IBM 提交了 Lucifer 的改进版本。在国家安全局(NSA)的参与下,算法经历了两项关键修改:密钥长度从 128 比特削减至 56 比特,S 盒的设计被替换。1977 年,DES 正式成为联邦信息处理标准(FIPS 46)。

公开辩论与 S 盒争议

DES 的发布在学术界引发了激烈的争论。斯坦福大学的马丁·赫尔曼(Martin Hellman)和惠特菲尔德·迪菲(Whitfield Diffie)公开质疑 56 比特密钥长度的安全性,认为它对于资源丰富的攻击者(如国家级对手)而言过于短小。此外,NSA 对 S 盒设计细节的保密引发了”后门”猜疑。

历史最终证明了两个事实:首先,56 比特密钥确实不够安全——1998年,电子前沿基金会(EFF)建造了一台名为”深度破解”(Deep Crack)的专用硬件,在不到三天内成功穷举了 DES 密钥空间。其次,NSA 对 S 盒的修改实际上增强了 DES 抵抗差分密码分析(Differential Cryptanalysis)的能力——这一攻击方法直到 1990 年才由以色列密码学家伊利·比哈姆(Eli Biham)和阿迪·沙米尔(Adi Shamir)公开发表,NSA 显然早已知晓。

差分与线性密码分析

差分密码分析(Biham-Shamir, 1990)通过分析特定明文差分(即两个明文的异或值)在加密过程中的传播特性来恢复密钥信息。线性密码分析(Linear Cryptanalysis)则由日本密码学家松井充(Mitsuru Matsui)于 1993 年提出,它寻找明文比特、密文比特和密钥比特之间的线性近似关系。这两种方法是对称密码分析的两大支柱,此后所有分组密码的设计都必须明确证明自身能够抵抗这两类攻击。

从三重 DES 到 AES

面对 DES 密钥长度不足的问题,业界首先采用了三重 DES(Triple-DES, 3DES)作为过渡方案,即使用两个或三个独立密钥对数据进行三次 DES 加密(加密-解密-加密)。三重 DES 将有效密钥长度提升至 112 或 168 比特,但计算效率仅为 DES 的三分之一,且 64 比特的分组长度在高吞吐场景下存在安全隐患。

1997年,NIST 正式发起高级加密标准(Advanced Encryption Standard, AES)征集,全球密码学界提交了十五个候选算法。经过三年的公开评估——安全性分析、软硬件性能测试、知识产权审查——比利时密码学家琼·达蒙(Joan Daemen)和文森特·瑞杰曼(Vincent Rijmen)设计的 Rijndael 算法于 2001 年胜出,成为 AES 标准(FIPS 197)。AES 支持 128、192、256 比特三种密钥长度,分组长度固定为 128 比特,其设计基于替换-置换网络(Substitution-Permutation Network, SPN),而非费斯特尔结构。

AES 竞赛的意义远超算法本身:它确立了密码算法应通过公开竞赛、同行评审和透明选拔来产生的范式,这一传统延续至今。

五、公钥密码学革命

无论古典密码还是 DES,所有上述系统都属于对称密码(Symmetric Cryptography)——加密与解密使用相同的密钥。这意味着通信双方在交换任何秘密消息之前,必须首先通过某种安全渠道共享密钥。这就是密钥分发问题(Key Distribution Problem):如果你已经有了安全信道来传输密钥,为什么还需要加密?

新方向:Diffie-Hellman 密钥交换

1976 年,惠特菲尔德·迪菲(Whitfield Diffie)和马丁·赫尔曼(Martin Hellman)发表了具有划时代意义的论文《密码学的新方向》(New Directions in Cryptography),提出了公钥密码学(Public-Key Cryptography)的概念,并给出了第一个实际可行的密钥交换协议——Diffie-Hellman 密钥交换(Diffie-Hellman Key Exchange)。

Diffie-Hellman 协议的核心是离散对数问题(Discrete Logarithm Problem, DLP)的计算困难性。协议在一个大素数 \(p\) 和生成元 \(g\) 构成的乘法群上运行:Alice 随机选取私钥 \(a\),计算 \(A = g^a \mod p\) 并公开;Bob 随机选取私钥 \(b\),计算 \(B = g^b \mod p\) 并公开。双方分别计算 \(K = B^a \mod p = A^b \mod p = g^{ab} \mod p\),得到相同的共享密钥 \(K\)。窃听者虽然知道 \(g, p, A, B\),但在不知道 \(a\)\(b\) 的情况下计算 \(g^{ab} \mod p\) 是计算上不可行的(在目前已知的经典算法下)。

这一协议的深远意义在于:它首次证明了两个素未谋面的陌生人可以在完全公开的信道上协商出一个共享密钥,而窃听者一无所获。这在概念上是一次哥白尼式的革命。

RSA:公钥加密与数字签名

1978 年,麻省理工学院的罗纳德·里维斯特(Ronald Rivest)、阿迪·沙米尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)提出了第一个完整的公钥加密方案——RSA 算法。RSA 的安全性基于大整数分解问题(Integer Factorization Problem)的困难性:将两个大素数 \(p\)\(q\) 相乘得到 \(n = pq\) 很容易,但已知 \(n\) 求回 \(p\)\(q\)\(n\) 足够大时是计算上不可行的。

RSA 不仅可以用于加密,还可以用于数字签名(Digital Signature):签名者使用私钥对消息的哈希值进行”解密”运算,任何人都可以用对应的公钥”加密”来验证签名的有效性。数字签名提供了手写签名在物理世界中的三大保证——认证(Authentication)、完整性(Integrity)和不可否认性(Non-repudiation)——但在数学上更加严格。

独立发现:GCHQ 的秘密先驱

历史常有令人惊叹的巧合。事实上,英国政府通信总部(GCHQ)的詹姆斯·埃利斯(James Ellis)早在 1970 年就提出了公钥密码的基本概念,克利福德·考克斯(Clifford Cocks)在 1973 年独立发明了等价于 RSA 的算法,马尔科姆·威廉姆森(Malcolm Williamson)在 1974 年独立发明了等价于 Diffie-Hellman 的密钥交换协议。然而,由于保密原因,这些成果直到 1997 年才被解密公开。这段历史提醒我们:在封闭的环境中,即便是最伟大的发明也可能被埋没。

ElGamal 与椭圆曲线

1985 年,埃及裔美国密码学家塔希尔·埃尔加马尔(Taher ElGamal)提出了基于离散对数问题的 ElGamal 加密和签名方案。同年,尼尔·科布利茨(Neal Koblitz)和维克托·米勒(Victor Miller)各自独立地提出了椭圆曲线密码学(Elliptic Curve Cryptography, ECC)的概念,将离散对数问题推广到椭圆曲线群上。

ECC 的重大优势在于:在相同安全强度下,椭圆曲线上的密钥长度远短于 RSA 和传统离散对数系统。例如,256 比特的 ECC 密钥提供的安全性大致相当于 3072 比特的 RSA 密钥。这使得 ECC 特别适用于资源受限的环境,如智能卡、物联网设备和移动终端。

公钥密码学的诞生彻底改变了密码学的应用格局。数字签名使得电子商务成为可能——从网上银行到数字证书,从代码签名到区块链,公钥基础设施(Public Key Infrastructure, PKI)已成为数字世界的信任锚。

六、密码学战争与自由密码学

公钥密码学的公开发表不仅改变了密码学的技术面貌,也引发了一场关于密码学知识和工具应由谁拥有、谁使用的深刻政治与法律斗争——这就是”密码战争”(Crypto Wars)。

密码即军火

冷战时期,美国政府将强密码技术视为军事物资。根据《国际武器贸易条例》(International Traffic in Arms Regulations, ITAR),加密软件与导弹、战斗机属于同一管控类别——出口受到严格限制。任何密钥长度超过 40 比特的加密产品在未获许可的情况下不得出口,这意味着美国公司在海外销售的软件只能包含极其脆弱的加密保护。

PGP 与菲尔·齐默尔曼

1991 年,美国程序员菲尔·齐默尔曼(Phil Zimmermann)发布了”相当好的隐私”(Pretty Good Privacy, PGP)——一款免费的电子邮件加密软件,将 RSA 加密与对称加密相结合,让普通用户也能进行端到端加密通信。PGP 迅速在互联网上传播,也传到了美国境外。美国政府随即对齐默尔曼展开了长达三年的刑事调查,指控其违反武器出口法规。齐默尔曼的著名辩护是:“我只是把它放到了互联网上。”

调查最终在 1996 年无罪撤案,但这一事件使”密码自由”成为一项重要的公民权利议题。

剪刀芯片与密钥托管

1993 年,克林顿政府推出了”剪刀芯片”(Clipper Chip)计划——一种由 NSA 设计的加密芯片,内置密钥托管(Key Escrow)机制:加密密钥的一份副本由政府指定的托管机构保管,执法部门在获得法庭授权后可以解密通信。

该计划遭到了密码学界、科技产业和公民自由组织的强烈反对。马特·布雷兹(Matt Blaze)在 1994 年发表的论文中展示了剪刀芯片协议中的严重安全缺陷,进一步削弱了政府的立场。剪刀芯片计划最终被废弃,但密钥托管的辩论在此后的每一次恐怖袭击或重大犯罪案件后都会重新浮出水面。

代码即言论

1995 年,数学家丹尼尔·伯恩斯坦(Daniel Bernstein)对美国司法部提起诉讼,挑战将加密源代码列为受管控出口物品的合宪性。1999年,第九巡回上诉法院在 Bernstein v. United States 案中裁定:源代码是一种受第一修正案保护的言论形式。这一裁决对加密出口管制的法律基础产生了深远影响。

进入 2000 年代,在产业界和学术界的持续推动下,美国逐步放宽了加密出口管制。这一转变为开源密码学工具的全球传播扫除了法律障碍,OpenSSL、GnuPG、NaCl/libsodium 等项目得以自由发展和分发,成为当今互联网安全基础设施的基石。

七、互联网时代:密码学的全面部署

如果说二十世纪九十年代之前,密码学主要服务于军方和外交界,那么万维网的崛起则将密码学推向了每一个联网设备、每一笔电子交易和每一条即时消息。

SSL/TLS 的演进

1995 年,网景公司(Netscape)发布了安全套接层协议(Secure Sockets Layer, SSL)2.0版,为网页浏览器与服务器之间的通信提供加密保护。SSL 经历了多次迭代——SSL 3.0(1996)、TLS 1.0(1999)、TLS 1.1(2006)、TLS 1.2(2008)——每一次升级都修补了前一版本的安全缺陷并引入了更强的密码套件。

2018 年发布的 TLS 1.3 代表了一次重大革新:它删除了所有已知不安全的密码套件(包括 RSA 密钥交换、CBC 模式、SHA-1),默认采用前向保密(Forward Secrecy),并将握手延迟从两次往返缩减至一次(在恢复会话时甚至可以零往返)。TLS 1.3 的设计过程本身也是密码学工程化的典范——其规范经过了形式化验证(Formal Verification),多个研究团队使用定理证明器机器验证了协议的安全属性。

PKI 与证书颁发机构

TLS 的安全依赖于公钥基础设施(PKI):网站通过证书颁发机构(Certificate Authority, CA)获取数字证书,浏览器通过信任预装的根证书来验证网站身份。然而,CA 模型存在固有的脆弱性——2011 年 DigiNotar 被入侵事件表明,一个 CA 的沦陷可以危及整个信任链。此后,证书透明度(Certificate Transparency, CT)日志的引入在一定程度上缓解了这一问题,使得证书的错误签发可以被公开审计和发现。

斯诺登事件的冲击

2013 年,美国国家安全局前承包商雇员爱德华·斯诺登(Edward Snowden)泄露的大量机密文件揭示了全球范围的大规模监控计划——包括 PRISM(棱镜)计划对主要互联网公司用户数据的收集,以及 NSA 对互联网骨干网络流量的大规模截获。

斯诺登事件对密码学的部署产生了深远而直接的影响。科技公司加速了加密的全面部署:谷歌将 HTTPS 作为搜索排名因素;苹果在 iOS 8 中引入了全盘加密,声称连苹果自身也无法解锁;WhatsApp 在 2016 年为其十亿用户启用了端到端加密。

Let’s Encrypt 与全民 HTTPS

2015 年底启动的 Let’s Encrypt 项目,通过提供免费的、自动化的 TLS 证书,彻底消除了部署 HTTPS 的经济和技术门槛。截至 2020 年代中期,全球超过 90% 的网页流量已通过 HTTPS 传输——这一数字在 2013 年前还不到 30%。

Signal 协议与端到端加密

Signal 协议(由莫克西·马林斯派克(Moxie Marlinspike)设计)代表了端到端加密(End-to-End Encryption, E2EE)领域的最高水平。它结合了双棘轮算法(Double Ratchet Algorithm)、X3DH 密钥协商和前向保密等技术,确保即使长期密钥被泄露,过去的会话记录也无法被解密。Signal 协议被 WhatsApp、Facebook Messenger(可选模式)、Google Messages 等主流通信平台采用,成为事实上的端到端加密标准。

密码哈希的进化

密码存储的历史也是一段从无知到审慎的进化史。早期系统以明文存储密码——一旦数据库被攻破,所有用户的密码立即暴露。此后依次经历了 MD5 哈希(易受彩虹表攻击)、加盐哈希(Salt)、bcrypt(引入可调的计算成本)和 scrypt(增加内存成本以抵抗 GPU/ASIC 攻击)。当前的最佳实践是 Argon2——2015 年密码哈希竞赛(Password Hashing Competition)的获胜者——它同时引入了时间成本、内存成本和并行度三个可调参数,提供了对各类硬件攻击的全面抵御能力。

八、后量子时代的开端

正当密码学似乎已经达到了一个稳定的成熟期,一种全新的威胁悄然浮现——量子计算(Quantum Computing)。

Shor 算法:摧毁公钥密码的利刃

1994 年,AT&T 贝尔实验室的数学家彼得·肖尔(Peter Shor)提出了一种量子算法,能够在多项式时间内分解大整数并求解离散对数问题。这意味着一旦规模足够的通用量子计算机被建造出来,RSA、Diffie-Hellman 和椭圆曲线密码学将同时崩塌——这三者正是当今公钥密码基础设施的全部支柱。

具体而言,Shor 算法将大整数分解的计算复杂度从经典计算机上的亚指数级(最优的一般数域筛法为 \(\exp(O(n^{1/3} (\log n)^{2/3}))\),其中 \(n\) 为比特数)降低到量子计算机上的多项式级(\(O(n^3)\)),这是一个毁灭性的加速。

Grover 算法:对称密码的降级

1996 年,洛夫·格罗弗(Lov Grover)提出了一种量子搜索算法,能够在 \(O(\sqrt{N})\) 次操作中搜索大小为 \(N\) 的无序数据库——这相当于将对称密码的有效密钥长度减半。例如,AES-128 在量子攻击者面前仅提供 64 比特的安全性,这是不够的;但 AES-256 仍然提供 128 比特的安全性,足以抵御可预见的量子攻击。因此,对称密码只需简单地将密钥长度加倍即可应对量子威胁——这与公钥密码面临的生存危机形成了鲜明对比。

NIST 后量子密码标准化

2016 年,美国国家标准与技术研究院(NIST)正式发起了后量子密码学(Post-Quantum Cryptography, PQC)标准化进程,征集能够抵御量子计算攻击的公钥加密和数字签名算法。

这一进程历经多轮评估。2022 年,NIST 宣布了首批入选标准的算法:用于密钥封装(Key Encapsulation Mechanism, KEM)的 CRYSTALS-Kyber(后更名为 ML-KEM),以及用于数字签名的 CRYSTALS-Dilithium(ML-DSA)、FALCON 和 SPHINCS+(SLH-DSA)。2024 年,最终标准(FIPS 203、FIPS 204、FIPS 205)正式发布。

这些算法基于不同的数学难题家族:

“先收集,后解密”

量子威胁的紧迫性不在于今天——当前最大的量子计算机远不足以运行 Shor 算法破解实际使用的密钥长度。紧迫性在于一种被称为”先收集,后解密”(Harvest Now, Decrypt Later)的攻击策略:国家级攻击者可以在今天大规模截获和存储加密通信流量,等待未来量子计算机成熟后再行解密。对于需要长期保密的数据——外交通信、医疗记录、商业机密——这一威胁已经是现实的。

混合模式部署

鉴于后量子算法尚未经受长时间的密码分析检验(相比 RSA 和 ECC 的数十年历史),当前业界采取的审慎策略是混合模式(Hybrid Mode)部署:在同一连接中同时使用经典算法和后量子算法,只有当两者都被攻破时安全性才会丧失。例如,谷歌 Chrome 浏览器从 2023 年开始在 TLS 握手中试验性地部署了 X25519Kyber768 混合密钥交换,将经典的 X25519 椭圆曲线 Diffie-Hellman 与后量子的 ML-KEM-768 相结合。

前路漫漫

后量子迁移是一项规模空前的工程。全球数十亿台设备、数百万个应用程序和无数协议中嵌入的公钥密码算法都需要被替换或升级。这一过程可能耗时十年甚至更长——而量子计算的发展时间表充满不确定性。正因如此,密码学界的共识是:迁移必须从现在开始。

九、结语:密码学的永恒进化

回顾三千年的密码学史,一条主线清晰可见:密码学的发展是一场永不停歇的攻防博弈。凯撒密码被频率分析攻破,维吉尼亚密码被卡西斯基检验拆解,恩尼格玛在图灵面前屈服,DES 在穷举攻击中倒下——每一代密码的陨落都催生了更强大的下一代。

香农用信息论为密码学奠定了科学基础;Diffie、Hellman 和 RSA 的发明者们用公钥密码学解决了密钥分发这一千年难题;AES 竞赛确立了公开透明的标准化范式;而后量子密码学则预示着又一次范式转移。

密码学不仅仅是一门技术——它是自由的基础设施。在数字时代,加密保护着每个人的隐私、财产和言论自由。从齐默尔曼发布 PGP 时面对的司法追诉,到斯诺登揭露大规模监控后的全球加密浪潮,密码学的历史也是一部关于谁有权保守秘密的政治史。

量子时代的到来并非终点,而是新一轮演进的起点。只要信息需要在不安全的信道上传输,密码学就将继续进化——这是它过去三千年的历史所给出的承诺,也是它对未来的许诺。

密码学发展时间线总图

下表以时间线形式汇总了本文涉及的主要里程碑,同时纳入中国密码学发展的关键节点,以呈现更完整的全球视角。

年代 里程碑 意义
约公元前 50 年 凯撒密码(Caesar Cipher) 最早的系统性替换密码
9 世纪 肯迪(Al-Kindi)频率分析 密码分析学的诞生
16 世纪 维吉尼亚密码(Vigenere Cipher) 多表替换,抵抗简单频率分析
1918 Enigma 机问世 机械化加密时代开启
1936-1945 图灵与 Bombe、Colossus 密码分析催生计算机雏形
1949 Shannon 发表「Communication Theory of Secrecy Systems」 密码学获得信息论基础
1976 Diffie-Hellman 密钥交换 公钥密码学诞生
1977 RSA 算法发表;DES 成为联邦标准 公钥加密与标准化对称密码并行发展
1985 椭圆曲线密码学(ECC)由 Koblitz、Miller 独立提出 更短密钥实现同等安全性
1999 中国颁布《商用密码管理条例》 中国密码管理法制化起点
2001 AES(Rijndael)成为 FIPS 197 标准 公开竞赛范式确立,SPN 取代 Feistel 成为主流
2010-2012 中国发布 SM2(椭圆曲线公钥)、SM3(哈希)、SM4(分组密码)国家标准 中国建立独立于 NIST 体系的商用密码算法族
2017 NIST 启动后量子密码(PQC)标准化第一轮 为抵御量子计算威胁做准备
2020 中国《密码法》正式施行 将密码工作纳入法治轨道,区分核心密码、普通密码与商用密码
2024 NIST 发布 FIPS 203/204/205(ML-KEM、ML-DSA、SLH-DSA) 后量子密码标准正式落地

从工程实践来看,中国 SM 系列算法的发展路径与西方以 NIST 为中心的标准化模式形成了一个值得深思的对照。NIST 走的是「全球公开征集、社区同行评审」的路线——AES 竞赛和 PQC 标准化都向全球密码学家敞开大门;而中国的 SM2/SM3/SM4 则更多依赖国内密码学界的研究成果,由国家密码管理局主导发布。两条路径各有其逻辑:NIST 模式最大化了公开审查的广度,中国模式则优先保障了密码基础设施的自主可控。笔者认为,随着中国密码标准逐渐被 ISO/IEC 国际标准采纳(如 SM2 和 SM9 已进入 ISO/IEC 14888-3),两条路径正在走向交汇——自主研发与国际公开审查并非互斥,而是可以相互增强的。

附录:Python 代码示例

以下三段 Python 代码分别演示了凯撒密码的加解密、维吉尼亚密码的加解密,以及利用频率分析对凯撒密码进行自动破解。

凯撒密码

def caesar_encrypt(plaintext: str, key: int) -> str:
    """凯撒密码加密:将每个英文字母在字母表上右移 key 位。"""
    result = []
    for ch in plaintext:
        if ch.isalpha():
            base = ord('A') if ch.isupper() else ord('a')
            result.append(chr((ord(ch) - base + key) % 26 + base))
        else:
            result.append(ch)
    return ''.join(result)


def caesar_decrypt(ciphertext: str, key: int) -> str:
    """凯撒密码解密:加密的逆操作,等价于右移 26-key 位。"""
    return caesar_encrypt(ciphertext, 26 - key)


# 示例
plaintext = "The quick brown fox jumps over the lazy dog"
key = 3
ciphertext = caesar_encrypt(plaintext, key)
recovered = caesar_decrypt(ciphertext, key)

print(f"明文:   {plaintext}")
print(f"密钥:   {key}")
print(f"密文:   {ciphertext}")
print(f"解密:   {recovered}")
# 明文:   The quick brown fox jumps over the lazy dog
# 密钥:   3
# 密文:   Wkh txlfn eurzq ira mxpsv ryhu wkh odcb grj
# 解密:   The quick brown fox jumps over the lazy dog

维吉尼亚密码

def vigenere_encrypt(plaintext: str, keyword: str) -> str:
    """维吉尼亚密码加密:使用关键词循环移位。"""
    keyword = keyword.upper()
    result = []
    ki = 0  # 关键词索引,仅在处理字母时递增
    for ch in plaintext:
        if ch.isalpha():
            shift = ord(keyword[ki % len(keyword)]) - ord('A')
            base = ord('A') if ch.isupper() else ord('a')
            result.append(chr((ord(ch) - base + shift) % 26 + base))
            ki += 1
        else:
            result.append(ch)
    return ''.join(result)


def vigenere_decrypt(ciphertext: str, keyword: str) -> str:
    """维吉尼亚密码解密:将关键词的每个字母取补后加密。"""
    inv_keyword = ''.join(
        chr((26 - (ord(c) - ord('A'))) % 26 + ord('A'))
        for c in keyword.upper()
    )
    return vigenere_encrypt(ciphertext, inv_keyword)


# 示例
plaintext = "Cryptography is the practice of secure communication"
keyword = "LEMON"
ciphertext = vigenere_encrypt(plaintext, keyword)
recovered = vigenere_decrypt(ciphertext, keyword)

print(f"明文:     {plaintext}")
print(f"关键词:   {keyword}")
print(f"密文:     {ciphertext}")
print(f"解密:     {recovered}")
# 明文:     Cryptography is the practice of secure communication
# 关键词:   LEMON
# 密文:     Npcdhzcvndal wg exq benotwnq as gsogvq oazzibwomfwzb
# 解密:     Cryptography is the practice of secure communication

频率分析攻击凯撒密码

import string
from collections import Counter

# 英语字母频率表(百分比),按 A-Z 排列
ENGLISH_FREQ = [
    8.167, 1.492, 2.782, 4.253, 12.702, 2.228, 2.015,  # A-G
    6.094, 6.966, 0.153, 0.772, 4.025, 2.406,           # H-N
    6.749, 7.507, 1.929, 0.095, 5.987, 6.327, 9.056,    # O-U
    2.758, 0.978, 2.360, 0.150, 1.974, 0.074,            # V-Z
]


def chi_squared(observed: list[float], expected: list[float]) -> float:
    """计算卡方统计量,衡量两个频率分布的差异。"""
    return sum(
        (o - e) ** 2 / e
        for o, e in zip(observed, expected)
        if e > 0
    )


def crack_caesar(ciphertext: str) -> tuple[int, str]:
    """
    利用频率分析自动破解凯撒密码。
    对 25 种可能的密钥分别解密,计算与英语标准频率的
    卡方距离,选取距离最小的密钥作为最可能的答案。
    """
    ciphertext_upper = ciphertext.upper()
    n = sum(1 for c in ciphertext_upper if c in string.ascii_uppercase)
    if n == 0:
        return 0, ciphertext

    best_key = 0
    best_score = float('inf')

    for key in range(26):
        # 尝试以 key 为密钥解密
        shifted = ''.join(
            chr((ord(c) - ord('A') - key) % 26 + ord('A'))
            if c in string.ascii_uppercase else c
            for c in ciphertext_upper
        )
        # 统计解密后各字母的频率(百分比)
        counts = Counter(c for c in shifted if c in string.ascii_uppercase)
        freq = [counts.get(chr(i + ord('A')), 0) / n * 100 for i in range(26)]

        score = chi_squared(freq, ENGLISH_FREQ)
        if score < best_score:
            best_score = score
            best_key = key

    return best_key, caesar_decrypt(ciphertext, best_key)


# 示例:加密一段明文后用频率分析自动破解
original = (
    "In the history of cryptography the development of ciphers "
    "has been a constant arms race between cipher makers and "
    "cipher breakers. The invention of frequency analysis by "
    "Al-Kindi in the ninth century marked the first major "
    "breakthrough in cryptanalysis."
)
secret_key = 17
encrypted = caesar_encrypt(original, secret_key)

cracked_key, cracked_text = crack_caesar(encrypted)

print(f"密文:         {encrypted[:60]}...")
print(f"破解密钥:     {cracked_key}")
print(f"破解结果:     {cracked_text[:60]}...")
print(f"破解正确:     {cracked_text == original}")
# 破解密钥:     17
# 破解正确:     True

密码学百科系列 · 第 01 篇

系列目录 | 下一篇:威胁模型与安全目标


By .