在《Enigma的故事》文末我曾挖了一个肆无忌惮的坑,因为我填坑的风格跟“有空一起吃饭”一样通常只是随口说说,但是凡事都有例外:有时候自己挖的坑可以让别人来填。
很偶然的机会,这几天我读到一本比德芙还丝滑的书《码书:编码与解码的战争》,第四章讲的就是怎么破解Enigma机的完整故事,作者是西蒙·辛格,一位印度裔的英国科普作家。
大部分人可能更熟悉西蒙另外一本非常经典的科普书《费马大定理:一个困惑了世间智者358年的谜》,这两本书一样的充满趣味性、可读性和知识性,是那种能同时激发和安放好奇心的佳作。
这本书最精彩的地方在于作者把密码学揉合到历史故事中的能力,娓娓道来,关于密码学的部分又浅显易懂,是相当好的入门读物。
我看完这本书,想了想自己上次写的文章,不由得感叹:可能大部分费解难懂,令人望而生畏的知识只是还没有找到适合表达它的人吧。
如果我没有办法简单说明,代表我了解得不够透彻。
写过《黑客与画家》的Paul Graham在最近的博文中写道:
大意是:知识的扩展是分形的,从远处看,知识的边缘是平滑的,但一旦你学到足够的知识,接近知识的边缘,就会发现它们充满了缝隙。这是一个不友好(理解门槛高)但是十分精确的比喻,分形是一个拓扑学概念,指的是物体在不同尺度上的自相似性质。(我知道,等于没解释)。1967年,数学家曼德勃罗在《科学》杂志上发表了一篇学术论文:《英国的海岸线有多长?统计自相似和分数维度》,文章最后的结论表明:英国的海岸线长度是无法精确测量的。从下面三幅图可以看出来,你度量单位选的越小,总长度就越长,粗略看起来光滑的地方放大之后都充满了“缝隙”。
很多人都听过“知识的岛屿越大,无知的海岸线就越长”,其实也可以是“知识的岛屿不变,无知的海岸线在探索中变长”。
有时候我们觉得某些知识很费解难懂,可能还是理解的“度量尺度”太大了,需要补充更多的细节和背景知识。
这本书梳理了几千年历史上出现过的主要加密算法和破解方式,让你很自然地理解各种加解密算法的设计思路以及这种思路背后的演变过程,很好的勾勒出密码学发展的“轮廓”。
跟随这趟梳理的旅程强化了我这样一个观念:科学、技术的发展很少有什么石破天惊的惊人一跃,如果你倒回去看,脉络会清晰很多,“横空出世”多半是逐步演变的结果,而了解技术的演变过程往往也是把握技术本质最好的方式。
下面讲一下这本书我觉得值得提及的几个点。
1. 摩斯电码虽然也是一种编码,但本身并不是密码,因为它并未隐藏信息。你可以理解摩斯电码只是另外一种“语言”,英文可以翻译为中文,也可以翻译为摩斯电码。
像几天前雷军跟小米官推在推上玩梗,如果你对摩斯电码很熟悉,这些也是可以直接读出来的。
2. 摩斯电码的出现,然后通过无线电传输,让加密的需求更强烈了。原因就在于操作摩斯电码需要专门的操作人员,有点类似于如果需要别人帮你收发短信,先对短信进行加密就显得更为重要。
更有意思的是,每位通讯员都有独特的操作习惯,像是停顿时间、输送速度,以及点与线的相对长度。这种“笔迹”就跟手写字体一样可辨认得出来。同时,还可以根据收到的电码讯号强度分析发送位置来源方位,结合多个来源方位信息还能进行准确定位。综合这两点,即使破解不了对方传输的信息内容,我们也能追踪特定部队在数天内的行程,进而推测它可能的目的地和进攻目标。3. 不同的场景需要不同的密码方案。有些密码设计在理论层面很安全,但是在实际的使用层面很困难。比如单次钥匙簿密码法具有数学证明过的安全性,但是编造和分发随机钥匙需要大量的时间、功夫与金钱,只能应用到少数需要绝对安全的领域。作者提到:美、俄总统之间的电话热线就是利用单次钥匙簿密码法来防护的。再比如,我们上次提到,Enigma机是一个一个字母输入,而且顺序一个都不能出错,这意味着它只能在作战总部办公室或者船舱这种“安定”的环境才能使用,如果是炮火纷飞的战地环境,没有什么比直接喊话更方便快捷了:在太平洋战争中,美军就是使用了纳瓦霍族人(美洲原住民)进行直接通讯,反正日本人也完全听不懂。4. 使用者往往是整个系统最大的弱点。在比较不同密码方案安全性时,我们基本的分析点都是“理论上”,但是人,也就是应用这些方案的实际操作者,往往才是系统整个系统最大的弱点所在。在前文中我们提到Enigma有无数种设定,操作员每个月都会收到一个“密码本”,里面详细规定了每一天的初始设置,而编纂密码本的人为了让每一天设定都不同,会避免让同一个滚轮放在同一个位置,这种人为干扰的随机性其实就是减少了设置的可能性,方便了解码人员进行搜索。这让我想到,像Google或者微信这种系统,其实再怎么提高安全性都永远会有人被盗号的。最简单一个例子,比如你在某个不知名的、业余的下载网站注册了账号,使用了跟Google那边相同的用户名密码。当下载网站那边的信息被盗之后,你Google这边的安全性就没有什么保障了。5. 早期的密码系统都是对称加密系统,当时的人都相信加密和解密需要用到同一把“钥匙”,而“钥匙”的发放问题是长久以来的难题,原因在于“钥匙”本身也是一种需要被保守的秘密,它又用什么进行保护呢?在20世纪70年代,银行甚至会聘请经过调查、公司最能信任的职员担任特别信差发送“钥匙”,但这总归是一种高成本、低效率、不那么安全的方案。理论上再怎么安全的密码系统,都有可能败在发送“钥匙”的问题上。注意,这里的“钥匙”只是一个比喻,在Enigma的例子中,“钥匙”指的是机器的初始设定,在“凯撒密码”中“钥匙”指的是字母移了多少位,它可以是一个单词,一个数字,某本书的某一页等等。我也知道,“用钥匙进行加密”听起来怪怪的,这可能说明把加解密比喻为上锁开锁不是很恰当,但现在这是一种“约定成俗”的表达方式了。
其实“钥匙”的本质就是加解密双方都知道的一个“共同的秘密”。从第一性原理考虑,理论上并不需要加密方通过某种方式“直接告诉”解密方,如果双方能通过某些特殊数学函数算出同一个值,也能充当“钥匙”的角色,这就是后来的迪菲-黑尔曼-墨克钥匙交换方案,当他们第一次在研讨会公布这个方案时,现场的密码专家都震惊了,在当时,这确实很反直觉。紧接着人们就会想:有没有可能加密和解密使用不同的“钥匙”呢?这就是后来的非对称加密方案,简单描述就是每一次造出一对钥匙(两个很长的字符串),其中一把钥匙直接公开,任何人都可以看到,你想发信息给我,可以用这把“公开的钥匙”对信息进行加密,加密之后甚至连你自己都解不开了,而全世界只有我手头那把“配对的私有钥匙”能解得开。紧接着人们就会想:既然全世界只有我手头那把“配对的私有钥匙”能解得开,那岂不是可以进行身份认证了?我如果能把某个公开密钥加密过的东西打开,就表明我是这个公开密钥背后的持有人,这就是“数字签名”的概念。比特币不需要登记你的现实身份信息,也不需要某个国家机构对你进行认证,每个人都造出一对钥匙。“公开的钥匙”对应的就是你的账户,你可以把它像微信二维码那样贴在任何地方,任何人都可以往你这个账户转钱,但是如果你要动用账户里的钱,就需要用到“配对的私有钥匙”。如果你不小心弄丢了私有钥匙,这个账户的钱就从这个世界上消失了:它仍然一直都在账户里,只是没有人可以动用它了。如果有技术手段可以找回这些钱,说明它所依靠的非对称加密算法出了问题,而非对称加密所依赖的是数学,这正是人们信心的来源。但作为普通人,有多少场景需要用到这样的系统呢?