苏晓禾的安全屋在城西边缘的一个老式小区里。
六楼,没有电梯。楼道里的声控灯坏了三分之二,剩下的三分之一发出一种濒死的黄色光晕,像是随时会熄灭。林朗拖着疲惫的身体爬上去,每一步都觉得脚踝在抗议——他已经连续十八个小时没有合眼了。
"到了。"苏晓禾从帆布包里掏出一把钥匙,插进锁孔,转动两圈,门开了。
房间不大,大概四十平米,一室一厅。墙壁是九十年代流行的淡绿色,已经斑驳得像是长了某种皮肤病。客厅里摆着一张折叠桌,两把塑料凳,以及一台老式的窗式空调,外壳发黄,滤网里积满了灰尘。
"条件不太好。"苏晓禾说,把帆布包放在桌上,"但这里用的是假身份证租的,他们查不到。"
林朗没说话。他环顾四周,目光扫过每一个角落——窗户、门锁、插座、灯罩。他的数据嗅觉不仅在数字上有效,在空间分析上同样有效:这个房间的窗户朝西,对面是一栋更老的居民楼,间距大概十五米,对面很难用长焦镜头监视;门锁是普通的十字锁,容易被技术开锁,但门缝里没有新划痕;插座只有一个,在靠近门口的墙上,如果要装窃听器,那里是最佳位置。
"从数据上看,"他说,"这里比602安全。"
"你带了什么设备?"苏晓禾问。
林朗把背包放在折叠桌上,从里面取出一个移动硬盘、一个U盘、一台备用笔记本电脑——这是他三年前的旧机器,联想的ThinkPad,硬盘只有256G,但足够用了。
"主力电脑留在602了。"他说,"那台机器已经被监控,不能再用了。"
"数据呢?"
"都在。"林朗拍了拍移动硬盘,"我每周做三次离线备份。"
他打开笔记本电脑,电源指示灯亮起,发出一种老旧机器特有的嗡嗡声。屏幕亮了,分辨率只有1366x768,图标很大,像是给老人用的。
林朗插入U盘,打开文件夹。里面有六个项目文件夹,分别标注着六个人的名字——他们前公司的六个"被优化"员工。
他点开第一个文件夹。里面是项目文档、代码仓库截图、以及一些邮件记录。他快速浏览了一遍,皱起眉头。
"怎么了?"苏晓禾问。
"数据是加密的。"林朗说,"代码仓库的导出文件用了AES-256加密,密钥分段存储在公司内部服务器上。"
"能破解吗?"
"理论上能,但需要时间。AES-256的暴力破解,用这台机器大概需要……"他算了一下,"大概需要四十七年。"
苏晓禾沉默了。
"但是,"林朗说,"我注意到一个模式。"
他打开第二个、第三个、第四个文件夹。每一个里面都有加密文件,但加密的方式不完全相同。
"前三个用的是同一种加密方案,后三个用的是另一种。"林朗说,"这说明什么?"
"说明什么?"
"说明这些加密不是统一的合规措施,是事后加的。"林朗的声音开始变快,这是他进入数据嗅觉模式时的特征,"如果是正常的商业保密,全公司应该用同一种方案。但这里有两种方案,而且……"
他点开一个文件属性,查看修改时间。
"加密时间。"他说,"前三个是在离职前一周加密的,后三个是在离职当天加密的。"
苏晓禾凑过来看。她的头发擦过林朗的肩膀,有一股淡淡的洗发水味道,像是某种廉价的茉莉花香。
"你是说,"她说,"他们是被针对性地加密封口?"
"从数据上看,是的。"林朗推了推眼镜,"而且加密方案的不同,说明执行封口的人不是同一批,或者不是同一时间收到指令。"
他站起来,走到窗前,把窗帘拉开一条缝。窗外是城西的夜景,稀疏的灯光,远处有一条铁路,偶尔有火车经过,汽笛声低沉而绵长。
"我需要做两件事。"他说,"第一,尝试用已知的密钥片段解密——前公司内部有一些默认的密钥模式,也许能碰对。第二,你通过你的人脉,获取这六家公司——不,是我们能查到的、所有与琅港相关的公司——的工商注册信息。"
"工商信息?"
"对。"林朗转过身,"如果项目数据被锁住了,我们就从资金流向找入口。资金不会说谎。"这是他在前公司学会的第一件事,也是最后一件事。
苏晓禾点点头,从帆布包里取出手机,开始拨打电话。
林朗坐回电脑前,把手指放在键盘上。
他的战场,从这一刻开始。
凌晨两点十七分。
林朗的手指在键盘上敲击了四个小时,指腹开始发热发黏。苏晓禾趴在折叠桌上睡着了,手机还握在手里,屏幕上显示着一个未发送完成的短信。
林朗没有叫醒她。他盯着屏幕上的进度条:97%。
他用的不是暴力破解,而是一种更聪明的方法——前公司的加密系统有一个设计缺陷:密钥派生函数使用了员工的工号作为盐值的一部分,而工号规则是公开的。林朗根据六个人的入职时间推算出可能的工号范围,然后用字典攻击配合已知的几个默认密钥前缀进行尝试。
进度条跳到100%。
"叮"的一声轻响,第一个文件解密成功了。
林朗的心跳加速了一拍。他打开文件,里面是项目代码的导出文档。他快速浏览,目光像雷达一样扫过每一行注释、每一个函数名、每一个API调用。
五分钟后,他找到了。
一个私有API接口的调用记录。地址是一串字母和斜杠组成的路径,指向琅港的数据接入端点。
LGK。琅港。
林朗的手指停在键盘上。他的后颈发凉,但这次不是因为恐惧——是因为兴奋。数据嗅觉正在发出一种他熟悉的警报:你找到了入口。
他立刻打开第二个文件夹,用同样的方法解密。十五分钟后,第二个文件也解开了。他搜索API调用记录——同一个地址。
第三个、第四个、第五个、第六个。
全部都有。
六个不同领域的项目——金融数据、物流算法、医疗影像、教育平台、供应链优化、智慧城市——表面上毫无关联,但都调用了同一个离岸服务器的API。
"不对,逻辑有问题。"林朗自言自语。
一个物流算法项目,为什么会调用数据分析API?一个教育平台,为什么需要向离岸服务器上传数据?
除非——
这些项目本身不是目的。它们是数据采集器。
林朗站起来,走到墙边,用手指在斑驳的绿色墙面上画了一个图。六个节点,一个中心节点。六条边,全部指向中心。
"星型结构。"他说。
苏晓禾被他的声音惊醒了。她抬起头,揉了揉眼睛,看向墙面。
"你画了什么?"
"数据流向图。"林朗说,"六个项目,都在向同一个服务器上传数据。那个服务器属于LGK Analytics,注册地在开曼群岛。"
"开曼群岛?"
"离岸金融中心。"林朗走回电脑前,打开浏览器,输入一个查询,"壳公司的天堂。"
他查了LGK Analytics的公开信息。结果很少,只有一个网页,上面写着"为全球企业提供商业智能解决方案",配了一张千篇一律的商务图片,一个穿西装的男人在握手。
"这种网站,"林朗说,"我一天能写三个。"
"那你现在能做什么?"
"我需要更多数据。"林朗说,"你能拿到工商信息吗?"
苏晓禾看了看手机。"我朋友明天早上给我回复。他能接触到工商系统的内部查询端口。"
"那我们现在睡觉。"林朗说,"明天打一场硬仗。"
他合上笔记本电脑,屏幕的光灭了,房间里只剩下窗外路灯透进来的一点昏黄。
苏晓禾躺在塑料凳拼成的临时床铺上,林朗坐在另一把塑料凳上,背靠墙壁。两个人都没有说话。
远处传来火车的汽笛声,低沉,悠长,像是某种古老的叹息。
第二天早上九点,苏晓禾的朋友发来了信息。
是一份压缩包,里面有六家公司的工商注册资料。苏晓禾把文件传输到林朗的电脑上,他立刻开始分析。
六家公司:
林朗盯着屏幕看了很久。
"你发现了什么?"苏晓禾问。
"命名模式。"林朗说,他的声音很轻,像是在数钞票,"周建国、李明亮、王兴国、张建华、赵卫国、孙利民。六个名字,六个爱国字眼。"
"这有什么奇怪的?"
"单独看没什么奇怪。"林朗打开一个空白文档,开始输入,"但如果我把它们放进一个图数据库,然后分析股权结构……"
他开始建模。每一家公司是一个节点,法人代表是一个节点,注册地址是一个节点。然后他加入第二层信息:股东信息、变更记录、关联企业。
三个小时过去了。
苏晓禾出门买了两个包子和两杯豆浆。林朗吃了三口包子,肉馅的油腻味和面皮的发酸味混合在一起——逃亡中的食物总是这样。他喝了一口豆浆,太甜了,像是用糖精冲的。
下午一点,图模型完成了。
林朗点击"生成关系图",屏幕上出现了一张复杂的网络。节点之间用不同颜色的线连接,红色代表股权关系,蓝色代表人员关联,绿色代表地址关联。
他调整了一下布局,让图变得更清晰。然后他用鼠标滚轮缩小视图,直到能看见整张图的全貌。
"我的天。"他说。
苏晓禾凑过来。她的眼睛在屏幕前瞪大了。
图的中心,是一个标着"LGK Holdings"的节点。它周围环绕着十几个子公司节点,每个子公司又连接着更多的孙公司。而外围的那些公司——包括南城商务中心那六家——像是一群卫星,通过多层嵌套持股,最终都指向中心的那个黑洞。
"这是……"苏晓禾的声音停了。
"这是壳公司网络。"林朗说,"像洋葱一样,一层包一层。"
他指着屏幕上的几条关键路径:
"南城咨询服务→南城管理咨询→明国控股→LGK China→LGK Holdings。五层。"
"明国企业管理→兴邦财务→建华信息→LGK China→LGK Holdings。四层。"
"每一家公司的注册资本都是10万,这符合壳公司的特征——刚好够注册,不产生实际经营。"
"但它们的作用是什么?"
"资金洗白。"林朗说,"信息隔离。法律防火墙。如果其中任何一家公司出事,只能追到那一层,再往上就需要跨司法管辖区调取信息——而从开曼群岛调取信息,大概需要十八个月到两年。"
苏晓禾沉默了。她看着屏幕上的那张网,像在看一个巨大的蜘蛛巢。
"从数据上看,"林朗说,"琅港资本通过这套网络,至少控制了南城商务中心里十二层楼的注册公司。而每一层楼,都是某个项目的掩护。"
他停顿了一下,然后补充:"包括我的前公司所在的那一层。"
苏晓禾转头看着他。她的眼睛里有某种东西在闪烁——不是恐惧,是愤怒。
"我们能做什么?"她问。
林朗没有立刻回答。他打开一个新的文档,开始打字。
"我要建立一个'遗书机制'。"他说。
"什么?"
"如果我们出事,"林朗的声音很平静,像是在写一份普通的项目文档,"这些证据会自动发送给三家媒体的举报邮箱,以及一个我信任的律师。"
苏晓禾看着他。她的目光里有某种复杂的情绪——是惊讶,还是别的什么?
"你信不过我?"她问。
"不是。"林朗停下打字,转头看她,"我信不过我自己。"
他推了推眼镜,"从数据上看,对手的技术能力至少比我高两个量级。他们能在我电脑里植入固件级监控,能在对面三楼架设长焦镜头,能让我们前公司的技术总监言听计从。如果我们被抓住,我不确定我能扛住多久不泄露信息。"
苏晓禾沉默了一会儿,然后说:"我录音了。"
"什么?"
"我刚才,把你说的话录下来了。"她从帆布包里掏出那支黑色的录音笔,"如果我们出事,这支笔里的内容也会一起发出去。"
林朗看着她。她的脸上没有任何表情,但眼睛里有一种他熟悉的东西——那是他在镜子里见过的东西:一种被逼到墙角后,反而冷静下来的决绝。
"好。"他说,"那我们现在是……背靠背了。"
苏晓禾笑了一下。那笑容很淡,但真实。
"背靠背。"她说。
下午三点,林朗在分析LGK Holdings的子公司名单时,注意到了一个名字。
"琅城纺织资产管理有限公司。"
他的手指停在鼠标上,光标在那行字上闪烁。
"怎么了?"苏晓禾问。
"这个名字……"林朗皱起眉头,"很熟悉。"
"你认识?"
"不,我不认识。"他说,"但我确定我在某个地方见过,或者听过。"
他的数据嗅觉在发出一种模糊的警报——不是明确的威胁,是一种"这里有东西"的直觉。就像在一堆数字里看到某个异常值,你暂时说不出哪里不对,但你的眼睛已经锁定了它。
"琅城纺织,"苏晓禾说,"是不是就是那个……三十年前改制的那家国企?"
"对。"林朗说,"我父母以前就是纺织厂的工人。"
他说完这句话,自己也愣了一下。他的父母确实是纺织厂工人,但那是在他出生之前的事。他从小在北城长大,对纺织厂没有记忆。为什么他会把这个名字和"熟悉"联系在一起?
"可能是小时候听父母提过。"他对自己说,也是在说给苏晓禾听。
"不对。"他摇摇头,"不是那种熟悉。是……数据层面的熟悉。"
他打开搜索引擎,输入"琅城纺织资产管理有限公司"。结果很少,只有一条工商信息记录,显示该公司成立于2002年,法人代表是董建国,注册资本5000万,经营范围是"资产管理和投资咨询"。
董建国。董晏清的父亲。
林朗盯着那个名字看了很久。他的数据嗅觉告诉他,这是一个关键节点。但他暂时无法把它和其他的拼图连接起来。
"你查过'老周'吗?"他问苏晓禾,"就是你之前提到的那个。"
"周正?"苏晓禾说,"查过。他是琅港资本的投资总监,董晏清的左膀右臂。右手无名指有戒指痕迹,据说离过婚。"
"周正……"林朗在心里默念这个名字。他在前公司的某次内部培训中,好像听过这个名字——那时候他还不知道琅港资本是什么,只记得有一个穿白衬衫的男人来公司做过"投资方代表"的讲座。
但那个讲座的内容,他完全想不起来了。
"从数据上看,"他说,"周正、周建国、琅城纺织、LGK Holdings——这些节点之间存在某种关联,但我现在的数据量不够,无法计算出具体的关联度。"
"那需要什么?"
"需要时间。"林朗说,"或者,需要一个新的数据源。"
他站起身,走到窗前。窗帘是拉上的,但他从缝隙里看向外面。对面楼的窗户里,有人在晾衣服,有人在看电视,有人在吵架。普通人的生活,普通得让他觉得陌生。
"我在想一件事。"他说。
"什么事?"
"对手为什么要监视我?"
"因为你查了不该查的东西。"
"但我是从什么时候开始查的?"林朗转过身,"三个月前,我只是在做一个普通的项目——物流数据优化。我不涉及任何敏感信息,不接触任何高层决策。那么,他们是从什么时候开始注意到我的?"
苏晓禾想了想,"也许……不是你注意到了他们,而是他们一直在找某个特定类型的人。"
"什么类型?"
"能看懂这些数据的人。"苏晓禾说,"你刚才解密了六个项目的数据,发现了LGK的API。这说明你的前公司在招聘时,可能就已经在筛选有数据分析能力的人——然后让你们做项目,采集数据,最后……"
"封口。"林朗接上了她的话。
房间里安静了很长时间。
"我们不只是受害者。"林朗说,"我们是工具。被用过了,然后被扔掉。"
苏晓禾没有回答。她走到他身边,两个人并肩站在窗前,看着对面楼里那些普通人的生活。
"从数据上看,"林朗说,声音很低,"我们的对手不是一个公司,是一套系统。而我们,只是这个系统里的两个故障点。"
"故障点可以变成漏洞。"苏晓禾说。
"漏洞?"
"系统最怕的不是外部攻击,是内部故障。"苏晓禾说,"如果我们能让自己变成足够大的故障……"
"整个系统就会崩溃。"林朗说。
他对她笑了一下。那是他今天第一次笑。
深夜十一点四十七分。
苏晓禾已经睡了,呼吸声很轻,像是怕打扰什么。林朗还在电脑前工作。他的眼睛发干,眼镜片上有几道指纹印,但他没有擦。
他在分析LGK Analytics服务器的访问日志。这些日志是他从一个泄露的备份文件中提取的——那是他在前公司时无意中下载的,当时以为是普通的技术文档,现在才明白那是什么。
日志条目很多,每天有几千条。他正在写一个过滤脚本,试图找出异常模式。
脚本跑完了。
结果跳出来。在成千上万条正常访问记录中,有十几条记录呈现出一种奇怪的模式:每隔72小时,有一个来自固定IP段的访问请求,查询的内容不是普通的数据分析接口,而是一个特殊的人口统计查询接口。
IP段:182.34.XX.XX。和监控他电脑的那个IP属于同一区域。
查询参数:姓氏="江",城市="琅城",关联标签="纺织厂职工后代"。
林朗盯着屏幕,心跳开始加速。
有人在找一个人。一个姓江的人。这个人,和琅城纺织厂有某种关联。
他不知道这个"江"是谁。他的数据嗅觉无法从这一个姓氏中推断出更多信息。
但他知道一件事:这个查询请求来自对手的网络内部,而且对手正在找这个人。这说明对手内部也存在某种不确定因素——有人在找一个他们还没有控制的人。
"找到你,"林朗低声说,"也许就能找到系统的漏洞。"
他抬起头,看向窗外。城西的夜空比南城亮一些,星星多一些。远处的那条铁路上,又有一列火车正在经过,汽笛声低沉而绵长。
林朗站起来,走到苏晓禾身边,轻轻拍了拍她的肩膀。
她醒了,睁开眼睛,目光里有短暂的迷茫,然后迅速清醒。
"怎么了?"她问。
"我发现了一件事。"林朗说。
"什么事?"
"有人在找一个人。"林朗的声音很轻,"我不知道这个人是谁,但我知道,对手也在找他。而且,从查询模式来看,他们还没有找到。"
苏晓禾坐起来,揉了揉眼睛。
"这意味着什么?"
林朗看着她的眼睛。
"这意味着,"他说,"在这个城市里,有一个人,和我们一样,在对手的网里。他可能是一个潜在的盟友。也可能是……另一个故障点。"
苏晓禾沉默了。她看着窗外的夜色,很久。
"那我们怎么办?"她问。
"找到他。"林朗说,"在他被对手找到之前。"
他走回电脑前,屏幕上还显示着那个查询记录。姓氏"江",城市"琅城",标签"纺织厂职工后代"。
林朗不知道这个"江"是谁。
但他知道,从今晚开始,他的数据分析不再只是为了自保。
他在找一个人。一个可能和他一样,拿着火把的人。
而在黑暗中点灯的人,最容易被烧死。