FUTURE 攻坚组

Time 谜题解密

2024/06/22
解密
4.3k 字

avatar

寒夏Rainiar

Celestial observer

Start of Post

大 变 申

先给大家进行一个跪的滑,中途致敬了鹰角特有的临时改谜题(

誠に大変申し訳ございません

注意事项

此次谜题除了题面以外,还包含了 3 个附录图片(Appendix),它们是根据一定的时间间隔依次放出的谜题提示,故我们不会将它们放在谜题解密中,也不会使用其上的提示。

参赛者题解

此次解密因为机密系统测试未完善的原因,开发组考虑可能发生了文件泄露的情况,因此此次解密要求参赛者提供自己的解题思路以防止通过暴力手段破解相关阶段。

对于题解的审核与接收,主要参考以下几点要求,并没有要求一定要和官方题解一致:

  1. 是否将谜题中的信息使用完全
  2. 提出的推理过程是否符合解密过程逻辑
  3. 是否有执果索因,先射箭后画靶的行为

以下是参赛者的题解,感谢他们对我们工作的理解与配合!

ArchyCillp: https://gist.github.com/ArchyCillp/6db38ea78453a1042687e9d7c188b240
SherkeyXD: https://gist.github.com/SherkeyXD/eb3ef48a13c932f88c4f63f53f7b4a9b
Yuki-RM-f: https://gist.github.com/Yuki-RM-f/5623e6fdfb9336cd0bbddae0603891fe
OCLalpha: https://gist.github.com/OCLalpha/72449793d7edd7dfa750b1e74adbce5e

你可以对照他们的题解和官方题解重温我们的谜题。

Stage 0

表面信息:左下角的 PDF417 二维码,一张线图以及一个不明图形。

高亮度对比度下的信息:标题黑条中隐藏的日本邮政条码以及左下角的 DataMatrix 二维码。

日本邮政条码
日本邮政条码
DataMatrix
DataMatrix

PDF417 扫码结果为:

8Ny25HQRxiNsekk=

Base64 解码后为一段二进制数据,暂时不可用。

线图为 ChaCha20 流加密算法的过程图,暗示我们可能需要使用 ChaCha20 解密二进制数据。

不明图形连接了两个实现块,一个纯黑的顶部实线块表示 顶部标题黑条,另一个空心块框住左下部分,并包含一个井号。

考虑文件左下有一个密钥 polaris 故可以认为是空心块所指。

那么最后图形底部的实心块便是指向 ChaCha20 的加解密流程,考虑以上两个线索应该是 ChaCha20 的加解密参数。

标题黑条中隐藏的条码数据为 20240616,而 ChaCha20 需要一个 32 字节的密钥以及一个 8 字节的初始化向量参数,黑条正好是八字节因此该初始化参数就是 202406160

而密钥 polaris 不满足 32 字节的要求,此时考虑到不明图形中的神秘井号,因为井号在英语中可以读作 hash,暗示应该使用哈希对其进行处理,

通过尝试能返回 32 字节的哈希算法,最终可以选中 SHA256,将得到的密钥和初始化参数输入到 ChaCha20 中对 PDF417 二进制数据解码,得到:

tothefuture

现在我们还有一个 DataMatrix 二维码未使用,扫码得:

/time-capsule

这是一个路径,或者说是一个 URL 路径,我们把它拼接到 FUTURE 官网域名上,得:

https://theteamfuture.github.io/time-capsule

可以进入一个带 Entry IDPassword 的界面。

我们把文中的密钥 polaris 作为密码,使用 tothefuture 作为 ID 即可进入一阶段的结果。

Stage 1

当指定日期(20240616)未到达时,只能看到一个完全随机像素图片:

PLEASE STAND BY
PLEASE STAND BY

该图片没有任何隐藏信息,所以请耐心等待。

当指定日期到达时,从时间胶囊获取一阶段结果,可以发现内容发生了变化,可以得到一张图片:

提取文字得:

<tcms login ███████████@timecapsule
>███████████@timecapsule's password: <█████████
>Welcome to Time Capsule Manage System!
>Last login: Unknow
>~ # <data-dump /Jahr/* dump.zip
>Dumping data...
>[##############################] 100%
>Finished, 6 entries dumped.
>~ # <ls
>dump.png dump.zip task.txt
>~ # <cat task.txt
>1. Recovery data from time capsule
>2==SIGINT==
Caused by local user, DEBUG 0x558408585000-0x55840858509F dumped:
0x558408585000 | FF FF FF FF FF 80 2A 5E 49 47 59 0A 46 45 4D 43
0x558408585010 | 44 0A 5E 45 5E 42 4F 4C 5F 5E 5F 58 4F 6A 5E 43
0x558408585020 | 47 4F 49 4B 5A 59 5F 46 4F 20 81 1F 6B 70 6B 77
0x558408585030 | 7A 79 6A 6B 6A 6D 7A 5F 6B 76 72 7A 7C 7E 6F 6C
0x558408585040 | 6A 73 7A 38 6C 3F 6F 7E 6C 6C 68 70 6D 7B 25 3F
0x558408585050 | 80 12 67 60 61 73 7F 7B 7C 7D 60 18 81 64 33 01
0x558408585060 | 08 07 0B 09 01 44 10 0B 44 30 0D 09 01 44 27 05
0x558408585070 | 14 17 11 08 01 44 29 05 0A 05 03 01 44 37 1D 17
0x558408585080 | 10 01 09 45 81 1D 51 7C 6E 69 3D 71 72 7A 74 73
0x558408585090 | 27 3D 48 73 76 73 72 6A 81 00 7E 20 23 20 3C 64
Connection to timecapsule closed.

其中我们需要的用户名和密码在文本中都被遮蔽了,那么我们只能转而查看底下的二进制数据 Dump。

观察可以发现,除去开头的 FF 不表,剩余的数据二进制第 8 位为 1 的只有 8081 这两种,考虑它们作为分隔符,得到如下列表:

80 2A 5E 49 47 59 0A 46 45 4D 43 44 0A 5E 45 5E 42 4F 4C 5F 5E 5F 58 4F 6A 5E 43 47 4F 49 4B 5A 59 5F 46 4F 20
81 1F 6B 70 6B 77 7A 79 6A 6B 6A 6D 7A 5F 6B 76 72 7A 7C 7E 6F 6C 6A 73 7A 38 6C 3F 6F 7E 6C 6C 68 70 6D 7B 25 3F
80 12 67 60 61 73 7F 7B 7C 7D 60 18
81 64 33 01 08 07 0B 09 01 44 10 0B 44 30 0D 09 01 44 27 05 14 17 11 08 01 44 29 05 0A 05 03 01 44 37 1D 17 10 01 09 45
81 1D 51 7C 6E 69 3D 71 72 7A 74 73 27 3D 48 73 76 73 72 6A
81 00 7E 20 23 20 3C 64

将其除去开头的字节,转换为 ASCII 观察,得(已使用空格代替无法打印的字符):

*^IGY FEMCD ^E^BOL_^_XOj^CGOIKZY_FO 
 kpkwzyjkjmz_kvrz|~oljsz8l?o~llhpm{%?
 g`as {|}` 
d3      D  D0   D'      D)     D7     E
 Q|ni=qrzts'=Hsvsrj
 ~ # <d

看见最后的转换结果,与明文中的一段一致,因此可以猜想这一段二进制就是上述明文的某种加密方式。

而这种基于二进制常用的一种加密方式就是 异或 操作,通过对一些异或值的尝试,不难发现诸如 1D64 等数可以解码出某一段文字,再次观察上面的分组情况,可以发现在 8081 后面跟随的第一个字节就是该段落对应的异或密码。

因此我们可以解码得到如下:

tcms login tothefuture@timecapsule
tothefuture@timecapsule's password:
ursaminor
Welcome to Time Capsule Manage System!
Last login: Unknow
~ # <d

那么我们就能拿到新的密钥 ursaminor,使用 tothefutureursaminor 访问时间胶囊,可以得到一个压缩文件 dump.zip

Stage 2

检查 dump.zip,不难发现在文件的末尾拼接着一个额外的图片,我们暂时不表:

解压 dump.zip,里面是编号从 3 到 8 的 6 个独立图片。

根据 Stage 1 中的数据 Dump 提示,这些图片来自于一个名为 Jahr 的目录,Jahr 一词在德语中指“年”,因此我们需要找到这些图片对应的年份。

3.png

拉高亮度对比度,可以看见右侧一个折线图形,上方的带数字 2.4n 图案重复了 3 次。

如果对电路比较熟悉,不难看出上面重复了 3 次的图案是电容,左侧的折线图案是电阻。

说到电容和电阻,最容易想到的就是 RC 振荡器了,数字 2.4n 表示的就是 2.4nF 电容容值,那么左下的数字列表就是电阻的阻值,有了这两个数据就可以计算 RC 振荡器的振荡频率。

其中,重复了 3 次的电容暗示我们需要认为振荡器是 3 级联的,那么根据公式:

我们可以分别计算出如下频率(精度进行了省略):

67011-- 75202
50227---
44748-- 37601
50227---
67011---
75202 89645 75202 67011
44748-- 37601
50227---

此时还有一个数字 64 尚未使用,由于其和斜线组成了一个类似于除法的表示,所以考虑表示分频倍数 64,得到如下频率(精度进行了省略):

1047-- 1175
785---
699-- 588
785---
1047---
1175 1401 1175 1047
699-- 588
785---

看这个横杠组合,看起来很像简谱,所以尝试把频率换成对应的音符(精度有省略,因此你需要选择最靠近的音符):

C6-- D6
G5---
F5-- D5
G5---
C6---
D6 F7 D6 C6
F5-- D5
G5---

简单把它弹出来,那么答案就出来了,是《东方红,太阳升》的旋律。

对于这首歌,我们最能想到的就是东方红一号 —— 中国的第一颗人造卫星,它于 1970 年 4 月 24 日在酒泉卫星发射中心成功发射,对应的年份答案就是 1970

(或许你可能认为它不一定就是指代东方红一号,那么接下去看你就知道了,所有的答案都和天文学有一定关系)

4.png

看起来是一个星系,有一个中心天体和 4 个行星,以及一条不明曲线。

大部分人可能会认为这个是太阳系,然后依照行星顺序代入水星、金星、地球……

但是这条曲线有点过于反常了,而且 各行星距离太阳的距离明显对不上,所以我们应该考虑的是某个行星及其各个卫星的关系。

最后,我们可以找到这是木星和它的四颗卫星,这一条曲线就可以认为是某个飞越了木星的彗星或人造航天器的轨道。

通过对相关的关键词进行检索,我们可以得到一张结构几乎完全一样的图:

Wikipedia: Voyager 2
Wikipedia: Voyager 2

这是旅行者 2 号于 1979 年飞跃木星的轨道图,因此我们知道了答案是 1979

5.png

这个是最简单的,通过降噪和图片搜索,不难知道这是哈勃空间望远镜。

哈勃空间望远镜是 1990 年发射的,因此答案是 1990

6.png

图片显然又是一个和太阳系相关的,因为图中三个星体所使用的标识是占星学或天文学中使用的行星符号。

因此我们可以知道中心天体是太阳,中间轨道是地球轨道,最外面的星体是火星。

一条虚线从地球出发到达火星,因此我们需要寻找一个火星探测相关的人造天体或火星车。

最后,我们可以在机遇号火星探测车的 Wikipedia 中找到这样一幅图:

在动图的最后一刻,完美对应了题目的画面,因此答案是 2004

7.png

图片的埃及色彩非常浓重啊(

右边的眼睛是“拉之眼”(与荷鲁斯之眼不同,荷鲁斯是左眼,拉是右眼),拉是埃及众神中的太阳神,因此这里就是告诉你它代表太阳。

在轨道上的是罗塞塔石碑,我们就根据罗塞塔这一关键字进行搜索,寻找相关的飞行器或星体,我们可以找到 67P 彗星探测器 罗塞塔号

其中有这么一张图:

Wikipedia: Rosetta (spacecraft)
Wikipedia: Rosetta (spacecraft)

其轨道角度和太阳位置都与题目相仿,当飞行器到达题目中罗塞塔石碑的相近位置时,我们可以看见上方的时间是 2014 年,因此答案就是 2014

8.png

最后一题是一个南十字星座,同时有一条类似于海岸线的轮廓。

我们可以直接搜索相关的关键字,也可以观察我们之前的答案 —— 似乎每张图片大致都以年代相隔,如 3.png 是 70 年代,4.png 是 70 年代末(80 年代),5.png 是 90 年代……那么这道题应该 是 2020 年后的事情。

对如上的一些关键词进行检索,我们可以找到中国的第五座南极考察站 —— 秦岭站。

秦岭站的开站时间就是 2024 年,因此答案是 2024

答案组合

我们完成子谜题的解答之后,是时候回到最初的那张图来组合答案了。

拉高图片亮度,可以看见背后藏着一个 ITA2 码:

解码可得:

convex evacnoc

猜测应该是 convexconcave 两个词,只是 concave 被翻转了。

其中最能和底部六个多边形所对应的意思就是 凸多边形(Convex Polygon)凹多边形(Concave Polygon)

底下的那些多边形分别有 3 到 8 个角,正好可以对应上文中的 3.png8.png 的名字。

提示凹多边形可能需要翻转,因此可以得到用户名和密码:

200442021979
410219700991

我们可以从时间胶囊得到一张新图片。

Stage 3

图片名字很显然,提示升维,那么就是要我们对图片上方的那一串像素进行升维操作。

通过对比度调整可以看到图片背景中的一个 33p 字符串:

联想到 1080p720p 这些东西,可能是让我们按行将上面的像素进行排列,宽高为 33。

先按行扫描,将上面的二维像素转换成一条像素条,然后按照 33 的步长重新排列,但是此时你会发现什么都不是,像素排列是乱的。

但是如果经过观察,你可以发现二维码像是被慢慢逐行往右偏移了一点点,而且此时分割得到的图案是 33x34 的,一个二维码应该是方形,显然图像现在不满足。

那么我们使用 34 步长进行分割组合,得到一个 34x33 的图像,这时真正的二维码就出现了,左边有一条黑色的 Padding。

扫描二维码即可得到谜题最后的答案。

杂谈

这次解密没啥好说的,只是一个小小的毕业礼物。
祝各位小、中、大、研究、博士毕业生们毕业快乐!

另附《六颗星星的故事》及官方翻译:
至于为何是翻译,因为故事原版就是用英语写的

Tale of Six Stars

六颗星的故事

A star left the earth, emitted a moving light, until its mechanical heart stopped oscillating any more.
一颗星星离开大地,发出迷人的光芒,直到它的机械之心不再波动。

A star kissed Jupiter goodbye with expectations, leaving towards the deep sky.
一颗星星和朱庇特吻别,向着深空离去。

A star brought charming photos to the earth, but it was aging, new stars took over the job.
一颗星星为大地带来了迷人的写真,但她已老去,新星们接替了她的工作。

A star landed on the red soil, roving for 15 years, just to seek the spring of life.
一颗星星降落在红壤之上,流浪十五载,只为寻找生命的源泉。

A star walked through countless days and months, caught up with the comet that belonged to her.
一颗星星走过数不尽的日月,终于追上了属于她的那颗彗星。

A star has been picked down from sky, placed on the pure ice sheets, motivating us to move forward.
一颗星星被摘下自天际,置于纯白冰原,激励着我们前行。

Who will make the next star? Who will pick the next star?
谁将手制下一刻星?谁又将摘取下一颗星?

Will it be you standing at the crossroads?
会是站在十字路口的你吗?

寒夏Rainair 作于 2024.06.16 毕业日

下一个创造奇迹的人,会是会是站在人生十字路口的你吗?


附某 FUTURE 组员脑子一抽没写完的文言文版翻译:
信达雅三不齐一

Tale of Six Stars

六星逸闻

A star left the earth, emitted a moving light, until its mechanical heart stopped oscillating any more.
一颗星星离地行,机械之心终罢转,星辰灿耀为燃尽。

A star kissed Jupiter goodbye with expectations, leaving towards the deep sky.
一颗星星吻岁辰,离别言道希冀闻,向首漆黑无穷夜。

A star brought charming photos to the earth, but it was aging, new stars took over the job.
一颗星星身远方,送递奇片至地样,人亦年迈星亦老,更有星辰代梦想。

A star landed on the red soil, roving for 15 years, just to seek the spring of life.
一颗星星落红壤,飘零环行十五载,只为寻得命中春。

A star walked through countless days and months, caught up with the comet that belonged to her.
一颗星星行宇宙,无尽日夜更不还,终得赶追己彗星,双星伴游共天璇。

A star has been picked down from sky, placed on the pure ice sheets, motivating us to move forward.
一颗星星坠天穹,落于冰原饮寒风,引得众生前行路,明年光好谁与同。

Who will make the next star? Who will pick the next star?
何人成就下颗星?何人摘攫下颗星?

Will it be you standing at the crossroads?
十字街口何人立,莫道此人不识君。

End of Post