DES 的密钥长度写着 64 位,8 个字节。但几乎所有资料都会补一句:有效强度只有 56 位。这 8 位的差额来自奇偶校验位,而 56 位这个数字,在上世纪七十年代被认为是足够的,在今天却只要几天的算力就能穷举完。
8 位校验位被吃掉了
DES 规范里,密钥的每个字节的最低位被规定为奇偶校验位,用来检测密钥在输入或传输过程中是否出错。
8 个字节各留 1 位,一共 8 位校验位。64 减去 8,剩下 56 位真正参与密钥扩展和加密运算。所以 DES 的密钥空间是 2^56,而不是 2^64。
这个设计在当年的语境下是合理的——密钥由人工输入或者从打孔卡片读取,出错概率不低,加一位校验能及早发现。但代价是直接损失了八分之一的密钥空间,而八分之一在指数尺度上就是 2^8 = 256 倍的差距。
2^56 有多大
单看 2^56 这个数字,大约是 7.2 乘 10 的 16 次方,看起来还是很庞大。但衡量密钥强度不能只看数字,还要看攻击者每秒能尝试多少次。
专用硬件是这里的关键。1998 年,电子前哨基金会(EFF)制造了一台名为 Deep Crack 的专用机器,造价约 25 万美元,用不到三天的时间穷举出了 DES 密钥。这个事件在当时具有标志性意义:它证明 DES 的密钥空间已经落在「可购买」的范围之内。
二十多年过去,算力又提升了好几个数量级。今天用显卡集群或者云上的按需算力,穷举 DES 的成本已经降到很低。所以「DES 还能不能用」这个问题,答案在二十多年前就已经明确了。
为什么不能简单加长密钥
看到密钥太短,最自然的想法是把密钥加长。但 DES 的密钥扩展算法是为固定的 64 位密钥设计的,直接加长会破坏算法的结构,需要一个全新的设计。
这就引出了两条后续路线。一条是 3DES,用三把 DES 密钥做三次运算,把强度提升到约 112 位;另一条是设计全新的算法,最终在公开竞赛中选出的是 AES,支持 128、192、256 位密钥。
AES 的做法也说明了正确的思路:密钥长度应该由算法设计时就确定,而不是在原有算法上打补丁。AES 的分组固定 128 位,密钥长度作为参数可选,这样在设计层面就为未来的算力增长留出了余量。
被撤销的时间线
DES 的退役不是一次性事件,而是一个持续了几十年的过程。
上世纪九十年代,随着穷举成本下降,出现了 3DES 作为过渡方案,把 DES 的有效强度提升上去。2001 年 AES 发布,成为新的标准。2005 年,NIST 正式撤销 DES,不再将其列为可用的加密标准。
这条时间线有一个值得注意的特点:撤销发生在实际被破解之后很久。Deep Crack 在 1998 年就成功了,而 NIST 到 2005 年才正式撤销。中间这几年,大量系统仍在用 DES 处理数据。
这反映了一个普遍现象:算法退役的进度往往落后于技术现实,因为迁移涉及存量数据、存量协议和存量硬件。所以在选型时,应该选择有足够强度余量的算法,而不是「刚好够用」的算法——因为等到它不够用的时候,迁移的成本会高得多。
现在遇到 DES 该怎么办
如果维护的系统里有 DES,先判断用途。
用于存量数据解密的,需要保留 DES 实现以读取历史数据。合理的做法是:读出来之后立刻用 AES 或 SM4 重新加密存储,逐步完成数据迁移。
用于与老系统对接的,如果对方只支持 DES,短期内只能继续使用,但要在架构文档里记录这个约束,并推动对方升级。
用于新设计的,没有理由选择 DES。直接使用 AES-256 或国密 SM4,并配合带认证的模式。
检查清单
- DES 的 64 位密钥里有 8 位奇偶校验位,有效强度只有 56 位
- 1998 年 EFF 的 Deep Crack 用不到三天穷举出密钥,证明密钥空间已被突破
- 加长密钥不能靠打补丁,需要重新设计算法,这就是 AES 的由来
- NIST 在 2005 年正式撤销 DES,但实际被破解早在 1998 年
- 算法退役往往滞后于技术现实,选型时应留足强度余量
- 存量 DES 数据应读取后立即用现代算法重新加密,逐步完成迁移