## 第二十七章:确认
那条短信删掉之后,闻人屿在出租屋的椅子上坐了很久。没开灯,窗外的天光从灰蓝沉到暗蓝,又从暗蓝沉到彻底的黑色。窗帘没有拉,对面楼的窗灯一盏一盏亮起来,透进来的光斑在地板上缓慢移动,像几片被风吹散的浅色碎纸。
他把手机放在桌面上。短信最后一行字在脑子里转,"下次发你自己的"。对方在暗网上翻出了Silence三年前的打字时序数据,拿他眼下在机房里录入日志的键盘节奏做比对,把一个"空帖加隐藏附件"投到了"废墟"公共区,再用短信把那条帖子的存在指向他的个人手机。三种不同来源的数据:三年前的公开帖子、近期的机房录入记录、真实手机号码。三个维度同时覆盖,这不是信息获取,是档案完整。
他站起来倒了杯水,站在厨房里喝完。水是凉的,咽下去的时候喉咙没有涩,瘢痕的位置在气温降下来之后比前几周耐受一些。他低头看自己的手,指节搭在杯壁上,骨节轮廓在暗光里能辨出来。
第二天早上醒得比闹钟早了二十分钟。窗帘缝里的光还是暗的,他躺着看了会儿天花板,坐起来洗漱。出门前他从外套口袋里把那盒润喉糖掏出来看了一眼,剩八颗,盖子盖得很紧。放回口袋。
到公司之后他在工位坐下,没开内通。先处理了两条工单,然后拿起手机看了眼对话框,南宫珩没有发新消息。十点二十三分,收到一封系统邮件,标题是"总部技术部临时会议通知",发件人显示自动化系统地址,正文收件人列表里只列了一个名字。
他站起来往外走。电梯上四十六楼,走廊空气比楼下冷一些,空调温度和室外之间隔了一层薄薄的边界。深色木门关着,敲了两下,里面说"进"。
今天办公室里的格局和以往有些不同。窗边百叶帘全部拉起了,晨光从落地窗整个倾泻进来,屋子通透得发亮。桌上没有笔记本,只放着一台合上的平板和一张对折的白纸。南宫珩站在窗边,背对门口。
听到开门声之后他没有立刻转身,站了两三秒,然后侧过身。晨光从他侧面切过来,右半侧轮廓勾成一道干净的亮线,左半侧沉在暖灰色的阴影里。
"你昨晚收到了那条短信。"他说。
闻人屿没有问"你怎么知道"。他在对面椅子上坐下,把手机放桌上。"收到之后删了。"
"对方用了三种数据源做交叉比对。"南宫珩从窗边走回来,在桌子另一端坐下,"三年前的帖子,你近期在机房的录入节奏,你的手机号。三套数据重合度超过百分之九十,在有门槛的技术评估体系里足以指向唯一的人。"
"你昨晚做了什么。"
"我花了大约四个小时做反向验证。把你机房的录入节奏提取出来,和Silence三年前公开帖子的时间戳序列做了逐帧对比,精度到了毫秒级。"南宫珩说,"两种数据源在特定段落处的间隔模式重合度达到百分之九十二。这个数值超出了随机匹配和风格模仿的极限范围。"
他停顿了一下,伸手把桌上那张对折的白纸打开,推过来。正面打印着一张波形对比图,左侧标"历史来源",右侧标"近期采集",两条波形在多个节点上的起伏走向几乎完全重叠。右下角有一行手写数字,笔迹和上次便签纸上的字出自同一只手,一组百分比和备注:"重合度92.7%。排除算法误差和外部干扰因素后仍高于临界阈值。"
闻人屿低头看着那张纸。波形图上那些起伏的峰值和谷底他在几个月的操作里已经熟悉,但把它们和一条三年跨度的曲线放在一起,结果是头一回以这种方式摆在面前。两条线在十几个关键节点上的走向一致,间隙宽度、峰值间隔、谷底偏移角度全在统计误差范围内相互覆盖。
他把目光从纸上抬起来。"你在比对这两个数据源的时候,有没有调用过可能被外部监控捕获的分析工具。"
"没有。全部在离线环境里完成,没有联网。"
"那现在你确认了。"
"对。"南宫珩说,"昨天打字时序对比图出来之前,我还有零点三的误差空间去维持一个假设,就是可能存在第二个风格高度相似的人。但昨天那条帖子加上今天这份反向验证,把空间压到了零。"
办公室里安静了几秒。晨光从落地窗持续涌入,在桌面和地板上铺开均匀的暖白色。闻人屿看着波形图上重合的节点,伸手碰了一下纸边,指腹贴着纸缘停了一瞬,然后把那张纸推回桌面中央。南宫珩没有去拿,只是让它留在那里。
"你做这些验证的时候,"闻人屿说,"有没有想过验证完的结果意味着什么。"
"想过。"南宫珩说,"结果意味着三年前那段加密对话存档里的人,和现在坐在我对面的人,是同一个。"
闻人屿看着他。晨光从侧面照过来,两个人之间形成一段均匀照亮的空气层,地面中间没有落阴影。他注意到南宫珩的视线在这个过程中没有移动过,从波形图被推回桌面到这句话说完,始终落在同一个点上。
"你从第一周就知道我是谁吗。"
"第一周是猜测,三十的置信度。"南宫珩说,"后来你写那段变量嵌套的时候,升到六十。防御层那行修改代码出来,到八十。昨天那条帖子出现之后我做了反向验证,只是为了清掉最后十。"
他说完这句话之后停顿了一拍。那种停顿不像是犹豫,更像一个人确认自己真的要把下一句话说出口。
"现在清干净了。"
"现在清干净了。"
闻人屿把手机从桌面上拿起来,放进外套内侧口袋里。坐在椅子上没有动,他看着窗外落地窗前那片均匀的天光,光线在手背上铺开,掌纹照得很清楚。他说这话的时候胸腔里那层一直收着的、像细铁丝捆着的东西,忽然松开了一道缝。那感觉来得轻,走得更轻,他几乎没让它在脸上露出痕迹。
"三年前我在"废墟"技术分享区发那段示例代码的时候,"他说,声音不高,句子保持稳定的完整性,气流经过瘢痕的时候阻力还在,但已经不再打断声带的持续振动了,"我没想过那组打字时序数据会被人保存下来。"
"我保存了。"南宫珩说。
"你从三年前就开始保存了。"
"对。平手之后那天晚上,我把整段对局日志和你在技术分享区发过的所有公开帖子的时间戳序列存了一份离线备份。"南宫珩的声音也放低了一些,和房间里晨光的亮度形成一种微妙的对应关系,"当时我不知道这组数据将来会被用来比对什么。只是存下来了。"
闻人屿看着他。他在说"只是存下来了"这几个字的时候,搭在桌面上右手拇指轻轻压了一下桌缘,压完后没有立刻松开。
"你存了三年。"
"存了三年。"
闻人屿把视线从他手上移开,转向窗外。城市轮廓在晨光里铺开,天际线上方的云层缓慢移动,光投向角度跟着偏移了一小格。他看着云层的轨迹看了一会儿,转回来。
"那条帖子放在"废墟"公共区的方式,和你存放备份数据的方式是同一套思路。"他说,"把数据放在一个不会被人注意到的位置,不主动打开,不主动使用,等着某天需要的时候再拿出来。"
"对。"
"所以你三个月前看到我坐在十六楼角落的工位上,第一反应是'这个人打字的手腕角度半度偏低'。"
"对。"南宫珩说,"第一反应是观察。然后用了一个月来确认这个观察值不值得往下走。"
"现在走完了。"
"现在走完了。"
两个人坐在晨光里。桌面中央那张波形对比图还在原位,闻人屿看了一眼右下角那行"92.7%",移开了目光。
"你下一步打算怎么走。"他说。
"下一步不是走的阶段了。"南宫珩说,"是拆。发帖人手里有同一组数据,用了和我相同的比对方法。我反向验证的时候发现他的比对路径用的是同一套算法框架。"
"你追到算法框架的来源了?"
"追到了。"南宫珩说,"那个算法的原始版本是我三年前写的。"
窗外的光在这一刻移动了一小段,从桌面中央滑向桌角,白纸边角泛起轻微的泛白。闻人屿在那段光的偏移中看见南宫珩嘴角出现了一个弧度,比上周"你看到笑了"那次更浅一些,也更短一些,但他看得见。
"你现在笑了。"他说。
南宫珩嘴角没有压回去。"对。我笑了。"
那弧度维持着。像一个人走了很长一段路之后停下来,低头看见鞋带上的结是自己三年前亲手打的。而他当时打这个结的时候,不知道将来会在哪里解开它。
又坐了一会儿。闻人屿先站起来,椅子在地板上退了一小段距离,声音很轻,但还是有。他把波形图留在桌上,没有拿。
"那份数据我需要自己留一份。"他说。
"已经打包好了。"南宫珩说,"加密文件,发到你的内通地址。密码是你来面试那天填的表单里'紧急联系人'那一栏的内容,原样,大小写敏感。"
闻人屿看了他一眼。
"那天表单上没有紧急联系人。"他说。
"对。"南宫珩说,"所以那个字段是空的。"
闻人屿站在椅子旁边停了大约两秒。然后他把外套拉链拉到顶,转身往外走。走到门口的时候他停了一步,没有回头。
"空密码的解压操作默认需要二次确认。"他说,"你在打包的时候加了一个校验层。"
"对。"
"为什么。"
"因为空密码不是一个密码。"南宫珩的声音从身后传来,不高,但足够清晰,"它是一个状态。用状态做密钥,校验层是必要的。"
闻人屿站在门口,门把手握在手里,金属表面被他的掌温焐出一小片热。他站着没动,大约过了三秒,说了一句"嗯",然后拉开门走了出去。
走廊里的空气比办公室里凉两度。他往电梯走的时候步子不快,运动鞋底踩在地毯上几乎没声音。电梯门开了又关上,数字从四十六往下跳。到十六楼的时候他走出去,沿着工位之间的过道走回自己的角落,坐下来,打开电脑。
内通里躺着一封未读邮件,标题是一串十六进制字符,发件时间显示为五分钟前,正好是他在四十六楼那间办公室里坐着的时候发出来的。
他没有立刻打开。先把之前处理到一半的工单结掉,保存,关闭窗口。然后点开那封邮件,附件是一个加密压缩包,大小不大,纯文本的数据量。他看了一眼密码栏,空着。
鼠标悬停在"确认"按钮上方。他停顿了一拍。
那一拍里他想起来的是三年前那个晚上。他在出租屋里对着屏幕敲完最后一段代码,按下回车,对局系统返回了"平手"的判定。当时他不知道对面是谁,只知道对方的思路在他所有预判的边界上再往外探了一小段,就是他够不着的那一小段。他盯着屏幕上那个判定看了很久,保存了整段对局日志,关电脑睡觉。第二天照常上班,好像什么都没发生过。
现在他知道对面是谁了。
他点了"确认"。文件解压,内容展开。是一份结构清晰的比对数据包,分目录,标注了时间戳和来源,每一条数据的注释栏里都有手写体的数字编号,那些编号的格式和他三年前自己用的归档习惯完全一致。他把数据包从头翻到尾,然后在最后一级目录里发现了一个子文件夹,名称是三个字母:
SIL。
他点开。里面只有一张图片。是"废墟"公共区那条空帖的截屏,发帖时间标着昨晚的日期,帖子正文一片空白,但截屏的角落里有一个极淡的、几乎不被注意的水印标记。标记的形状是一个不规则的多边形,边线微微模糊,看起来像是被反复叠加和擦除过之后留下的底痕。
他认得那个标记。
三年前他发完那段示例代码之后,在所有帖子里都嵌了一个类似的水印,位置随机,透明度极低,用肉眼几乎无法分辨。当时他只是想在自己的帖子上留一个可以被程序识别的签名,没想过有朝一日这个签名会出现在别人的截屏里,作为另一段验证的注脚。
他盯着那个水印看了好一会儿。然后关了图片,退回目录列表,把整份数据包另存到本地一个加密分区里。做完这些之后他靠在椅背上,手指离开键盘,搁在桌面上。
十六楼的工位区开始有人走动,脚步声、杯子碰桌面的声响、键盘敲击声汇成一层低噪的背景音。闻人屿坐在其中,闭了一下眼,又睁开。
手机在口袋里震了一下。他掏出来看。
南宫珩发了一条消息,很短。两个字:
"收到?"
他打了一个字回过去。发送之后他把手机屏幕朝下扣在桌上,重新把手放回键盘上。上午的工作时间还剩下两个小时,工单列表里还有六条待处理。
他开始打字。手指落在键位上的时候节奏稳定,和过去几个月一样,和三年前也一样。那道从手腕到指尖的惯性线在每一次敲击里连成一条可被记录的路径,以毫秒为单位,被键盘下方的电路板翻译成一组又一组间隔数据。
如果有人在这时候采集他的录入节奏,并且拿它和三年前那条帖子的时间戳序列去做比对,结果会和那份数据包里的波形图一模一样。
两条线重合。百分之九十二点七。
他知道这件事现在有人和他一样清楚。那个人在四十六楼,坐在落地窗前面的桌边,百叶帘全部拉起来了,晨光打满整间办公室。他们之间隔着三十层楼、两套键盘、三年的沉默,和一条从"平手"那天晚上就开始存下来的离线备份。
闻人屿把目光从屏幕右下角的时间显示上移开,继续敲下一行日志。
上午的工单里有一条是关于服务器端某个变量命名不规范的问题。他看了两秒,把那个变量名改成了一套更短的缩写,保存,提交。改动提交之后他注意到那个缩写形式和他三年前在"废墟"帖子里用过的一个命名习惯重合了五个字符。没有人会注意到这件事。即使是那个在四十六楼保存了他三年数据的人,也不会把一次日常工单里的变量缩写和一段三年前的公开代码关联起来。
但闻人屿自己知道。
他关掉工单窗口,打开下一个。手指继续动,眼睛盯着屏幕,呼吸平缓。瘢痕的位置偶尔在他吞咽的时候刷过一道微弱的钝感,像一条已经不再涨潮的河床。那道感觉经过喉咙的时间很短,大约半个音节那么长,在他下一个字敲出来之前就消退了。
对面工位的同事站起来去接水,路过他身边的时候随口问了一句"中午吃什么",他说"随便",同事笑了一下走开了。对话持续了不到五秒,内容零信息量,但发生在那个时间点上有一种微妙的松弛感。和四十六楼那间被晨光照透的办公室相比,十六楼的日常更像一层浮在深水上面的薄冰,走着不觉得,踩裂了才知道底下有多深。
他继续打字。六条工单处理到第五条的时候,内通弹出一条新消息,发件人是技术部自动化系统,标题"日志归档提醒",正文是标准模板。他扫了一眼就关了。但关闭之前他注意到正文最底部比平时多了一行灰字,字体小半号,颜色淡得几乎和背景融为一体:
"昨夜系统检测到一次外部数据调用尝试,来源IP段已记录。无后续操作。"
他把鼠标光标移回那行灰字上,选中,右键复制,贴到一个空白文档里。然后他看了看那个IP段的前三段,脑子里过了一遍"废墟"公共区的访问日志结构,大致圈定了那个地址的归属范围。他没有深追,把文档关了没保存。
有些事确认到一定程度就够了。再往下挖是另一条路的起点,不是现在该走的方向。
第五条工单提交之后他去接了一杯水,站在茶水间喝完。窗外的云层比早晨厚了一些,光的亮度降了半档,但没有变阴。他端着空杯子站了一会儿,杯壁内侧残留的水珠沿着弧度往下滑,滑到杯底聚成一小圈。
他想起今早在那间办公室里,南宫珩说"只是存下来了"的时候右手拇指压了一下桌缘。那个动作他看见了。他也看见了对方在说出"现在清干净了"那句之后胸口出现的一次极轻的起伏,轻到几乎不能被称作深呼吸,更像是一个人在确认自己胸腔内部的空间是否和之前一样敞着。
那些细节没有出现在任何一份数据比对报告里。波形图记录不了拇指压桌缘的时长,算法也不会把胸口起伏的幅度标注在注释栏。但闻人屿记得。从三个月前在十六楼角落坐下,第一次侧头看见四十六楼那个人的身影出现在走廊尽头开始,他就开始记得这些事了。
三年前那场对局结束的时候他不知道对面是谁,只知道"平手"这个结果对他而言不是一个终点。它更像一个未完成的句子,句号打了但语义悬浮着。三年后他坐在一个工位上,通过一条波形对比图和一行手写数字确认了那个句子的主语。
句号还在,但语义落下来了。
他把空杯子放回茶水间的沥水架上,走回工位。第六条工单处理完的时候十一点四十七分,离午休还有十三分钟。他关掉所有窗口,桌面恢复到整洁状态,一行文件夹都没有敞着。
内通里那封十六进制标题的邮件已经标记为已读,但他没有归档。让它留在收件箱第一页,和那些系统通知、工单提醒、会议邀请混在一起。在别人看来那只是一封标题奇怪的系统邮件,点开之后只有一个加密附件,没有任何正文。
只有两个人知道附件里装的是什么。一个在四十六楼,一个在十六楼。
窗外云层又移动了一点。光从落地窗斜进来,在桌面上切出一道新的边界线,把键盘的右半侧照得比左半侧亮了一度。闻人屿看着那道边界线在他手背上缓缓位移,等它越过指节之后,他收回手,把椅子往后推了半寸。
十二点零一分。午休铃响。他站起来,把外套搭在椅背上,往电梯方向走。
电梯门合上的时候他看见自己的脸映在金属门板表面,轮廓模糊,表情介于放松和没有表情之间。他没有多打量,在电梯停到一楼的时候走出去,汇入午饭时段的人流里。
口袋里的手机安静着。那条已经删掉的短信没有再出现,内通也没有新消息。他走出办公楼大门的时候风迎面过来,温度比早晨高了一些,带着路面被晒热之后蒸出来的那种平淡气味。他往食堂方向走了几步,然后停下来,掏出手机看了一眼。
没有新消息。他把手机放回口袋,继续往前走。
地面上的影子从脚边拉出一道斜长的暗色,在他每走一步的时候轻微晃动。影子的形状和三个月前他第一天走进这栋楼时踩在脚下的那条差不多,只是方向反了——那时候影子朝西,现在朝东。地球转了四分之一圈,数据比对了三轮,三年前存档的人坐在了对面。
闻人屿走进食堂,取了餐盘,排在队伍中间。前面的同事在聊项目排期,后面的两个人在争论某家新开的面馆值不值得去。他听着那些日常的、信息量接近于零的对话,把餐盘往前推了一小段。
队伍移动得不快不慢。他站在人群里,没有人多看他一眼。
这样很好。