代码破解——我该如何破译一条加密消息?以及其他入门问题

0 阅读20分钟

image.png

图 1-1 中的明信片(由 Karsten Hansky 提供给我们)寄出于 1904 年。正如你很容易看出的那样,写在明信片上的信息是加密的。

image.png

图 1-1:显然,这张明信片的寄件人不希望邮递员或收件人的家人读到它。所以,他们选择把信息加密。

几十年、甚至几百年前的加密信息一点也不罕见。已知存在无数加密的日记、信件、笔记本、无线电报文、报纸广告和电报——更不用说大量加密明信片了,比如图 1-1 这张。加密文件也能在档案馆、私人收藏和跳蚤市场里找到,也能在互联网拍卖平台、网站和邮件列表上发现。还有更多加密信息被印在书籍、报纸和杂志里,新旧皆有。

在计算机普及之前,加密主要靠手工完成,通常使用铅笔和纸张(因此有“铅笔纸面加密”这一说法)。有时,密码使用者也会借助一些简单器具,比如皮革条带,或木制、金属制的小工具,例如转盘或滑尺。自 20 世纪 20 年代末起,机械与电动的加密机器开始投入使用,其中最著名的是德国的恩尼格玛机(见第 15 章)。由于加密机价格昂贵,它们主要在军队、情报机构和外交部门得到广泛使用。财力较弱的人则往往继续使用铅笔纸面的系统。

大约在 1970 年前后,随着现代数字技术的到来,商业与军事加密开始采用计算机硬件和软件。尽管如此,铅笔纸面加密仍然延续至今,而且今天依然相关。它被相当广泛的人群使用:保护非法活动的犯罪分子、交换秘密信息的朋友与恋人,以及把它用于各种娱乐活动的人。例如,地理寻宝(geocaching)玩家、密室逃脱爱好者,以及参与其他高科技寻宝游戏的人,可能会用密码学来隐藏经纬度坐标。

本书讲什么?

我们将向你展示一些真实信息的历史实例——例如明信片、日记、信件和电报——这些信息使用铅笔和纸张或其他手工方法加密。我们也会教你破解它们的方法。尽管由于计算机技术的广泛使用,手工加密与解密的重要性已大幅下降,但仍有许多人出于多种原因对破译加密信息感兴趣:

  • 家族可能想读懂从祖先那里继承来的加密明信片、信件或日记。
  • 历史学家希望破译他们在研究中遇到的加密文献,以洞察过去的时代。
  • 警察可能想破解犯罪分子写下的密文信息。
  • 地理寻宝玩家想解出谜题缓存(puzzle cache)。
  • 解密爱好者乐于破译几十年甚至几百年前生成的加密文档;其中许多人认为,解开一个尚未破解的密码,其刺激程度不亚于攀登珠穆朗玛峰或做出一次新的考古发现。
  • 学生尝试解决密码学课程中的挑战。大多数课程聚焦基于计算机的加密,但通常也会包含对铅笔纸面方法的学习。

一些解密者主要对历史加密信息感兴趣;另一些人则享受作为娱乐而创作的加密谜题,比如 Elonka 的《The Mammoth Book of Secret Codes and Cryptograms》2 中的谜题,或美国 Cryptogram Association 的定期出版物中的谜题。本书主要讨论历史加密。本章开头展示的那张 1904 年明信片,是我们提供的第一个例子。在第 5 章,我们将解释如何将它破译出来。

我需要了解哪些技术术语?

要被加密的文本称为明文(plaintext)。加密的结果称为密文(ciphertext)。有时,密文会嵌在其他可读文本之中;为与其中出现的密文相区分,这类可读文本称为清文(cleartext)。

许多加密方法依赖某种秘密信息,这种信息可能只为寄件人与收件人所知——这就是密钥(key)。一个典型的密钥例子是替换表:把字母表中的每个字母替换成另一个字母。有时,密钥也会用一个词来表示,即关键字(keyword)。

加密方法有两类:密码(cipher)与代码(code)。描述它们差异最简单的方式是:密码(有时拼作 “cypher”)通常作用于字母,而代码作用于单词或短语。使用代码的问题在于,你往往需要先设想几乎所有想使用的词,然后生成一本为每个词提供对应项的代码本。由于一种语言可能有成千上万的词,这样的代码本可能非常庞大!而只在字母层面运作的密码系统则可以紧凑得多。只要寄件人与收件人都了解该系统,几乎任何内容都能用密码加密;不需要厚重的代码本。本书涵盖的大多数加密方法都是密码。代码将在第 7 章讨论。

不幸的是,这些术语容易混淆,因为“code”一词在日常中还有许多其他含义。例如,邮政编码(ZIP code)或行为准则(code of conduct)与加密毫无关系。即便我们把范围限定在加密技术领域,“code”这个词的用法也仍然含混,因为它有时会泛指加密本身(比如在 “codebreaking” 这个词中)。甚至职业密码学家在随意交流时,也可能把 code 和 cipher 混用。在本书中,我们只按上一段给出的定义使用 code 一词(即:在单词与短语层面加密信息的方法)。只有一个例外:当我们说 codebreaking 时,我们指的是所有类型的加密,而不仅仅是“代码”。

如果我们拥有密钥,就可以将密文解密,得到明文。如果我们在不知道密钥的情况下,试图从密文推导出明文,通常称为破解加密。我们想要破解的加密信息称为密文谜题(cryptogram)。

加密这门技艺称为密码学(cryptography),而破解密文谜题称为密码分析(cryptanalysis)。codebreaking 是 cryptanalysis 的另一个说法。此外,cryptology 一词通常表示 cryptography 与 cryptanalysis 两者,但也可以表示对一切与加密相关之事的研究,包括人物、机器、系统与历史。术语 crypto 则可作为一个统称,用于涵盖这份列表中的许多条目。

一般而言,cryptology 指的是被加密的消息;但有时也会把隐写术(steganography,即隐藏信息;见第 15 章)包含在 cryptology 之内。

在破解一个 cryptogram 时,知道或猜到明文中出现的某个单词或短语通常会很有帮助。这样的单词或短语称为已知明文线索(crib)。

此外,密码学文献中经常会提到几个固定角色(尽管他们在本书中不占重要地位):在解释加密方法时,常用 Alice 和 Bob 作为占位名。通常,加密信息的发送者称为 Alice,接收者称为 Bob。有时还会出现其他角色,比如 Carol(另一位加密用户)、Eve(窃听者)以及 Mallory(恶意者)。这些角色不一定代表人类;他们也可能指计算机程序或硬件组件。

这些以及其他术语的定义,请参见附录 C 的术语表。

如何破解一段加密文本?

你来对地方了!我们这本书的目的正是帮助你回答这个问题,尤其是针对古典密码。我们会介绍实践中常见的主要“铅笔纸面”加密技术,然后说明如何把它们解出来。

为了照顾急性子的读者,我们先给出第一个破译示例:下面这段密文来自一则加密广告,刊登于伦敦报纸 The Times,时间是 1873 年 8 月 1 日。这则广告以及我们稍后还会提到的其他一些加密报纸广告,出自 Jean Palmer 于 2005 年出版的《The Agony Column Codes & Ciphers》。(Jean Palmer 是伦敦破译专家 Tony Gaffney 使用的笔名。)3

image.png

下面把密文按更易读的方式写出:

HFOBWDS wtbsfdoesksjd ji ijs mjiae (dai ditwy). Afods ks rofed dpficqp licqp. Toeqfwus yic lsrd vspojt uwjjid qsd ibsf. Aoll sjtswbicf di edwy apsfs yic lsrd ce doll O pswf rfik yic, qobs yicf wtbous. Yicf cjpwhhy aors jid asll.

破译的一个很好的第一步,是统计信息里的字母出现次数。这种技术叫频率分析(frequency analysis):根据每个字母在文本中出现的频繁程度,我们可以对它代表哪一个明文字母作出较为可靠的猜测:

image.png

如你所见,密文字母 s 的频率最高。它很可能对应明文字母 e——在几乎所有英文文本中,e 都是出现频率最高的字母。紧随 e 之后,英语中最常见的字母通常是 t、a、o,不过仅凭频率本身很难把它们一一确定。但还有一个字母我们可以通过观察密文轻松猜到:单词 O 一定对应 I,因为英语里几乎没有别的只由一个大写字母构成的单词(除非在句首,这时字母 A 也可能成立)。

进一步分析会发现,密文里 yic 出现了三次,yicf 出现了两次。明文里的 the 和 them 是不错的猜测,但我们已经确定 s(而不是 c)对应 e。因此,把它们解作 youyour 就说得通了。

知道明文字母 e、i、y、o、u、r 在密文中的对应关系后,我们就能更容易猜出更多词。例如,ijs 可解为 o*e(星号表示未知字母),这很可能是 one。最终,我们得到如下明文:

PRIVATE advertisement no one knows (two today). Write me first through lough. Disgrace you left behind cannot get over. Will endeavour to stay where you left us till I hear from you, give your advice. Your unhappy wife not well.

如果我们能使用计算机以及类似 CrypTool 2(免费开源软件,可在其官网获取)的程序,还能用一种更高效的方法来破译这则《The Times》加密广告:在密文中寻找一个具有明显重复模式的单词。我们能找到的最佳候选是 wtbsfdoesksjd——它在第 4、第 9、第 11 位出现了同一个字母(s),并且第 6 位和最后一位的字母(d)也相同;除此之外,这个词里的其他字母都各不相同。CrypTool 2 提供了一个工具,可以在大型词库中搜索具有给定重复模式的单词。对 wtbsfdoesksjd,它只返回一个匹配:advertisement。这显然是报纸广告里非常常见的词。

image.png

如果我们接受 advertisement 这个猜测,就能确定下面这些字母的对应关系:

Plaintext: a d e i m n r s t v
Ciphertext: w t s o k j f e d b

这些信息让我们可以识别或猜出更多词。例如,第一词 HFOBWDS 对应 RVATE,即可解出 PRIVATE。这样我们就知道密文字母 H 和 O 分别对应 P 和 I。密文 wtbous 可解为 advi*e,应当是 advice(不可能是 advise,因为 s 已经对应到另一个字母了)。这也表明密文字母 u 对应明文字母 c。到这里我们已经识别出足够多的字母,应该能解出更多词。最终,我们得到上面那段明文。

这则广告看起来像是一位妻子写给离开她的丈夫的消息。我们大概永远不会知道是谁写的、又是出于什么原因——毕竟它发表于 150 年前。不过从破译者的角度看,谜题已经解开了。

这并不难,对吧?在本书接下来的内容里,你将接触到更复杂的加密方法,以及更成熟的破解技巧。

我如何判断自己面对的是哪一种加密方式?

破解密文通常需要先知道它使用了哪种加密方法。因此,除了破译方法之外,本书还会介绍若干识别密码类型的技巧。识别所用密码可能非常简单,也可能非常困难。一个有用的事实是:实践中遇到的大多数信息,通常只会使用大约十来种方法之一;通过一些分析,这些方法往往可以彼此区分。

如果你想在不通读全书的情况下先识别某一种密码,下面几段可以给你一些指引。

如果你想解的加密文本看起来像这样4 ……

image.png

……或者像这样5 ……

image.png

……或者像这样……

image.png

……或者像这样……
SIAA ZQ LKBA. VA ZOA RFPBLUAOAR!
……那么它很可能是替换密码(substitution),你应该阅读第 3、4、5 章。

如果你想解的 cryptogram 看起来像这样6 ……

image.png

……请看第 7 章(关于代码与 nomenclators)。

如果你的密文看起来像这样7 ……

image.png

……它很可能是旋转栅格(turning grille)加密,本书第 11 章会讲。

如果你想解的加密文本看起来像这样8 ……

image.png

……或者像这样……

image.png

……请看第 13 章(缩写密码,abbreviation ciphers)。

如果你想解的加密文本看起来像这样……
218.57 106.11 8.93 17.61 223.64 146.7 244.53 224.21 20 192.5 160.19 99.39 No. 8 251.70 1 223.64 58.89 151.79 226.69 8.93 40.12 149.9 248.101 167.12 252.35 12.31 135.100 149.9 145.76 225.53 212.25 20 241.6 222.22 78.45 12.31 66.28 252.33 158.33 6.65 20 2 11.50 142.37 223.87 12.31 142.37 105.33 142.37 157.20 58.62 133.89 250.86.
……请读第 14 章(关于词典码与书本密码,dictionary codes and book ciphers)。

如果你面对的是五字母一组的分组文本……

image.png

……可能性有好几种,最常见的是代码(第 7 章)、换位密码(第 9、10 章)、二合字母替换(digraph substitution,第 12 章),或机器密码(第 15 章)。

如果你的 cryptogram 看起来不像上述任何一种,或者你不确定最符合哪一类,那么恐怕你需要一章一章读下去,直到找到你要的内容为止。

我在阁楼里发现了一段加密文本;你能帮我把它破译出来吗?

也许可以!你找到的是曾祖父留下的一张加密明信片吗?你是在跳蚤市场买到一本加密笔记本吗?又或者,你还保留着童年时最好的朋友寄给你的那条密语?如果是这样,你可以尝试用本书介绍的某一种技术来破解这条信息。

如果你没能成功,或者你只是单纯不想投入时间自己去解一个 cryptogram,欢迎把它发给我们。(我们的邮箱地址在本章末尾的 “I have a comment” 一节里。)当然,我们不可能调查每一个我们收到的加密谜题,但在很多情况下,我们确实能提供帮助。我们尤其对历史案例感兴趣;相对而言,对现代有人自创的系统兴趣较小。Klaus 一直在寻找有意思的加密文本,好拿来写文章;Elonka 则有一个网站专门收录著名的未解密码。我们不作任何保证,更别说保证你的谜题一定会被解开,但我们至少会看一眼。

如果你把你发现的 cryptogram 发给我们,请尽量同时提供以下信息:

  • 告诉我们你对这份 cryptogram 背景所知道的情况:你在哪里发现它的?是谁写/制作的?你是否还有其他信息,比如它大概创作于哪个时期?它是寄给或来自你认识的人吗?这个人会说哪些语言?这类信息对破译者可能极其有用。
  • 告诉我们你是否允许我们发表这份 cryptogram(比如发布在互联网上,或刊登在像本书这样的出版物里),还是希望保密。当然,没有发件人的同意,我们不会发表任何内容。
  • 如果你允许我们发表,请告诉我们你是否希望署名致谢,及/或是否允许我们提到你的名字。

我自己加密了一段文本;你能破解吗?

虽然我们一直对真正的历史与古典密码很感兴趣,但一般而言,我们无法帮助处理较新的内容。这很大程度上是因为我们收到的邮件数量太多;此外,把一堆随机文字拼起来,然后宣称“来破我的密码!”实在太容易了。

但如果某个特定密码引发了大量公众关注,我们也会破例。例如,如果一条加密信息以艺术作品的形式出现,或作为建筑铭文、墓碑刻字,或以其他不寻常的方式呈现,它就可能对更广泛的受众更有吸引力。另外,为破解某个密码谜题提供现金奖励或其他奖品,也是让新谜题更具吸引力的好办法。我们也可能对由 NSA 或其他与破译有关联的组织发布的密码挑战产生兴趣。

如果你喜欢设计加密挑战,我们建议加入 American Cryptogram Association,他们一直在寻找为其定期通讯设计谜题的人。你也可以访问密码谜题平台 MysteryTwister 并提交一个挑战。

我发明了一种新的加密方法;你们能帮我看看吗?

和所有在密码圈有一定知名度的人一样,我们经常收到这样的来信:有人发明了自己的加密方法,希望我们评审或破解它。坦白说,我们从未收到过一个足够扎实、或者看起来值得我们投入时间的系统,所以认真讲,这么做恐怕不是个好主意。

如果你设计的方法与本书介绍的众多手工密码之一有关,那么它很可能是非常容易被破解的——尤其在现代计算机的帮助下,有很多方法可以把这类系统拆开。新密码必须与 AES、Diffie–Hellman、RSA 这类最先进的密码算法竞争(它们不在本书讨论范围内)。要设计一种能进入“顶级联赛”的加密算法非常困难,即便是受过高度训练的专家,通常也需要多年努力才能做出一个好的加密算法。

因此,如果你刚进入加密技术领域,又确实想设计新系统,我们建议先找一本好的密码学书,认真学习已经存在的加密算法。例如,Joachim von zur Gathen 的《CryptoSchool》(2015)9 是一部全面的入门;Jean-Philippe Aumasson 写的《Serious Cryptography》(2017)10 则是更短的替代选择。如果你能读德语,也可以试试 Klaus 的《Kryptografie—Verfahren, Protokolle, Infrastrukturen》(2016)11。

关于“密码专家不断收到可破解系统”的这一现象,我们强烈推荐阅读 Memo to the Amateur Cipher Designer(Bruce Schneier,1998)12。这篇文章虽然已过去二十多年,但仍然切中要害。简而言之,Schneier 说(我们也同意):想尝试创建一种新的密码系统,首先必须在破解既有系统方面积累大量经验。

我解开了一个著名的未解 cryptogram;我该怎么办?

在本书中,我们介绍了几十个尚未破解的 cryptogram。其中有些非常著名,比如 Voynich manuscript;另一些则还没受到太多关注,比如“香烟盒 cryptogram”。(这两个都能在第 5 章看到。)Elonka 的网站上提供了一份著名 cryptogram 的清单,13 而 Klaus 也在自己的博客上发布过他心目中的“最难未解 cryptogram 前五十”。14

几乎每一个热门的未解密文,都出现过大量可疑的“解法”。cryptogram 越有名,声称“我解开了”的人就越多。仅 Voynich manuscript 就至少发表过六十种“解法”。其他常见目标还包括剩下的两条 Zodiac Killer 密码、Dorabella cryptogram,以及 Kryptos 的第四段信息。(我们后面还会回到这些谜题。)互联网上到处都是对著名 cryptogram 的不靠谱“解法”。

如果你是一位认真的破译者,并且相信自己找到了一条未解 cryptogram 的答案,第一件事就是挑战你自己的解法:你能把方法描述得足够简单,让第三方也能照着做并得到同样结果吗?你发现的解密过程是否足够直接,不需要太多“微调”和“特例”?得到的明文是否在不进行几十处改动与牵强解释的情况下就有意义?最后,再读一读 Ryan Garlick 在 2014 年写的文章《How to Know That You Haven’t Solved the Zodiac-340 Cipher》。15(它讨论的是对第二条 Zodiac 密码的所谓解法,但其中大多数内容都可以推广到其他密码谜题。)

如果你的解法确实说得通,我们当然会非常有兴趣了解。如果你解开的 cryptogram 出现在 Elonka 的清单里,你甚至可以期待自己成为一位知名的破译者。

在你挑战破译界的“珠穆朗玛峰”之前,我们建议你先从已经被解开的 cryptogram 入手——本书里就有很多。接着,也许可以再去尝试那些不那么知名、但仍未破解的谜题。其中一些在研究圈里还没被充分关注,所以你的成功概率会更高。本书介绍的破译方法也许能帮助你取得突破。谁知道呢?也许有一天,你真的能征服世界上最著名的未解密码挑战之一!

破译需要哪些工具?

本书关注的是破解铅笔纸面密码,而不是现代基于计算机的加密。不过,这并不意味着我们在破译工作中不使用计算机。下面是本书中我们使用的三种最重要的计算机工具(都可以免费获得):

  • CrypTool 2cryptool.org)是一款由 Bernhard Esslinger 领衔的国际团队开发的密码学习程序。除其他功能外,它支持许多非常有用的破译工具。CrypTool 项目还提供密码学与密码分析的电子学习程序,例如 CrypTool 1、JCrypTool 和 CrypTool-Online。
  • 网站 dCodedcode.fr/en)由一个匿名的密码爱好者团体运营,提供大量有用的破译与统计工具。
  • Cipher Toolsrumkin.com/tools/ciphe…)是由 Tyler Akins 维护的一大套古典密码分析工具集合。

想找更多工具?请查看第 17 章中的“破译工具清单”。

我该如何加密我的文件和电子邮件?

请注意:本书涵盖的加密技术不应用于加密有价值的机密。本书讨论的是铅笔纸面(也就是手工)加密。虽然研究手工加密出于多种原因很有趣、也很重要,但用这种加密方式来保护敏感数据已经完全过时了。如果你需要给电脑文件加密的工具,请选择一个优秀的加密程序,例如开源的 VeraCrypt 或 Philip Zimmermann 著名的 PGP。这类程序使用现代加密算法,包括 AES、Diffie–Hellman 和 RSA,以今天的技术手段无法破解。

我对这本书有意见;我该怎么办?

如果你喜欢这本书、不喜欢这本书、发现了错误,或者只是想发表看法,请发邮件给我们:codebreaking.guide@gmail.com。你也可以查看勘误页 codebreaking-guide.com/errata,看看是否已经有人报告过这个错误。对我们来说,反馈极其重要。