# 一只菜鸡关于《Project NANO》的解谜记录

### Real entry

<!--哦，我的老伙计，你怎么误打误撞到这里来了。-->
<!--认真告诉你，这里没东西，去研究下那个二维码吧。-->
<div class="inside-qr">
<p>哦，来了，我的老伙计。</p>
<p>都来到这里了，肯定不能太难是吧。</p>
<div class="hint">
<p>所以我要跟你打包票，这一关的题目真的<strong>只在这个二维码</strong>里面了。</p>
<p>要不，拆开看看？</p>
</div>
<img "https://cdn.jsdelivr.net/gh/hanlin-studio/[email protected]/vigen.png" />
<div class="hidden">
<a href="https://cdn.jsdelivr.net/gh/hanlin-studio/[email protected]/vigen.png">打开这个图片</a>
</div>
</div>

This is a 5*5 n-Puzzle. Please recover it.Scramble STEP: JNPSVWVGMKHGMEPAMEYJJXZ

4\times7!=2\,0160\text{ 种}

（至少比 25!=15511210043330985984000000={15\text{\footnotesize秭}5112\text{\footnotesize垓}1004\text{\footnotesize京}3330\text{\footnotesize兆}9859\text{\footnotesize亿}8400\text{\footnotesize万}} 种可能性要好得多。）

from PIL import Image
from itertools import permutations
from pyzbar.pyzbar import decode
p_0_0 = Image.open("0-0.png")
p_0_1 = Image.open("0-1.png")
p_0_3 = Image.open("0-3.png")
p_0_4 = Image.open("0-4.png")
p_1_0 = Image.open("1-0.png")
p_1_1 = Image.open("1-1.png")
p_1_2 = Image.open("1-2.png")
p_1_3 = Image.open("1-3.png")
p_1_4 = Image.open("1-4.png")
p_2_1 = Image.open("2-1.png")
p_3_0 = Image.open("3-0.png")
p_3_1 = Image.open("3-1.png")
p_3_3 = Image.open("3-3.png")
p_3_4 = Image.open("3-4.png")
p_4_0 = Image.open("4-0.png")
p_4_1 = Image.open("4-1.png")
p_4_3 = Image.open("4-3.png")
p_n_0 = Image.open("n-0.png")
p_n_1 = Image.open("n-1.png")
p_n_2 = Image.open("n-2.png")
p_n_3 = Image.open("n-3.png")
p_y_0 = Image.open("y-0.png")
p_y_1 = Image.open("y-1.png")
p_y_2 = Image.open("y-2.png")
p_y_3 = Image.open("y-3.png")
n = [p_n_0, p_n_1, p_n_2, p_n_3]
y = [p_y_0, p_y_1, p_y_2, p_y_3]
fixed = [
(0, 0, p_0_0),
(0, 1, p_0_1),
(0, 3, p_0_3),
(0, 4, p_0_4),
(1, 0, p_1_0),
(1, 1, p_1_1),
(1, 2, p_1_2),
(1, 3, p_1_3),
(1, 4, p_1_4),
(2, 1, p_2_1),
(3, 0, p_3_0),
(3, 1, p_3_1),
(3, 3, p_3_3),
(3, 4, p_3_4),
(4, 0, p_4_0),
(4, 1, p_4_1),
(4, 3, p_4_3),
]
left = [(0, 2), (2, 0), (2, 2), (2, 3), (2, 4), (3, 2), (4, 2)]
d = 20
def join_pic(yy, ns):
dest: Image = Image.new("RGB", (d*7, d*7), (255,255,255))
for x, y, img in fixed:
dest.paste(img, (d * (y + 1), d * (x + 1)))
for coord, img in zip(left, ns):
x, y = coord
dest.paste(img, (d * (y + 1), d * (x + 1)))
dest.paste(yy, (d*5, d*5))
return dest
def gen_perm():
for i in y:
ii = [j for j in y if j is not i]
ii.extend(n)
for j in permutations(ii):
yield (i, j)

for y, ns in gen_perm():
p = join_pic(y, ns)
v = decode(p)
if v:
print(v)

python3 test.py
[Decoded(data=b'https://clang.pp.ua/c1An9', type='QRCODE', rect=Rect(left=20, top=20, width=100, height=100), polygon=[Point(x=20, y=119), Point(x=120, y=120), Point(x=119, y=20), Point(x=21, y=21)])]

RULDDDRRURDRULLLULUUREV

• R: right = 右
• U: up = 上
• D: down = 下
• L: left = 左
• REV 提示「Reverse」，就是反转的意思。具体怎么反转的我也没太仔细研究。（毕竟是暴破出来的。）

（感谢群友 @MiaQAQ 的指点）

### Clang

<title>./.../.-./---/--</title>
<!-- ... -->
<div id="not-here">
<p class="what-is-this">这里 和那 里或 许没 什么 关系</p>
<p><code>1T1023298N757Q13142N10271Q1T1029</code></p>
<p>或许你需要先看看，嗯，标题。</p>
<p class="what-is-this">9432bc3b.log</p>
</div>

「日志」内容：

ZeroMe Logs | Mar 27, 2020.
undefined

[时序碎片：31 31]
[解锁 丢失的密钥：whereisthefilter]

• 标题 ./.../.-./---/-- 是摩尔斯电码的 ESROM（Morse 反过来写）
• 「这里 和那 里或 许没 什么 关系」→两字一组？
• 1T1023298N757Q13142N10271Q1T1029：不明。
• whereisthefilter：不是答案，用途不明

「门上插刀」似乎是出题者杜撰出来的一个「梗」。

06068N86858488818187858389

Are you seeking the clue which is quite important?
FIRST… YOU MAY TRY ‘ESROM’.

【另外一种解法会认为将摩斯电码逆过来看。但是这种情况下，频繁出现的8会变成2。但是ASC码中，2字打头的除了16进制那栏,都无法对应符号,16进制那栏对应的都是标点符号,所以这种考虑被排除了。至于为什么是先摩斯再ASCII,是因为英语中提到了FIRST。】

1. 1T1023298N757Q13142N10271Q1T1029
2. 转换成摩尔斯电码
3. 嘀嗒对调
4. 转换回字母
5. 按照两字一字节用 ASCII 解码，得到
next: /hizeronet

### Hi Zeronet

<div id="not-here">
<p class="what-is-this" v-bind:title="hint?'真的没有吗…':'哎？不是这个意思？'">No hint</p>
<p>No hint</p>
<p class="what-is-this" v-bind:title="'Wcc_b)||UbZh&{R^\|R[P]V|P]^cWTa{iX_'">...</p>
</div>

• URL 里面的提示：Zeronet，一个去中心化的网站托管技术。
• v-bind:title：这应该是 Vue.js 了。（不过这跟解谜有啥关系？）
• 'Wcc_b)||UbZh&{R^|R[P]V|P]^cWTa{iX_'：一串密码。直觉判断应该是能解出一个 Zeronet 地址的。（Zeronet 地址长得是像一串 Base64 一样的 35 位字符，而这串字符刚好也是 35 位。）

Piggy 这样强调「hint」这个词我也只能想到那个二分逻辑式（hint?'真的没有吗…':'哎？不是这个意思？'）里面把 hint 取伪。但是仍然是毫无头绪。（果然俺还是不适合这种解谜的么 orz）

\text{hizeronet}-\text{hint}=\text{zeroe}

### Zeroe

<div id="here-is">
<p><small>ZEROMAIL_</small></p>
<div class="subject">E</div>
<p><small>From: <a href="mailto:[email protected]">霂</a></small></p>
<hr>
<p>告诉你个秘密，其实我挺喜欢对着些温馨些的场景看来看去。</p>
<p>有时候对着张桌面的照片都能看上半天，那种温暖的感觉便自心底发出。</p>
<p>要不我给你一段录像，你来看看其中的奥秘？</p>
<p><a href="https://cdn1.ihcr.top/clang-game/record.rar" target="_blank">[Video File]</a></p>
<p class="hint">答案就在其中，请坐和放宽。</p>
<p class="hint">哦对，看的时间别太长了，会出现幻觉的。</p>
<p class="what-is-this">ffa04ddc.log</p>
</div>

「日志」内容：

ZeroMe Logs | Apr 1, 2020.
abc 19:23:01

Piggy 19:23:35

abc 19:24:00

Piggy 19:24:35

abc 19:26:00

Piggy 19:26:53

[解锁提示: iwhvgqetai]
abc 19:28:00

[时序碎片: 39 33]

#### 事后谈

1. FFMpeg 有一个 mpdecimate 的 filter 专门用来解去除重复画面的。当时不知怎的没搜到。
2. 群友 Suzunari [email protected]提示说「给了一串神秘字符，用之前关卡出现的 key 解密可以得到 hint」。拿着之前日志里面的「iwhvgqetai」和 Clang 的日志里面给的「whereisthefilter」，塞进他们喜欢的Vigenère Cipher，就真的给出了 mpdecimate 这个提示。

### Wow awesome video processing

ZeroMe Logs | Apr 2, 2020.
[部分讯息经过加密]

......？那这家餐馆在哪呢？

> |

ROT13(Uvebfuvzn) = Hiroshima

Hiroshima = 广岛县，搜索广岛县叫做 NANO 的意大利餐馆，会找到一个这个：