把一段话变成只有特定人能看懂的乱码——这件事有一种近乎本能的吸引力。它让人觉得拥有了一个只有自己和通信对象知道的世界。从古罗马将军在战报里把A写成D,到今天每一台手机在消息发出前自动加密——密码学的本质从未变过,变的只是对手的计算能力和算法的复杂度。
| 关键词 | 一句话说明 |
|---|---|
| 对称加密 | 加密和解密使用同一把密钥——凯撒密码、恩尼格玛、AES 皆属此类 |
| 恩尼格玛 | 二战德国便携式转子密码机,10²³ 种密钥组合,因操作失误而非数学缺陷被破 |
| 柯克霍夫原则 | 系统安全应只依赖于密钥保密,不依赖于算法保密(1883) |
| 混淆与扩散 | 香农 1949 年提出的加密设计两大支柱:混淆断开密文与密钥的关联,扩散消除明文的统计特征 |
| 替代-置换网络 | AES 的核心结构——先替换每个字节,再打乱位置,反复多轮直到看不出原始结构 |
| AES-256 | 当前最广泛使用的对称加密标准,256位密钥。物理定律层面不可暴力破解 |
| 已知明文攻击 | 攻击者已知一段明文及其对应密文,据此反推密钥——这是击倒恩尼格玛的武器 |
| S盒 | Substitution box——AES 中执行非线性替换的查找表,混淆的核心引擎 |
凯撒把他的战报字母往后挪三位(A→D,B→E,C→F)。两千多年后,五角大楼加密绝密文件用的 AES-256,数学结构远比凯撒复杂,但底层的逻辑是一样的:加密和解密使用同一把密钥。
这就是对称加密。它有一个与生俱来的困局——在你开始发加密消息之前,双方必须先共享同一把钥匙。怎么把钥匙安全地交给对方?这个问题折磨了密码学两千年,直到1976年才被解开。但那是对称加密之后的故事——本文讲的是在这道题被解开之前,人类如何一步一步把"同一把钥匙"这件事做到极致。
这条路上有两次飞跃:第一次是机械——恩尼格玛把加密从纸笔推进了金属和电路的世界;第二次是数学——AES 用公开的数学结构造出了物理定律也打不开的锁。
恩尼格玛(Enigma)是二战期间德国军队使用的便携式转子密码机。外形像一台打字机装在木箱里,重约12公斤,由电池供电。操作员敲下一个字母,电流穿过一系列转子和导线,另一个字母的指示灯亮起——这就是加密结果。
核心加密结构由三层组成:
第一层 · 插线板(Plugboard)。 位于机器最前面,操作员用跳线把26个字母两两配对交换。例如把A和J接上——按下A键时,电流实际走的路线是J的路径。这层本身提供了初始的字母替换。
第二层 · 三个转子(Rotors)。 这是恩尼格玛的心脏。每个转子是一个有26个触点的圆盘——一面26个输入点,另一面26个输出点,内部有复杂的交叉接线。字母穿过三个转子,等于经历了三次互相独立的字母替换。
最关键的设计在于:每敲一个字母,最右边的转子就转动一格;最右边的转子转完一整圈(26格),中间的转子推进一格;中转子转完一圈,左转子再推进一格。 像一个三盘密码锁,每打一个字母就自动拨动一格。所以同一个字母"AAAAA"被加密后,输出的五个字母全都不一样——这就是转子系统的核心贡献。
第三层 · 反射器(Reflector)。 信号穿过三个转子后到达反射器——它把字母从另一个路径"弹"回来,再次反向穿过三个转子,最后才点亮输出灯的字母灯泡。
反射器的设计有一个看似聪明、实则致命的后果:加密和解密是完全相同的操作。 你设置相同的转子初始位置,把密文逐字输入,得到的恰好是明文。这极大方便了德军——日常操作无需区分加密模式和解密模式——但也极大方便了英国人,因为破解者一旦猜对设置,不需要再做额外工作。
从指标上看,恩尼格玛的密钥空间达到了一个没有计算机的时代似乎牢不可破的规模:
| 组件 | 选择数 |
|---|---|
| 三个转子的排列顺序(5选3) | 5×4×3 = 60种 |
| 三个转子的初始位置 | 26³ = 17,576种 |
| 插线板连线配置(10对交换) | 约150万亿种 |
| 总计 | 约10²³ 种密钥组合 |
德国数学家们确信——在这个量级面前,人类的计算能力微不足道。他们犯了两个错误:第一,高估了算法保密的价值;第二,低估了操作人员的习惯。最终摧毁恩尼格玛的不是数学暴力,而是两段前后相隔七年的智力接力。
1920年代末,波兰密码局截获了大量德国军事通讯,但完全无法破译。他们做了一个后来被证明是至关重要的决定:直接从市场上买了一台商业版恩尼格玛。
德国人把恩尼格玛的商业版出口到各国,波兰人合法地弄到了一台。军用版和商业版的区别不大——外层多了一个插线板,内部转子接线做了更改。有了商业版在手上,波兰数学家就有了反向推测军用版结构的出发点。
波兰数学家马里安·雷耶夫斯基(Marian Rejewski)在1932年做出了第一个实质性的破解。他利用的不是数学上的飞跃,而是一个看似无害的德国操作流程:
每条消息开始时,操作员按照当天密码本的指示设置转子初始位置,然后连续两次随机输入一组三个字母作为"消息密钥"——比如 WFD WFD。密文的前六组字母就是这组消息密钥被加密后的结果。
雷耶夫斯基注意到:如果同一天内截获了大量消息,第一条消息的密文前六字母和第十条消息的密文前六字母,在数学结构上有可被挖掘的统计关系。因为每条消息的前三条密文字母和第四至第六条密文字母,实际上加密的是同一个字母——分别是同一个三字母组的第一遍和第二遍。
用这种统计规律,雷耶夫斯基不需要暴力搜索那个10²³的密钥空间——他只需要用数学重建转子内部的接线。一台机器的接线是固定的,重建出来之后,后续每天的任务就简化为了"找当天的转子初始位置",而这是一个数量级小得多的问题。
他不是靠暴力破解,而是靠一个协议缺陷——操作指南中一个看似无害的、重复发送消息密钥的规定。
1939年德国入侵波兰前夕,波兰人将他们六年的全部研究成果——包括对恩尼格玛内部接线的完整重建——转交给了英国和法国情报机构。这是整个二战密码破译史上最关键的一次信息转移。
在伦敦以北的布莱切利园(Bletchley Park),艾伦·图灵(Alan Turing)设计了一台名为"炸弹机"(Bombe)的电子机械装置。它不尝试穷举所有密钥——那是徒劳的。图灵利用了已知明文攻击(known-plaintext attack)的基本原理:
如果一段密文对应的明文中,有一段文字是攻击者可以猜测出来的,那他就能用这个猜测来大幅削减需要验证的密钥候选数量。
德军每天早上都有一条格式固定的天气预报。图灵知道,"WETTER"(天气)这个词会出现在某个大致可预测的位置。他让 Bombe 在发现某个密钥设置无法让"WETTER"对应到密文中那个位置的字母时,立即放弃整个这条搜索路径。就这样,把搜索空间从10²³缩小到几个小时内可完成的范围。
到1943年,布莱切利园每天破译约8,400条德军情报。丘吉尔后来对乔治六世私下评价:"正是这些解密让我们的将军们看起来像个天才。"诺曼底登陆(1944年6月)之前,英国已完整破译了德军所有主要指挥链的通讯。
恩尼格玛的故事是整个现代密码学最深刻的一堂课。这个系统不是被天才的数学直觉击溃的——击溃它的是一连串细小的、可预防的人为因素:
从恩尼格玛身上提炼出来的那条铁律,荷兰密码学家奥古斯特·柯克霍夫在1883年就已经预见到了:
一个密码系统的安全性,应该只依赖于密钥的保密性,而不依赖于算法的保密性。
换成直白的话:假设敌人会弄到你的机器、看懂你的设计图、偷到你的一份明文-密文配对——你剩下的、唯一还能控制的防线,就是密钥。设计一个好的密码系统,意味着把所有安全筹码押在密钥上,而不是押在敌人"不知道"你的算法上。
这听起来反直觉——把门锁的设计图纸贴在大街上,让大家拿着它挑战,不是更危险吗?答案是正好相反:公开算法让全世界的聪明人帮你找漏洞。找到了,回去改;找不到,这个算法的安全性就有了全世界的背书。这和Akerlof在1970年提出的柠檬市场原理是一样的:封闭制造信息不对称,公开打破信息不对称。一个你不让我看的加密算法,和你声称安全的笔记本电脑锁一样——我怎么知道它里面是不是空的?
恩尼格玛的算法(转子内部接线、反射器结构)最终被英波双方完全掌握——而德国人因为不知道对方已经知道,继续信任它直到战争结束。这就是把安全押在"算法保密"上的最惨烈代价。
战后,密码学的重心从军事领域的绝对保密缓慢转向了民用领域的标准化需求。柯克霍夫原则从一句边缘格言变成了设计哲学的核心——但实现它的工具仍然是机械和简单的电子电路。直到计算机的出现,直到数学家开始直接设计比特层面的加密算法,对称加密才真正开启了它的第二次进化。
恩尼格玛之后,对称加密领域最重大的事件发生在1977年——美国国家标准局(NIST的前身)批准DES(数据加密标准)作为联邦信息处理标准。DES用56位密钥加密64位的文本块。在1970年代,一台几百万美元的机器也拿它没办法。
到1990年代,这个情况已经不一样了。56位的密钥空间在专用硬件面前短短两天就能搜索完毕。1997年,NIST正式发出征集:寻找DES的继任者——高级加密标准(AES)。
这是一次史无前例的开放过程。来自12个国家的15个候选算法全部公开设计文档、全部接受全球密码学家的自由审查。历时三年的公开竞赛,淘汰赛中一个个算法被攻破:有些在数小时内被找到设计缺陷,有些在数月内被侧信道攻击击溃。这种"人在攻击,全世界在看"的方式,本身就是密码学现代精神的体现:安全来自透明,不来自隐藏。
2000年10月,NIST宣布了获胜者:Rijndael(读作"Rhine-dahl"),由两位比利时密码学家琼·达门(Joan Daemen)和文森特·里门(Vincent Rijmen)设计。这个名字后来被正式定名为AES。
选择Rijndael有四个核心原因:软件效率极高,在任何CPU上都跑得快;硬件实现紧凑,可以塞进智能卡和嵌入式设备;安全边际足够大——在15个候选算法中它的设计最保守、把安全余量留得最大;设计优雅,数学结构干净,容易审计。
AES加密的核心操作是这样一个过程:想象你在一个4×4的网格上写了一段16个字节(128位)的消息。然后反复进行四步操作,每一轮都把这16个字节搅得更乱:
第一步 · 字节替换(SubBytes)。 网格中每一个字节按照一个固定的查找表——被称为S盒——替换成另一个字节。这一步产生混淆:即使明文只有1个比特不同,输出会变得面目全非。S盒不是随机的——它是经过高度精密的数学设计的,确保输入和输出之间的统计关系被彻底破坏。
第二步 · 行移位(ShiftRows)。 把网格的四行分别向左移动:第一行不动,第二行移一格,第三行移两格,第四行移三格。一个曾经位于网格左上角的字节,经过这一步后可能被移到了右侧,打乱了原始的位置结构。这是扩散的开端——一个位置的信息开始波及它本不在的位置。
第三步 · 列混淆(MixColumns)。 对每一列的四个字节做一次数学混合运算——不是简单的加法,而是一种把四个字节"揉在一起"的不可逆变换。这一步之后,任何一个原始字节的信息已经污染了整列。扩散的目标在此真正达成。
第四步 · 轮密钥加(AddRoundKey)。 把当前网格和本轮专用的子密钥(从用户的主密钥派生出来的)进行异或运算——二进制层面0和1的简单叠加。
以上四步重复10轮、12轮或14轮(取决于密钥长度是128、192还是256位)。每一轮都在前一轮的基础上继续混淆和扩散——像一个揉面团的洗衣机,搅了10-14遍之后,16个原始字节的信息已经完全、均匀地散布在了128位的密文空间中,找不到任何可以追踪的痕迹。
这就是替代-置换网络(Substitution-Permutation Network)——先替代让字母变形,再打乱让变形后的信息在整个结构中扩散,周而复始,直到你从密文中完全看不出任何原始结构。
"AES-256"中的256指的是密钥长度:256比特(32个字节)。
密钥长度直接决定了暴力破解需要尝试的密钥总数:
| 密钥长度 | 可能的密钥数 | 参考 |
|---|---|---|
| 56位(DES) | 2⁵⁶ ≈ 7.2×10¹⁶ | 1990年代后期可被暴力攻破 |
| 128位(AES-128) | 2¹²⁸ ≈ 3.4×10³⁸ | 当前计算能力无法暴力破解 |
| 256位(AES-256) | 2²⁵⁶ ≈ 1.16×10⁷⁷ | 物理定律层面不可破 |
2²⁵⁶有多大?一个帮助体会的数字:可观测宇宙中的原子总数大约是2²⁶⁵个。2²⁵⁶比这个少一些,但仍是一个天文数字。如果用全宇宙所有原子各自造一台超级计算机、在每一个原子上并行暴力搜索AES-256的密钥——所需的总能量和时间仍然超过宇宙的年龄。
从物理层面(Landauer极限,即计算中擦除1比特信息必须消耗的最小能量)来估算:用地球表面接收到的全部太阳能来驱动这台假想的暴力破解机,完成搜索所需的时间远超太阳系的寿命。
这不是说"很难"——是说在当前已知的物理定律下,不可能。
AES不是某一家公司的产品,不是军方秘密,不是某个天才闭门造车的作品。它有四个层次的信任来源:
你不信任AES的设计者——你信任的是全世界攻击者的集体失败。二十多年,几百篇攻击论文,没有一个突破了这个堡垒。这不是证明它在数学上绝对安全(没有人能证明这一点),这是证明它在实践中不可破。
克劳德·香农(Claude Shannon)在1949年发表的《保密系统的通信理论》中提出了加密设计的两大支柱:
混淆(Confusion): 让密文与密钥之间的关系尽可能复杂。AES的S盒为这个目标而设计——每个字节的替换是非线性的:即使你知道A被换成了X、B被换成了Y,你也无法用一个简单的数学公式从A和B推出C会被换成什么。密钥和输出之间没有可追踪的代数关系。恩尼格玛的转子也服务于混淆,但转子是一种线性替换——A→G、B→H……输入和输出之间存在固定的映射表,一旦物理结构被逆向出来,这张表就暴露了全部秘密。这就是它的致命弱点。
扩散(Diffusion): 让明文的统计特征——字母频率、常见的字词模式——弥散到全部密文空间中。AES通过行移位和列混淆实现这一点:改一个明文字节,经过几轮之后,128位密文中的大约一半的比特都会发生变化。恩尼格玛在这方面是致命的缺陷:它没有任何扩散机制。打一个字,输出只取决于这个字和当前的转子位置——完全独立于前后所有字母。这就是为什么已知明文攻击对恩尼格玛如此有效,而对AES完全无效。
恩尼格玛输在了密钥管理上——在密码本分发过程中被缴获、在操作员的日常习惯中泄漏。AES-256在数学上可以挡住地球上最强大的敌手——但它挡不住你把密钥写在便利贴上贴在显示器边框。
这是一个令人窒息的悖论:从凯撒到AES-256,人类把加密算法推到了物理定律的极限——然后发现整个系统的安全仍然取决于最古老、最不可控的因素:人。
读到这里,你可能会注意到一个悬而未决的问题。恩尼格玛、AES、凯撒密码——它们都在解决同一个问题:有了密钥,怎么加密和解密。但没有一个能解决怎么安全地把密钥交给一个从未谋面的人。
在对称加密的世界里,这个问题的唯一答案是:当面给。政府用武装押运传递密码本,银行用专人在保险箱里交钥匙——这些方法的共同点是昂贵、脆弱、无法规模化。
如果有人能证明"两个从来没有见过面的人,可以在公开信道上建立共享秘密,而全程监听者什么都算不出来",那对称加密的两千年困局就被解开了。
这件事真的发生了。1976年,两个人撼动了整个密码学的地基。
下一篇:非对称革命——公开信道上的秘密、签名与信任。