你每天都在用它,但你可能从来没注意到。
当你打开银行 App 输入密码的时候,当你用微信给朋友发消息的时候,当你连上公司的 VPN 处理工作的时候——有一道无形的墙,一直在悄悄保护着你的数据。这道墙就是 AES,全称 Advanced Encryption Standard,高级加密标准。
今天我想用尽可能通俗的方式,把这个算法拆开来给你看看。
一切要从一场”选秀”说起
故事的起点在 1997 年的美国。当时美国政府用的加密标准叫 DES(Data Encryption Standard),已经服役了整整二十年。二十年前的算法放到九十年代末,密钥才 56 位,在不断进步的计算能力面前已经显得力不从心了。1999 年,研究人员用分布式计算系统成功破解了 DES 的 56 位密钥,这基本上就是在宣告:老将该退役了。
于是,美国国家标准与技术研究院(NIST)决定搞一场全球公开征集。他们向全世界的密码学家发出了邀请:来吧,给我们设计一个新的加密算法,谁最好谁上。
这场”选秀”的规模不小。来自世界各国的密码学家们一共提交了 15 个候选算法,名字五花八门:MARS、RC6、Serpent、Twofish……经过两轮严格的评审和公开讨论,NIST 在 1999 年把范围缩小到了 5 个决赛选手。
2000 年 10 月 2 日,最终的赢家揭晓了——来自比利时的 Rijndael 算法。它的设计者是两位比利时密码学家:Joan Daemen 和 Vincent Rijmen。算法的名字”Rijndael”其实就是取自两人姓氏的组合(发音大致像”Rain-doll”)。
NIST 选中 Rijndael 的理由很直接:在安全性、性能、效率、可实现性和灵活性这几个维度上,它的综合表现最好。值得一提的是,Twofish 算法的设计者 Bruce Schneier 在落选后公开表示:”我对 NIST 和整个 AES 选拔流程只有好评。”——在密码学这种竞争激烈的领域,这样的风度并不多见。
2001 年 11 月 26 日,Rijndael 被正式发布为 FIPS PUB 197,从此拥有了一个更广为人知的名字:AES。它也是历史上第一个被美国国家安全局(NSA)批准用来保护最高机密信息的公开加密算法。
AES 的核心思路:把数据搅碎
好了,历史聊完了,来看看它到底在干什么。
AES 的本质是一个对称加密算法。”对称”的意思是,加密和解密用的是同一把钥匙。你用一把钥匙把门锁上,还得用同一把钥匙才能打开——就这么简单。这跟 RSA 那种非对称加密(公钥加密、私钥解密)是完全不同的思路。

同时,AES 也是一个分组密码。它不是一口气把你的整段数据加密掉,而是先把数据切成固定大小的小块——每块 128 位(也就是 16 个字节),然后逐块加密。如果你的数据不够 128 位,它会先做填充(padding),凑齐了再加密。
AES 支持三种密钥长度:128 位、192 位和 256 位。密钥越长,加密的轮数越多,安全性也越高。具体来说,AES-128 做 10 轮加密,AES-192 做 12 轮,AES-256 做 14 轮。
所谓的”轮”是什么意思呢?你可以想象一个洗牌的过程。洗一次可能还看得出花色的分布,洗十次之后就完全看不出原来的顺序了。AES 的每一轮加密,就是在对数据做一次彻底的”洗牌”。
四步洗牌法:AES 的加密过程

AES 会先把 16 个字节的数据排成一个 4×4 的矩阵(四行四列),然后在每一轮中对这个矩阵执行四个操作。我们来一个一个看。
第一步:字节替换(SubBytes)
这一步做的事情非常直觉——查表替换。AES 有一张预先计算好的置换表,叫做 S-Box。矩阵中的每一个字节,都会在这张表里找到自己对应的”替身”,然后被替换掉。这一步引入了非线性,让输入和输出之间的关系变得极其复杂,防止攻击者通过数学推导反推出原始数据。
有个小细节很有意思:S-Box 的设计保证了没有任何字节会被替换成它自己,也不会被替换成它的按位取反。
第二步:行移位(ShiftRows)
这一步更好理解。把 4×4 矩阵的四行分别做不同程度的循环左移。第一行不动,第二行左移 1 个字节,第三行左移 2 个字节,第四行左移 3 个字节。
这个操作的目的是打乱每一列的字节来源。原本在同一列的四个字节,经过行移位之后分散到了不同的列。这叫做扩散——让明文中一个字节的变化能够尽可能地影响到密文的更多位置。
第三步:列混合(MixColumns)
如果说行移位是在水平方向上打乱数据,列混合就是在垂直方向上搅拌。它把每一列的四个字节当作一个整体,通过一系列有限域上的数学运算(说白了就是特定的乘法和加法),生成四个全新的字节来替代这一列。
这一步让每一列中每个字节的值都依赖于该列原来的全部四个字节。扩散效果进一步增强。值得注意的是,在最后一轮加密中,这一步会被跳过。
第四步:轮密钥加(AddRoundKey)
最后一步也最简单:把当前的数据矩阵和该轮对应的轮密钥做一次逐位异或(XOR)运算。
这里有个细节需要解释。你最初只提供了一把密钥(128/192/256 位),但 AES 需要每一轮都有一把不同的轮密钥。怎么办?AES 有一个叫**密钥扩展(Key Expansion)**的机制,能从你的初始密钥中推导出所有轮所需的子密钥。这些子密钥看起来跟原始密钥完全不同,但它们之间有严格的数学关系。
这四步合在一起,重复执行 10/12/14 轮之后,你的 128 位明文就变成了一坨完全不可辨认的密文。
至于解密?反过来做就行了。把四个操作各自取逆,以相反的顺序执行,用相同的密钥,就能把密文还原成明文。
工作模式:不只是一块一块地加密
讲到这里,你可能会想:既然 AES 每次只加密 128 位,那一段很长的数据怎么办?
这就涉及到 AES 的**工作模式(Mode of Operation)**了。模式的选择直接影响到加密的安全性和适用场景,这里介绍几种常见的。
最天真的做法叫 ECB(电子密码本模式):把数据切成一块一块,每块独立加密。听起来很合理,但有个严重的问题——如果两块明文一模一样,它们的密文也会一模一样。这意味着攻击者可以通过分析密文中的重复模式来推断明文的结构。网上有一张经典的”ECB 企鹅”图,把一张企鹅 BMP 图片用 ECB 模式加密后,你依然能在密文图里看到企鹅的轮廓。所以,ECB 在实际应用中很少被使用。
更常用的是 CBC(密码分组链接模式)。它在加密每一块之前,先把明文和上一块的密文做一次异或。这样一来,即使两块明文完全相同,由于前一块的密文不同,产生的密文也会不同。第一块没有”上一块密文”怎么办?用一个随机生成的**初始化向量(IV)**来代替。
还有一种在现代系统中特别流行的模式叫 GCM(伽罗瓦/计数器模式)。它不仅提供加密,还同时提供数据完整性校验——也就是说,它不光能防偷看,还能防篡改。TLS 1.3 协议中大量使用的就是 AES-GCM。
为什么 AES 这么难破?
从 2001 年发布到现在,AES 已经经历了二十多年密码学家的反复审视和攻击尝试。到目前为止,没有人找到任何实用的攻击方法能在合理时间内破解它。
先来算一笔暴力破解的账。AES-128 的密钥空间是 2 的 128 次方,这个数字大约是 3.4×10³⁸。如果你用全世界最强大的超级计算机来穷举每一个可能的密钥,所需的时间比宇宙的年龄还要长——长得多。
换一种更直觉的表达:就算你把比特币全网的算力(大约 2⁶⁷ 次运算/秒)全部拿来暴力破解一个 AES-128 密钥,也需要超过 7×10²⁵ 年。宇宙的年龄才 138 亿年。
当然,密码学家不会傻到只尝试暴力破解。这些年针对 AES 的攻击研究包括差分密码分析、线性密码分析、相关密钥攻击等等。确实有一些理论上的攻击能够比暴力破解快那么一点点,但”快一点点”在这个量级上依然毫无实际意义。比如有一种对 AES-256 的相关密钥攻击,将计算复杂度从 2²⁵⁶ 降低到了 2⁹⁹·⁵——听起来提升巨大,但 2⁹⁹·⁵ 仍然是一个天文数字,以当前人类的计算能力根本无法执行。
更重要的是,相关密钥攻击有一个前提条件:攻击者需要知道密钥之间存在特定的数学关系。在正常使用中,只要密钥是随机生成的,这种攻击根本无从下手。
那量子计算机呢?这是很多人关心的问题。量子计算机确实能对对称加密造成威胁。Grover 算法可以将暴力破解的时间复杂度降低到原来的平方根——也就是说,AES-256 在量子计算机面前,安全强度大约等同于经典计算机面前的 128 位。而 2¹²⁸ 这个数字依然大得离谱,远超当前乃至可预见未来量子计算机的能力。有研究估算,要破解 AES-256 大约需要 6600 个逻辑纠错量子比特,而这需要数百万个物理量子比特——目前最先进的量子计算机也只有千量级的量子比特。
所以 AES-256 被广泛认为是”后量子时代安全”的加密算法。反观 RSA 那些基于大数分解的非对称加密算法,在 Shor 算法面前就没有这么幸运了。
AES 无处不在
说了这么多理论,最后聊聊 AES 在现实世界中的存在感。答案是:几乎无处不在。
你用浏览器访问 HTTPS 网站时,TLS 握手完成后的数据传输很大概率就是用 AES 加密的。你手机上的全盘加密(iOS 和 Android 都有),底层用的是 AES。你用 WinRAR 压缩文件时选择加密,默认就是 AES-256。Wi-Fi 的 WPA2 和 WPA3 安全协议里,数据加密用的也是 AES。连美国政府保护最高机密的信息,用的都是 AES。
从硬件层面来看,Intel 和 AMD 的现代 CPU 都内置了 AES-NI 指令集,也就是用专用的硬件电路来加速 AES 的运算。在支持 AES-NI 的处理器上,AES 加密的吞吐量可以达到每秒数 GB。这意味着在你几乎感觉不到任何延迟的情况下,你的所有数据都已经被加密了。
写在最后
AES 不是一个完美的算法,世界上也不存在绝对安全的加密。但它是人类迄今为止设计出的最优秀的对称加密算法之一:经历了二十多年全球密码学家的反复锤炼而屹立不倒,在从 8 位智能卡到高性能服务器的各种硬件上都能高效运行,而且至今没有任何已知的实用攻击方法。
有时候我觉得密码学是一个很浪漫的领域。两个比利时人在上世纪九十年代末设计了一个数学结构,然后这个结构在接下来的几十年里,默默地保护着全世界数十亿人的隐私和秘密。你永远不会在使用它的时候看到它,但它一直在那里。
这大概就是好的基础设施应有的样子——你察觉不到它的存在,恰恰说明它在完美地工作。

发表回复