AES 是公开的,二十年来也没有被攻破。那为什么俄罗斯、中国和其他大国要造自己的密码,而不是直接采用它?
AES 的完整规范是公开的,任何人都能拿到:它写在一份公开标准里,内置于每个浏览器和手机中,并被教科书详细讲解。人们在公开场合尝试攻破它已经二十多年——始终没有成功。按说它该是适合所有人的统一标准。可事实并非如此:俄罗斯采用了自己的密码——Kuznyechik,中国采用了 SM4,其他国家也都有自己的标准。
如果算法是公开的,二十年里又没人在其中找到一个实际的漏洞,是什么促使一个个国家花上数年去造自己的密码,而不用现成的?难道 AES 的“透明”并不那么彻底?
先看看为什么 AES 在数学上几乎无可挑剔——然后再回到:为什么这还不能说服所有人。AES 是一种代换–置换网络(SP 网络):它不像费斯妥网络那样把分组切成两半,而是把分组放在一个字节矩阵里,每一轮用四层运算改变整个矩阵。因此每个运算都必须可逆。
数据块被铺进一个方阵的各个格子里。在真正的 AES 中,这是一个 4×4 的 16 字节矩阵(128 位);在 Ludus Lab 的游戏里,是一个 2×2 的四个半字节矩阵(16 位)。后面所有步骤都在这个矩阵的行和列上进行。
每个字节按一张固定的表——S 盒——替换成另一个字节。这就是“混淆”(confusion):AES 中唯一的非线性运算。没有它,整个密码就会退化成一个线性方程组,可以直接求解。
矩阵的行被循环移位,列之间相互混合。这就是“扩散”(diffusion):只需几轮,一个被改变的输入比特就会散布到整个分组。这两个运算都是线性且可逆的。
状态与本轮的密钥做异或。轮密钥是事先由共享密钥通过一个单独的过程——密钥编排——推导出来的。正是这一步,不知道密钥就无法撤销。
这些层会重复很多次:根据密钥长度分别是 10、12 或 14 轮。最后一轮没有 MixColumns——它对强度毫无增益。要解密,鲍勃就按相反顺序执行逆运算——但前提是他知道密钥。
每一步都可逆——但它们合在一起,把分组和密钥缠绕得如此之深,以至于没有密钥就无法倒着跑。
混淆与扩散这两个概念,早在 1949 年就由克劳德·香农提出:他建议用多次重复的简单代换和置换来构造强密码。1970 年代初 IBM 的 Lucifer 密码的早期版本就是按这个思路设计的;后来的 Lucifer 变成了费斯妥网络并演变为 DES,而 AES 又回到了最初的思想。
AES 的选定过程空前公开:1997 至 2000 年,美国标准机构(NIST)举办了一场国际竞赛——来自世界各地的 15 个密码,三年的公开分析,任何人都可以寻找弱点。获胜的是比利时人琼·达门和文森特·雷门的 Rijndael,2001 年它成为标准。这是一个诚实的过程,也是 AES 真正的长处。然而,算法的公开,并不等于信任选定它的人、以及把标准握在手里的人。
这种不信任有其历史根源。美国国家安全局(NSA)当年曾秘密改动过 DES 密码的 S 盒——后来才知道是为了抵御一种攻击,但二十年的保密埋下了猜疑。2013 年又爆出 Dual_EC_DRBG 事件——一个 NIST 标准的随机数生成器,NSA 似乎在其中留了后门。AES 本身并没有发现类似的东西——而且它的 S 盒是用一条公开的代数规则构造的,而不是“魔法”数字。但对一个国家来说,“大概是干净的”并不足以成为把自己的秘密托付给某个密码的理由。
由此便有了密码主权:自己的密码、自己的监管机构、由本国专家审计,以及不依赖他国标准。这并不一定意味着 AES 里有后门——而是说,国家安全不会建立在对他国机构的信任之上。
民用互联网事实上的世界标准:几乎所有网页流量、Wi-Fi 和磁盘都用它加密。监管机构是美国的 NIST。
公开,却在他国掌控之下
俄罗斯标准 GOST R 34.12-2015——也和 AES 一样是 SP 网络:128 位分组,256 位密钥,9 轮外加最后一次密钥加法。监管机构是俄罗斯联邦安全局(FSB,TC 26)。
自己的密码,自己的监管机构
中国的国家密码(标准 GB/T 32907):分组和密钥均为 128 位,32 轮。在国内许多场景中是强制的,例如中国的 Wi-Fi(WAPI)。
中国的密码主权
而且不止如此:几乎每个大国都有自己的分组密码,而它们共有的,正是大多数现代算法所依赖的 SP 网络结构本身:
Ludus Lab 的交互式演示运行的是与真正的 AES 相同的运算,但作用在一个很小的 16 位分组上(2×2 矩阵,2 轮)——好让每一步都完整可见。你可以:
这两种密码都是代换–置换网络,但历史和参数各不相同:
| 参数 | AES | Kuznyechik(GOST R 34.12-2015) |
|---|---|---|
| 起源国家 | 比利时 / 美国(标准) | 俄罗斯 |
| 采用年份 | 2001 | 2015 |
| 结构 | SP 网络 | SP 网络 |
| 分组大小 | 128 位 | 128 位 |
| 密钥长度 | 128 / 192 / 256 位 | 256 位 |
| 轮数 | 10 / 12 / 14 | 9 轮 + 最后一次密钥加法 |
| 如何选出 | 公开的国际竞赛 | 在监管机构主持下开发 |
| 监管机构 | NIST(美国) | 俄罗斯联邦安全局(FSB,TC 26) |
经过二十年公开分析,针对 AES-128 的最佳攻击(如“biclique”)只把搜索量降到约 2126 而非 2128——几乎没有收益。实际上这意味着:没有捷径,只剩穷举所有密钥,而那是不可能的。
即便是量子计算机也救不了攻击者:Grover 算法只能把强度“减半”,把 256 位密钥变成相当于 128 位。因此 AES-256 被认为连量子威胁也能抵御——它也正是长期保护所推荐的。
地址栏里的小锁多半就是 AES-GCM:它在 TLS 中加密了几乎所有网页流量
WPA2/WPA3 用 AES-CCM 保护你的网络;热门即时通讯应用的加密也建立在 AES 之上
BitLocker、FileVault 以及智能手机存储加密都使用 AES;处理器用 AES-NI 指令为它加速
现在你既明白了 AES 如何工作,也明白了为什么它的公开并不能让它成为适合所有人的唯一密码:数学到此为止,信任与控制的问题从这里开始
在演示中,你将带着 16 个比特,从明文一路走到密文再回来——亲眼看看为什么没有密钥就跨不过这堵墙