摘要

  • 1994 年 12 月的 RFC 1751 提出一种 128 位密钥的人类可读写法。它复用 S/Key 的 2048 个短英文词词表,分别把两个 64 位半段转换成六个词,合计十二个。
  • 固定词表让不同程序能把相同词串还原成相同密钥。RFC 也警告:若操作者自己编一句顺口的话当密钥,攻击者搜索的就是人爱写的句子,而非难猜的原始值。

机器认得的东西,人未必抄得对

网络设备比较二进制位,不会把 B 看成 8,也不会在凌晨三点把两组十六进制数抄反。值班员会。RFC 1751 关注的正是这道接口。SNMPv2 安全协议给出了需要密钥的认证场景;McDonald 问的是下一步:一个人怎样把 128 位秘密从纸面、屏幕或口头传递到另一台机器?

先前的 S/Key 已经试过较小的版本。它把 64 位值写成六个英文词,词从一张固定的 2048 词表里取,每个只有一到四个字符。六次选择覆盖 66 位空间,留出校验余量。词是数字的另一种写法,软件能把它们转换回原来的位串。相比一排紧挨着的符号,六个有空格的短词更容易逐个核对。

McDonald 没另造一套 128 位算法,而是把既有转换做两遍。key2eng 先处理前 64 位,再处理后 64 位;eng2key 逆向恢复。RFC 的示例词串以“RASH BUSH MILK LOOK BAD BRIM”开头。它不像一句能印在咖啡杯上的励志话,这反倒是优点:顺序由密钥决定,不由操作者的文采决定。十二张词牌分成两组六张,计算机最后要拿回的仍是原来那 128 位。

那张英文词表是整套办法最固执的部分。McDonald 解释,若法语、中文、日语各用一张词表,同一密钥就会长出不同的词串,不同实现之间难以交换。已有的英语词表使用 ISO-646 不变部分的字符,也已有应用在用。于是各地操作者都面对同一套短英文词。语言上的方便让位给跨机器一致性;这不是一篇英语课,而是一份双方必须拿到同一本索引的约定。

RFC 的安全段落盯住了人类的一次逆行。程序先拿到足够难猜的密钥,再把它显示成词,这只是表示方法。人先凑出“好记的一句话”,再要求系统把句子解释成密钥,秘密的来源就变了。原文提醒这种词串可能遭遇按句子猜测的字典攻击。看起来都是十二个词,背后的选择过程决定了攻击者要找多大的范围。

文档把转换程序与 2048 个词全部公布出来。这份清单让两个实现有办法逐项核对:给定同样的 128 位,两台机器都应印出同样的十二词;再把词送回去,也应一位不差地恢复原值。容易念只是第一层好处,互相还原才让这套写法能用于实际交接。否则“人类友好”的词串会成为另一种难排查的配置故障。

RFC 1751 的场面很小:密钥、词表、键盘、人的眼睛。它解决的却是网络安全反复遇到的摩擦。机器要长而难猜的秘密,人要能抄写的单位。十二个短词是一座窄桥。先造密钥,再过桥;桥上的词再好念,也替不了造密钥的工作。