第二十五章
约翰·马里斯的实验室门是敞开着的,可是阿舍还是敲了敲门。
“进来,”密码学家说。
马里斯的实验室是研究站上最整洁的,屋子里看不到一星半点的灰尘。除了一个角落里小心翼翼叠放着的半打手册,他的办公桌上只有一个键盘和一台平板显示器终端。室内没有照片,没有海报,也没有其他任何个人纪念品。可在阿舍的眼里,这才是典型的马里斯:腼腆,内向,在个人生活和对事物的看法上几乎都深藏不露;全身心地沉浸在自己的工作中。对一个密码学家来说,这些都是理想的素质。
遗憾的是,此时此刻,他的当前工作——这么一段简短而且似乎很简单的代码——原来却是如此难以捉摸。
阿舍关上房门,在唯一一把来客坐的椅子里坐了下来。“我收到了你的信,”他说,“暴力破解有希望吗?”
马里斯摇了摇头。
“随机字节过滤呢?”
“意思无法理解。”
“我明白了。”阿舍灰心地陷进了椅子里。在他收到马里斯要他尽早过来一下的邮件时,他心里一阵激动,以为他已经破解出了那段代码。“尽早”这个词从安之若素的马里斯那里发出来,实际上是大声请求马上商量事情。“那么,它是个啥?”
马里斯看了他一眼,又把目光转了开去,“我不知道我们是不是,也许,正从一个错误的角度去破解这些代码。”
阿舍皱起了眉头,“什么意思?”
“是这样。昨天晚上我正在读一本有关阿兰·图灵生平的书。”
阿舍对此一点也不感到惊奇。作为一名追求完美的学者,马里斯正在致力于第二个博士学位:计算史上的重要时刻——阿兰·图灵是早期计算机理论的开创者,“说下去。”
“嗯……你知道图灵机吗?”
“你帮我重温一下吧。”
“1930年代,阿兰·图灵提出了一个理论上的计算机设想,这就是著名的图灵机。它由一条其长度可以无限延伸的‘带子’所组成。‘带子’上有一些用有限字母系统书写的符号。一个基于某种查询表的‘读取头’从‘带子’上走过,读出‘带子’上的符号并释出其含义。根据读取的不同符号,‘读取头’的状态能够变化。‘带子’上储存的既可以是数据,也可以是‘转换方法’,也就是他意谓的一些小程序。在今天的计算机中,‘带子’就是存储器,而‘读取头’就是微处理器。图灵声称这种理论上的计算机可以解决任何计算问题。”
“说下去,”阿舍说。
“我开始思考我们试图破解的这段代码。”马里斯用手指着计算机屏幕,上面显示的那个“守护神”发射的光脉冲信号,几乎像是在以它的简短和暧昧嘲弄着他们:
0000011111001010110101011001110111000101
0110001100010100011010011000010000000000
“我在想:如果这是一条图灵‘带子’呢?”马里斯继续说道,“如果我们让这些0和1从一台图灵机上通过,它们又会怎么样呢?”
慢慢地,阿舍坐着的身子朝前倾了过来。“你是说这80位代码……是一段计算机程序?”
“我知道这听起来有点疯狂,先生——”
还有什么疯狂能比得上我们身处这里这一事实本身呢,阿舍心想。“请接着说。”
“好吧。首先,我必须把这些0和1字符串分解成一个个单独的命令。我假定开头的5个0和5个1,是用来表示每条指令长度的占位符——也即由数字组成的每一个‘词’的长度是5位。于是我们就得到了14条5位长的指令。”马里斯敲了一个键,屏幕上长长的数字串消失了,取而代之的是按顺序排列的一行行数字:
00101
01101
01011
00111
01110
00101
01100
01100
01010
00110
10011
00001
00000
00000
阿舍注视着屏幕,“作为一个计算机程序它真是太短了。”
“是的。显然,它应该是一个非常简单的计算机程序。而机器语言就是数字语言的最基本也最普遍的形式。”
阿舍点点头,“然后呢?”
“等今天早晨我到了办公室,我就写了一个小程序,把这些数值跟标准的机器语言指令序列进行比较。这个小程序把所有可能的指令一个个地分派到这些数值上,再检查是否能从中得出一个可以运行的计算机程序。”
“是什么使你觉得这些信息——不管这信息是什么人发给我们的,它使用的也是跟我们一样的机器语言指令?”
“基于二进制,先生,对任何可以想象到的计算装置,存在某种不可再缩小的通用数字指令集:加,减,转移,若为0则跳过,还有布尔逻辑。所以我让这个小程序运行,并继续做我的其他工作。”
阿舍点点头。
“大约20分钟以前,这个小程序运行结束了。”
“这14行二进制数字被转译出任何可行的计算机程序了吗?”
“是的。得到了一个。”
阿舍觉得自己的兴致突然飙升起来。“真的?”
“是一个简单的数学表达式程序。就是这个。”马里斯敲了另一个键,一系列指令出现在了他的显示器屏幕上。
阿舍急切地弓腰凑了上去。
指令/助记符注释
00101ADD/将地址13(10进制数)的内容取出放入累加器中
0110101101/建立起一个标志
01011CNM/将标志值取反
00111PLC/把结果值放入地址14
0111001110/
00101ADD/对地址12的内容作减法运算
0110001100/
01100ISZ/将标志值加1,如果值为0则转移
01010JMP/返回到第6步重复执行
0011000110/
10011END/程序结束
00001/地址12
00000/地址13
00000/地址14
“这程序是干什么的?”阿舍问。
“你会注意到它的代码在一个循环中做了一系列的重复减法运算。在机器语言里,这种方式就是在做除法:通过重复做减法来实现。哦,这只是一种方法——你也可以通过做算术右移来实现——但那样一来你就得需要一套更专业化的计算系统。”
“这么说它就是一条除法语句?”
马里斯点点头。
阿舍感到自己在惊讶和困惑之中还夹杂着突如其来的极度兴奋,“别吞吞吐吐的了,老弟。他们除的是个什么数字?”
“1。”
“1。那它又被什么数字来除?”
马里斯舔了舔嘴唇,“哦,你瞧,问题就在这里,先生……”