远处跃动的浮光,朦胧的,遥不可及——
但它一直在那里。
256GaussianPrimeNumber.txt
Encoded.bin
main.exe
puzzle.wav
Readme.md

Part Ⅰ

Hello.
This is a console game.

Your goal is to find the key to decode the encoded data in "Encoded.bin" .

Have fun!

Hint: The next puzzle hides in the final content.

main.exe 要求输入13个十位整数。

目标很明确,要解出这个谜题必须要找到13个十位整数。

Part Ⅱ

我们查看 256GaussianPrimeNumber.txt 发现文件中包含用空格分隔的544个质数。

文件名指出:256GaussianPrimeNumber

根据高斯素数的定义:

如果一个整数 $n$ 不能被分解为高斯整数相乘,那么 $n$ 为高斯素数

而利用费马平方和定理

奇质数能表示为两个平方数之和的充分必要条件是该质数被4除余1

这样我们可以通过 p%4==3 来判断判断一个数是否为高斯素数。

with open("256GaussianPrimeNumber.txt", "r") as f:
    primes = f.read()

primes = [int(i) for i in primes.strip().split(" ") if int(i)%4==3]

我们得到了文件中所有高斯素数。

>>> print(len(primes))
256

恰好与文件名描述的一致,接下来的解密需要围绕这256个素数展开。

Part Ⅲ

频谱
频谱

观察wav频谱,发现恰好有13段,双声道,推测一段对应一个整数。

考虑到前面解密内容一直和数字有关,提取每一段的频率试试?

第一段:
124
440
第二段:
147
...

这些频率有什么特点?观察可以发现:

  • 部分频率数值有重复
  • 基本在 100-500 左右

我们发现第一段有一个440,这是什么呢?
音高与频率对照表

我们看第一段第二个频率:440
这是什么?这恰好是标准音高中央A的频率
我们发现,每一个频率与音高对应的不能说大同小异,只能说非常完美。

其实Au带一个分析频率音高功能,但我认为上面这些分析能说明这一步骤的合理性

于是我们转成音高:

B2 A4
D3 E2
E3 D2
B3 F3
A2 B2
E4 C5
F2 C2
A4 B3
D2 E4
B4 A3
F3 D3
C4 F4
D4 C3

最后一步,我们观察这些音高,发现什么?

没有sol
sol -> G

什么东西不包含G呢?十六进制

于是:

hz = [
(0xB2, 0xA4),
(0xD3, 0xE2),
(0xE3, 0xD2),
(0xB3, 0xF3),
(0xA2, 0xB2),
(0xE4, 0xC5),
(0xF2, 0xC2),
(0xA4, 0xB3),
(0xD2, 0xE4),
(0xB4, 0xA3),
(0xF3, 0xD3),
(0xC4, 0xF4),
(0xD4, 0xC3),
]

注意到,两位十六进制数刚好表示0-255

Part Ⅳ

现在我们有了256个高斯素数,有了13×2个不超过256的整数,需要找到13个10位整数。
接下来呢?
我们回到解密最开头的那句话:

故事,要从哥德巴赫猜想讲起。

哥德巴赫猜想:任何一个大于二的偶数都可以被表示为两个素数之和。

素数之和?我们发现:现在得到的所有素数都是大于9e9小于1e10的,这意味着,任两个素数的和刚好为10位数,与exe中要求相符合

如何从256个素数中挑选13×2个进行加和?下标

以Ⅲ中得到的数作为Ⅱ中素数的下标,并求和,我们得到了13个10位整数

这就是答案

1996503118
1996507134
1996507030
1996506918
1996503082
1996506770
1996507710
1996503126
1996507050
1996503150
1996508182
1996507766
1996506018

CORRECT!

Part V

"a 3-digit prime"

显然,3位质数只有143个显然枚举可过

好了还是按正常思路来,但我是枚举过的

仔细思考还有哪些没有被利用的信息

我们发现 puzzle.wav 中,我们只利用了其频率信息。

kaiyi: 我憋不住了
kaiyi: 一首音乐能有什么构成?
kaiyi: 有什么东西能是3位数
kaiyi: 在音乐中找数字你能想到什么

显然是bmp bpm!


好的bpm

我们用 60 除以每一段持续时间(~0.472s)

$ 60 \div 0.472 \approx 127$

至此#0结束

the end