本报告包含强技术类文本
TECHNICAL SECTION CONTAINED
我们无法对其中的数理性分析部分进行简化整理,此部分描述将无法通俗易懂

谜题背景

2026年5月1日,明日方舟七周年活动暨主题曲第十七章《相变临界》实装纪念活动开启。

本章剧情承接第十六章及部分SideStory,讲述了罗德岛一行前往乌萨斯泽尔格勒寻找石棺,并“复活”凯尔希的过程。

谜题叩门

由于自第十五章主题曲实装纪念活动开始,活动大厅会随玩家的推进进度发生变化,故本次活动开启时也有玩家开始记录本次活动的活动大厅差分。

但在玩家通关17-16且尚未通关17-18时,变为混杂信息的大厅背景中,疑似存在一些并不混杂的数据块。

解密过程

第一阶段:提取

对第三背景进行持续观测,可获得如下9块不同的数据块残片。

部分残片几乎难以被辨认,因此具有多张截图。

其中对部分残片(尤其是③、⑤号)的特征辨认,可认定这些数据块残片应当是某个QR码(下称“二维码”)的一部分。

KNOWLEDGE_BASE > QR code
QR码,全名“快速响应矩阵图码”(Quick-Response Code),于1994年日本汽车零组件大厂电装公司的原昌宏所发明。

相对于常见的“一维码”(条码),QR码是一种横竖均有编码码位的“二维码”,因此在较小的面积内,它可以存储比一维码更多的信息,并且不局限于数字和字母,汉字等Unicode字符也能被编入其中。其特有的定位和纠错机制也能使得QR码在一些常见污染和缺损情况下也能被完美读出。

如今,QR码不仅用于工业生产,还被广泛应用于各类商业广告、移动支付等领域。我们常说的“二维码”在大多数情况下指代的也就是QR码。

又注意到,③的下部定位点(校正图形)被重复描绘,若要复原二维码,则还需要对残片进行先行去重。

去重且重绘后的二维码残片内容如下。

将二维码残片进行重新排列,得到

ATTACHMENT > 残缺的二维码

尝试直接扫描二维码没有任何反应(无法解码),这应当是二维码缺失部分过多,无法纠错导致。故需要尝试对其进行复原处理,再考虑从二维码编码规则的方向进行可能的分析。

对二维码码位进行分割和重绘,可发现:

  • 二维码具有完整的竖直部分,共25行码位。
根据二维码编码标准,这是一个版本2的二维码,大小为25×25像素(码位)。
  • 在上述基础上核对水平方向,可发现左侧为01~09列,右侧为17~25列
第10~16列的共7列码位为丢失状态。
ATTACHMENT > 复原的残缺二维码
※利用Excel转绘,其中最外侧为静态区域(分离二维码本体的区域),内侧(B2:Z26)为二维码本体。

第二阶段:复原

如无特殊说明,以下坐标均采用第一阶段重绘版本所使用的Excel单元格。

为了避免二维码受到旋转、翻转等变换影响导致无法读取,二维码存在一套定位标志系统。在正确方向的情况下,于版本2的二维码中:

  • 三个定位标志(7×7大小的大定位点)分别位于左下、左上和右上方;
  • 一个校正标志(5×5大小的小定位点)位于右下方,且距离右侧和下侧4个码位;
  • 两个定时标志带(黑白相间颜色循环)一条位于左侧两个定位标志的右边缘,一条位于上侧两个定位标志的下边缘;
  • 一个暗模块(1×1大小的辅助定位点),位于左下格式信息的上方1个码位,永远为黑色。

因此可以补全K8~Q8的缺失部分,即 白黑白黑白黑白。

此外,二维码中存在格式信息,用于指导解码器如何进行解码。

格式信息在二维码中存有两份以供容错,分别位于:

  • 左上角定位标志空白外沿,读码时跳过定时标志带的码位;
  • 左下角定位标志右侧空白外沿 + 右上角定位标志下侧空白外沿。

两者可读出相同的码位序列,注意二维码中,黑块(有色块)是1,白块(无色块)是0,因此得到的格式信息码为:

110100101110110

根据编读码规则:

  • 首先与固定掩码101010000010010作异或计算
  • 之后拆出前5位,这5位的前2位是纠错等级(二维码全图被破坏后的信息恢复容许面积),后三位是掩模图形/掩码(编码原信息所使用的掩码图形序号和编码算法)。

得到:

格式信息码 11010 0101110110
固定掩码 10101 0000010010
源码 01111 0101100100

即:

  • 纠错等级 = 01 = L(7%缺失容错,也是本例无法直接读码的原因——超过了纠错容许)
  • 掩模图形 = 111 = 7
  • 后10位为源码的BCH(15,5)“纠错码”,用以保证作为关键的格式信息能够正确被解码(而且整个格式码也进行了2次保存)
因与复原二维码内容无关,此处不作详述。

完成以上工作后得到的二维码基础信息为:

  • 版本 2(25×25)
  • 纠错等级 L
  • 掩模图形 7

将定位标志(含暗模块)和格式信息去除后,剩余的码位即为已编码完成的存储的数据,需要通过掩码解码后方可阅读。

对于掩码7,其对应的算法为:

\( \big((i+j) \bmod 2 + (i \cdot j) \bmod 3\big) \bmod 2 = 0 \;\Longrightarrow\; \text{该格取反} \)

其中:

  • \( i \) 为横坐标(左侧为0起始,向右为正),\( j \)为纵坐标(上方为0起始,向下为正)。
  • “取反”即为码位数据比特取反(1变为0,0变为1)

由于该算法中的“取反”等同于“XOR 1”,“不变”等同于“XOR 0”,因此掩码编码的本质可视为一种异或,由此可以获得一张如下的“掩码图像”:

ATTACHMENT > 掩码7的图像格式
※位于掩码黑格的码位将在编码后反色,白格则不变。灰色部分为定位标志(含暗模块)和格式信息的存储位置。

只需要把存储的数据与掩码图像再做异或运算,即可得到原始数据流:

ATTACHMENT > 残缺二维码的原始数据流

在二维码中,数据流从右下角开始,以蛇形顺序排列:

  • 从最右侧开始,每两列划一条边界(其中最左侧的定时标志左侧6列划2列边界)
  • 优先水平从右到左读位;读到边界后,向上一行(或向下,取决于当前的垂直读位方向)并重置读位头到右侧(或左侧,取决于折线方向)
若边界内仅有一列,则竖直移动读位。
  • 无论何时,跳过定位标志和格式信息区。

按照该规律读得二进制数据流如下:

01000010000001101000011101000111
01000111000001110011001110100010
11110010 11110110000101
10101100101110 01101000
0x1x1x0xxxxxx0x0x1x0x1x1x1x1x0x 0x1x0x1x1x1x
xxxxxxx...

※空格为跳过的功能块(图中的灰色“沟壑”部分);x为残缺部分。

其中:

  • 前4位为编码模式
此处为0100,即字节模式,要求读码器优先以二进制流格式读取数据,每个数据码字为8位。
  • 后X位为字符计数(在版本2中,X = 8)
字符计数计数的是字符串按照给定字符集编码后的字节数。
由于编码模式是字节模式,因此默认可认为是Latin-1字符集(当然具体解码仍需要视情况而定)。
此处为00100000,意味着数据长度为32个字节。
  • 此后每8位即为一个数据字节,参照前文,默认以Latin-1字符集译码。
# 数据 字符
01 01101000 h
02 01110100 t
03 01110100 t
04 01110000 p
05 01110011 s
06 00111010 :
07 00101111 /
08 00101111 /
09 01100001 a
10 01101011 k
11 00101110 .
12 01101000 h
13 0x1x1x0x ?
14 xxxxx0x0 ?
15 x1x0x1x1 ?
16 x1x1x0x0 ?
17 x1x0x1x1 ?
18 x1xxxxxx ?
—— ...余下14字节 ——
https://ak.h??????

根据往期解谜记录,该二维码存储的应当是一个指向官网(子页面)的链接,且其开头的字符串必定为

https://ak.hypergryph.com???????
已知25字节+未知7字节

对第13~18字节以Latin-1字符集编码可交叉验证:

# 数据 字符
13 0x1x1x0x
01111001
y
14 xxxxx0x0
01110000
p
15 x1x0x1x1
01100101
e
16 x1x1x0x0
01110010
r
17 x1x0x1x1
01100111
g
18 x1xxxxxx
01110010
r

通过已有字符串进行补码,可得到如下的部分二维码。

这里需要引入二维码编码的另一个概念:码字。
与之前的解码读码流程(4位编码模式 + 8位字符计数 + 32个8位1字节)不同,码字是衡量二维码数据容积的基本单位,固定为8位1码字,且固定从读码起点开始。

对于版本 2、纠错等级 L的二维码,其码字规范中:

  • 数据码字 = 最大34个 = 最大272位(包括编码模式、字符计数和实际数据)
  • 纠错码字 = 10个

但本二维码的数据块共268位,小于数据码字的272位(最后还有4位无法填满)。按照编码规范,这四位将以0000作为终止符固定填入。
填入后继续填充纠错码字,纠错码字填完后剩余7位不填字,保留为“空白”。

ATTACHMENT > 部分补全的二维码

此时该二维码数据区的结构如下:

码字序号 内容
00 编码模式 (4位) + 字符计数(8位·上半)
01 字符计数(8位·下半)+ 字节1(8位·上半)
02~25 字节1(8位·下半)~ 字节25(8位·上半)
26 字节25(8位·下半)~ 字节26(8位·上半/缺失)
27~32 字节27(8位·下半/缺失)~ 字节32(8位·上半/缺失)
33 字节32(8位·下半/缺失)~ 终止符
34~35 纠错码字1~2(缺失)
36 纠错码字3(前7位缺失)(仅剩余最后1位,xxxxxxx0)
37~43 纠错码字4~10

附件

参考资料

作者:智能BGM​