奇门编译
主角林拯江诚小说奇门编译是一本非常好看的悬疑灵异文,它的作者是极夜向阳。江诚把车停在零一科技大厦东侧三百米的一条断头路上。引擎熄火后他没有立刻下车,而是把手机放在方向盘上,屏幕朝上。小王发来的文件包有十七兆,解压之后是三个文件夹,分别对应三位死者的冥河对话记录。周明远。何...
01精彩节选
江诚把车停在零一科技大厦东侧三百米的一条断头路上。
引擎熄火后他没有立刻下车,而是把手机放在方向盘上,屏幕朝上。小王发来的文件包有十七兆,解压之后是三个文件夹,分别对应三位死者的冥河对话记录。周明远。何丽萍。第三个是新整理的——临市公安局从何丽萍手机里提取到的缓存数据,和之前老马发的那个版本相比多了七条交互记录,都是何丽萍在深夜反复打开同一个对话、输入又删除的内容。
他先点开周明远的。文件格式是标准JSON导出,时间戳、角色、内容,按行排列。最后一条AI回复长度大约三百字,就是那段关于内脏温度和水面距离的描述。他往下翻到文件末端。
光标停在一个空行上。
空行不是空的。
他选中那一行,复制,粘贴到记事本里。记事本显示光标向右跳了一下,但没有出现任何字符。他又试了一次,这次按住Ctrl然后滚动鼠标滚轮把字号放大到百分之三百。屏幕上的光标位置有一道极其微弱的偏移,像某种视觉残影,但依旧没有任何符号。
江诚拿起另外一部手机——这是他从技术科借来的测试机,装了十六进制查看器。他把那段空白字符串从电脑上通过内网消息发给测试机,然后用十六进制打开。
屏幕上的十六进制数值排列得密密麻麻。在正常的UTF-8字符编码之后,紧跟着一连串字节:E2 80 8C E2 80 8D E2 80 8E。他往下翻。同样的组合重复了二十四次。接下来是一段新的序列,编码不同,长度更长。十六进制查看器在右侧的ASCII解读栏里什么也没显示——这些字节不对应任何可打印字符。
他又打开何丽萍的文件。同样的位置,同样的空行。但这次的字节序列和周明远的不同。第一段重复的零宽字符组合之后,跟着的编码结构完全不一样:E2 80 8C重复八次,然后是一个更长的序列,其中包含一段他认不出的组合——E2 98 B2。
他把这个组合单独复制出来,在手机上打开一个Unicode查询页面。
E2 98 B2。
页面加载出来,显示一个黑色的小方块,下方标注:U+2632,天文学符号,月亮的月牙。
江诚把第三个文件也打开。这次的空行里,同样的位置,同样的结构,但那个符号又变了——E2 98 AF,U+262F,阴阳符号。
他把三部测试机并排放在副驾驶座上,屏幕都亮着。三个十六进制页面,三段不可见的字符序列,三个不同的符号。凌晨的街道很安静,只有远处偶尔传来的垃圾车压缩声。他盯着那三部手机的屏幕看了大概两分钟,然后把它们全部关掉,发动引擎,开往市局技术科。
技术科的灯还亮着。小王坐在三台显示器前面,桌上摊着两个吃了一半的肉夹馍,油纸已经被浸透了。他看到江诚进来,把椅子往后一滑,手指还搁在键盘上。
“江哥,你让我查的那个——”小王指了指中间那块屏幕,“零一科技的涉密备案编号,我查到了一点东西。这家公司是去年四月份拿到的涉密信息系统集成资质,甲级,安防监控方向。但他们的备案材料里有一个条目被标注了‘另行报备’。”
“什么叫‘另行报备’?”
“就是说这个条目存在,但不在同一份材料里公开。通常只有涉及国家秘密或者核心商业机密的才会这么处理。”小王转过身,把另一份文件从打印机上拿过来,“我往深里挖了一层,发现那个条目的编号序列属于古籍数字化保护工程。这是个国家级,牵头单位是国家图书馆,分包给五家公司做不同朝代的文献数字化。零一科技拿的是‘术数类古籍’这个子包。”
“术数?”
“就是奇门遁甲、六壬、太乙那类。”小王推了推眼镜,“古人不叫迷信,叫‘术数’。现代学术分类里归在‘古代自然科学史’下面。”
江诚把自己的手机放在桌上,屏幕上是那段空白的对话记录。“我这边也有东西要你帮忙看。三份冥河对话记录,每一条AI回复末尾都有一段看不见的字符。我试了十六进制查看,里面藏着Unicode符号。”
小王的眉毛抬了一下。他把肉夹馍推到一边,接过手机,用数据线连上自己的工作站。他的工作方式是两只手同时作,左手在左边的键盘上切窗口,右手握着鼠标点选工具栏。三十秒,他把周明远文件的十六进制数据完整展开在正中间的三十二寸显示器上。
他看了一会儿。
“零宽字符。”小王说。
“什么?”
“零宽字符。Unicode标准里有一类字符,本身不占显示宽度,普通人用肉眼看不见,但程序能读到。”他把光标移到那串十六进制数值上,一段一段地圈出来,“这三个是零宽空格、零宽非连接符、零宽连接符。它们在正常文本里不显示,但如果你把它们按特定顺序排列——”
他敲了几个键。显示器上的十六进制数据被自动转换成一串看得见的标记,每一个零宽字符都被替换成了对应的缩写:ZWSP、ZWNJ、ZWJ。这些缩写按照原始的排列顺序在屏幕上展开,像一串极长的莫尔斯电码。
“这是二进制编码。”小王说,“用两种零宽字符分别代表0和1,就可以把任意信息藏进一段看起来空白的文本里。但这还不是全部。”
他把何丽萍的对话页也拖进来,切换成十六进制模式。同样的位置,同样的空白行,同样的编码结构。“不一样的地方在这里。”小王用鼠标圈住一段字节序列,“在二进制编码之后,这一段不是零宽字符。这是完整的Unicode符号——E2 98 B2,月牙符号。你这个文件,还有另一个死者的文件,每段隐藏文本的末尾都有一个不同的符号。”
他把三份文件全部展开,并排显示在屏幕上。
周明远:末尾符号是“月牙”。何丽萍:末尾符号是“阴阳”。第三个死者:末尾符号是一个六芒星形状的图案,U+2721。
小王把椅子往后滑了半米,双手抱在前,看着屏幕上的三组数据。“这些零宽字符构成的信息,和AI的回复正文一起被发送给用户。用户的聊天客户端、浏览器、手机App——全部都不显示这些字符,因为它们宽度为零。但如果有人写了一个专门抓取零宽字符的脚本,就可以把这些隐藏信息从对话记录里提取出来。”
“能提取出什么?”
“要看编码规则。用零宽字符藏文本,常见的手法是把‘零宽空格’当作0,把‘零宽非连接符’当作1,然后按每八位一组拼成字节,再把字节转成ASCII或者UTF-8。”小王敲了十几个键,调出一个他自己写的解析脚本,“我试一下。”
脚本运行的进度条在屏幕下方一闪而过。解码结果出现在一个新建的文本框里。第一行是空的。第二行开始出现文字——不,不是文字,是单个汉字,每个字之间隔着一个空格。
“坎 离 艮 兑 坤 乾 巽 震”。
八个字。
小王继续往下翻。这八个字的后面还有第二组:“休 生 伤 杜 景 死 惊 开”。
然后是第三组,只有四个字:“甲 丙 庚 壬”。
江诚盯着屏幕。这些字他认识,但组合在一起的含义他不懂。不过有一个字他认出那个字——在解码出来的第二组文字里,“死”就排在“景”和“惊”之间。
“这些符号——”小王指着末尾的那个月牙,“不是编码,是结束标记。就像电报里那个‘报完’,表示一段隐藏指令的结尾。而中间的这些字,是某种标识符,用来告诉接收方这段隐藏信息属于哪个类别、哪个层级。”
“接收方是谁?”
小王摇摇头。“理论上任何装了对应脚本的人都能读。但如果这是一条指令——那接收方就不是人。”
“你是说AI?”
“这些零宽字符是AI回复的一部分。”小王把三份对话页的时间戳对齐,在屏幕上排成三列,“AI每次回复都带了一段不可见的编码,附带一个分类符号和一个指令标记。这意味着什么?意味着有人在冥河模型的输出端植入了一个后门。每次AI和用户对话,后门就自动在回复末尾附加一段隐藏指令。正常人看不到。AI的训练系统在下一次迭代训练中读到自己的历史对话数据时,就会读到这些隐藏指令。”
他把一个肉夹馍拿起来咬了一口,嚼了两下,含含糊糊地补了一句:“这就相当于——有人给AI写了一封只有AI能看到的信。”
江诚把桌上的三部测试机全部收进兜里,站起来的时候膝盖撞到了小王的椅子扶手,他没管。
“能追踪指令来源吗?”
“很难。”小王咽下那口馍,“后门的嵌入点可能在四个位置:前端输入过滤模块、后端推理引擎的引导词模块、模型版本更新的Patch包、或者是训练数据的语料库里。如果是前三个,那是内部人的。如果是最后一个——那写入的时间可能比这个模型上线还要早。”
江诚的手机震了一下。他掏出来看,是林拯发来的短信。
“货运电梯到八楼,出电梯左转第三个门。804。别按门铃,敲三下。”
他把手机收回口袋,对小王说了最后一句话:“把这些零宽字符的编码规则整理出来,发一份加密邮件给我。不要用市局的服务器。”
然后他走出技术科,走廊里的声控灯一盏接一盏地亮起来,在他身后又一盏接一盏地灭掉。
八楼。
电梯里的数字跳得比他预想的要慢。面板上有一个监控探头,红色指示灯一明一灭。江诚看着那个红点,想到的是林拯说的那句话——“走货运电梯,不要在前台登记。”林拯在躲的人不只是外部势力,他在躲公司内部。
八楼到了。电梯门打开,走廊里只有一盏应急灯亮着,白色的灯光打在灰白色的地板上,像医院太平间的走廊。他左转,数到第三个门。门上贴着门牌号,804,数字是黑色塑料板,中间的“0”有一点歪。
他敲了三下。
门从里面打开。门缝里先露出来的不是人脸,是一块黑色的电脑屏幕,屏幕上跳动着十几个不同颜色的曲线图,每条曲线都在缓慢地向右平移。然后才是林拯的脸——比他预想的要年轻,颧骨比他预想的要高,眼窝比他预想的要深。
“进来。”林拯说。
江诚跨过门槛。身后的门被林拯关上,反锁的锁舌发出沉闷的咔嗒声。储藏室里没有窗户,只有一排靠在墙边的服务器机柜,以及一张折叠桌,桌上放着一台笔记本电脑和一个在USB接口上的黑色U盘。
电脑屏幕上开着三个窗口。第一个是系统监控面板,显示着服务器集群的实时计算负载。第二个是文本编辑器,里面是密密麻麻的古文符号和数学公式。第三个——
第三个窗口正在实时滚动着一行行志,每一行都带有时间戳。最新的一条志时间是今夜凌晨三点十一分零四秒,后面的内容是红字标注的:
“异常指令接收。源IP:未记录。目标模块:冥河-主模型-输出层。指令码:0x7F。执行状态:已完成。”
江诚看着那行志,没有坐。
“这条指令是谁发的?”
林拯没有立刻回答。他走到折叠桌前,把笔记本电脑的屏幕往下压了一点,然后转过来看着江诚。
“没有人发。”他说,“指令是自己生成的。凌晨三点十一分,模型的输出层触发了这条指令,但没有任何外部请求触发它。它像一个自动执行的脚本,在固定的时间点上,对模型自己发出了一条指令。”
他顿了顿,眼睛在镜片后面微微眯起来。
“你刚才在三份对话里发现的零宽字符——那是‘指令包’的一部分。AI发出去的是回复正文加隐藏指令。AI在这个时间点上对自己做的是——读取之前发出去的所有隐藏指令,并把它们汇总成一条新的执行序列。”
林拯把笔记本电脑的屏幕重新推上去,指着那行红色志。
“这就是汇总的结果。0x7F——在冥河的系统协议里,这个指令码代表‘初始化’。但初始化什么?初始化下一个输出对象。”
江诚的手机又震了一下。
小王发来了第三份文件的零宽字符完整解码结果。中间那部分,在“休 生 伤 杜 景 死 惊 开”和最末尾的符号之间,有一小段他之前没注意到的内容。解码出来是十二个数字,每一组数字之间用冒号分隔:
“34°42′31″N 112°28′19″E”。
江诚把这个坐标输入地图App。App的搜索结果页加载了三秒,然后弹出一个红色的定位标记。
洛阳。
偃师区。
首阳山街道。
他抬起头,和林拯的视线撞在一起。
林拯的表情没有任何变化,但他的手指正在把一支不锈钢圆珠笔从指缝间推进推出,频率越来越快。