加密算法:从竞争到标准化

54 阅读 2274 字 · 约 8 分钟

上世纪七十年代,加密是一个秘密。

不是普通人不知道——是算法本身是秘密。美国政府的 DES(Data Encryption Standard,数据加密标准)由 IBM 设计,NSA(美国国家安全局)审核。算法不公开,密钥不公开,加密强度靠「别人不知道你怎么加密的」。

这种安全叫「靠隐藏活命」。一旦被逆向,整个系统塌。

但真正的转折不在 DES 本身,在 DES 之后:标准化的念头一旦开了,就没人能收回去。


AES 诞生史:从竞争到标准

DES 撑了二十年。56 位密钥,90 年代末一台专用机几天就能穷举完。美国国家标准与技术研究院(NIST)在 1997 年公开征集 DES 的继任者——叫 AES(Advanced Encryption Standard,高级加密标准)。

这是全球密码学史上最大的一次公开竞赛。任何国家的任何人,交了算法就参选。没有审查,没有暗箱——NIST 公开了所有参选算法的代码和设计文档,全世界密码学家一起审视。

第一轮收上来十五个算法——来自比利时、加拿大、以色列、韩国、日本、美国、德国、法国、澳大利亚、英国、挪威、哥斯达黎加。密码学历史上第一次真正意义上的全球竞赛。

第二轮筛到五个:Rijndael、Serpent、Twofish、RC6、MARS。第三轮,2000 年,NIST 宣布胜出者:Rijndael,两个比利时人设计的。

AES 的诞生不是「NSA 说了算」,是「全世界一起看、一起打、一起挑,最后剩下谁用谁」。这个机制比算法本身更可贵——算法是透明的,筛选是公开的,信任是挣来的。

AES 诞生史:全世界一起挑

今天的 SSL、HTTPS、Wi-Fi 密码——全是 AES。你每天用 AES 几十次,不知道它在用。


分组加密的代价:ECB 模式的教训

AES 是分组加密:把数据切成 128 位的块,逐块加密。但逐块加密有一个经典陷阱——同样的输入,同样的输出。

这叫 ECB 模式(Electronic Codebook,电子密码本)。你把一张图片用 ECB 加密,所有相同颜色的区域加密后还是相同的密文块——图片轮廓清晰可见。

不是 AES 有漏洞,是 ECB 模式有漏洞。AES 本身是安全的——但用 ECB 模式,就等于把加密退化成了替换表:同一段明文映射到同一段密文。信息没泄露,信息模式全泄露。

ECB 的教训:同样的输入,同样的输出

这是加密领域最重要的教训:算法安全不等于用法安全。 AES 赢了竞赛,但没人会用 ECB 模式加密用户密码——你的密码和别人的密码,同一个明文 = 同一个密文。攻击者不用破解 AES,只要对比密文。

实际工程中,没人用 ECB。AES 的正确用法是 CBC、GCM、CTR——每个块加密前,先和前一个块的密文做一次异或,这样同一个明文块在不同位置,产出不同密文块。信息模式被打散了,攻击者猜不出来。


RSA 与密钥交换:加密的另一个世界

AES 是分组加密——一段一段把数据打散成密文。但做这个之前,还有一个没解决的问题:密钥怎么给对方?

你给朋友发加密消息。你们得先统一一个密钥,然后才能加密。但怎么把这个密钥给对方?发邮件?发消息?那你传密钥的通道本身是不是加密的?如果是,那你已经有一个安全的通道——加密是多余的。如果不是,那密钥是明文传的——被截获就全没了。

这叫密钥分发问题,密码学里最基础的盲区。对称加密(AES)的前提是:双方已经共享了一个密钥。但怎么共享?没人传得过去。

RSA(Rivest-Shamir-Adleman,以三个数学家名字命名)解决的就是这个问题——非对称加密

RSA:公钥加密,私钥解密

不共享密钥——一把公钥,一把私钥。公钥加密的,只有私钥能解开。公钥可以公开,可以发在网站上,可以写在邮件签名里——任何人截获了,用公钥加密的东西只有你的私钥能解。截获等于白截。

这种设计,第一次把「密钥交换」从「事先见面」改成「公开宣布」。不需要先传密钥——公钥公开,任何人拿到你的公钥就能给你发加密消息。私钥不出门,不需要传。

但 RSA 的代价,在速度。

RSA 比 AES 慢两个数量级。大块数据用 RSA 加密——手机会热,服务器会卡。所以工程上没人直接用 RSA 加密文件。RSA 的实际用途是 密钥交换:用 RSA 把 AES 的密钥安全地送到对方手上,再用 AES 的密钥加密实际数据。RSA 贡献安全性,AES 贡献速度。

这就是 HTTPS 的握手:

  1. 浏览器拿到服务器的公钥
  2. 浏览器生成一个临时的对称密钥,用公钥加密,发给服务器
  3. 服务器用自己的私钥解出对称密钥
  4. 两端现在共享同一个密钥,开始高速加密

RSA 解决了「密钥怎么给对方」,AES 解决了「给了密钥之后怎么加密」。分工清晰,各干各的。


怎么选

加密算法不是「哪个更先进」,是「你的场景在哪一端」。

  • 你在本地加密文件、加密数据库、加密硬盘——AES-256。快,放心,硬件支持。BitLocker、FileVault、LUKS 全在用它。密钥 256 位,暴力破解不可行。
  • 你在网络上加密传输,对面是陌生人——RSA(或 ECDH)做密钥交换,AES 做数据加密。HTTPS 就这么干的:RSA 替你搞定密钥,AES 搞定数据。
  • 你传的是结构化数据,每条很短,独立加密——AEAD 模式(GCM、ChaCha20-Poly1305)。不只要加密,还要保证完整性——密文被改,检测得出来。
  • 你在嵌入式、低功耗、资源紧张——ECC(椭圆曲线加密)。密钥更短,跟 RSA 同样的安全性,ECC 的密钥只有 256 位(RSA 要 2048 位)。手机、IoT、智能卡——全在用它。

大部分场景选 AES-256。加密算法都用它,生态全认,硬件全支持。但永远记得:算法安全不等于用法安全。 AES 用 ECB 模式还是能被攻击者看出模式。RSA 用太短的密钥(512 位)已经被暴力破解了。选算法容易,用对模式难——这才是加密的本质。