# "密"室逃脫 詳解 ##### 2022建中x福營寒假科學營 {%youtube Q-_XMqxa0Ck %} --- ## 第一關 這關是個關於**凱薩加密**的題目,我們可以從下圖這兩個線索得到: ![](https://i.imgur.com/hhSZP8y.png) ![](https://i.imgur.com/4pau09U.png) --- ![](https://i.imgur.com/I64s3sl.png) ![](https://i.imgur.com/EbjLUe2.png) 另外,上頭這兩個線索可以讓我們發現,似乎密碼的解密會和 ``火``的數量有關 如果仔細來數,可以發覺火的數量總共有``17``個 **可以知道凱薩密碼的位移量和17有關** 在多找過幾遍之後,可以猜出```the five wizards jump```就是我們需要加密的文字,而```okayu is cute```是假的線索,是某個學長亂加的,~~揍他!~~ 所以,當我們把```the five wizards jump```用位移量 ```17```(火把數)加密, **就可以得到答案```kyv wzmv nzqriuj aldg```** :::info 有了答案,就可以去走那個煩人的迷宮了,~~萬歲!~~ ::: ![](https://i.imgur.com/pBXGN6e.png) > 累死人不償命的迷宮走法 :::warning 在這邊學長要先道歉,沒想到迷宮竟然把一些人卡了快半個小時, 真是不好意思,當初設計時是為了怕有人亂走,才會設置很多懲罰點。 ::: --- ## 第二關 此關為關於**ascii code**的題目,我們可在左下角的火爐找到此線索: ![](https://i.imgur.com/OPMt6so.png) 另外,在進門後右側可找到:![](https://i.imgur.com/9XAUdIm.png) 此為將字母換成ascii code後的數字後再計算其總和之意,可得出前往下一關的密碼。 房間右上方有ascii code對照表: ![](https://i.imgur.com/aeiY5rR.png) 此外,還可以找到關於鑰匙的線索 ![](https://i.imgur.com/OPMt6so.png) ![](https://i.imgur.com/FmJanEy.png) 得知公鑰為`851`,另一把鑰匙為`17`。 傳送門為紅圈所標示的地方: ![](https://i.imgur.com/21YIOkC.png) 走到那裏,按Enter,輸入851,就可以進入下一關了。 ## 第三關 ![](https://i.imgur.com/NvFAsY4.png) ![](https://i.imgur.com/EsNo1kk.png) * ### 線索 * ftq ragzfmuz 為要去的地點 * 地球經線間隔一樣 -> 加密的東西間隔一樣 -> 答案為凱薩加密解密的結果 * 兩份亂碼(密文): * 一、Never Gonna Give You Up 歌詞 :::info Iq'dq za efdmzsqde fa xahq Kag wzai ftq dgxqe mzp ea pa U M rgxx oayyufyqzf'e itmf U'y ftuzwuzs ar Kag iagxpz'f sqf ftue rday mzk aftqd sgk U vgef imzzm fqxx kag tai U'y rqqxuzs Saffm ymwq kag gzpqdefmzp Zqhqd sazzm suhq kag gb Zqhqd sazzm xqf kag paiz Zqhqd sazzm dgz mdagzp mzp pqeqdf kag Zqhqd sazzm ymwq kag odk Zqhqd sazzm emk saapnkq Zqhqd sazzm fqxx m xuq mzp tgdf kag ::: * 二、醫生笑話 :::info M ymz dqoquhqe m btazq omxx rday tue paofad. Ftq paofad emke, “U tmhq eayq saap zqie mzp eayq nmp zqie.” Ftq ymz emke, “AW, suhq yq ftq saap zqie rudef.” Ftq paofad emke, “Ftq saap zqie ue kag tmhq 24 tagde fa xuhq.” Ftq ymz dqbxuqe, “At za! Ur ftmf’e ftq saap zqie, ftqz itmf’e ftq nmp zqie?” Ftq paofad emke, “ftq nmp zqie ue, U radsaf fa omxx kag kqefqdpmk.” ::: * ### 解法 * 統計攻擊 * 透過觀察上面兩份密文重複的結構可以發現此加密為凱薩加密,位移為 12,將同為密文的 ftq ragzfmuz 解密即可得到 the fountain。 * 旁門左道 * 觀察干擾 * 有提到學長喜歡 rickroll,尋找 rickroll 歌詞可以發現類似提示一的結構,透過字母對應發現位移為 12。 * 廢文 C++ code * 第二行的 *<g2\*\*2\*3.h>* 2**2*3 = 12,位移為 12。 * ### 傳送門使用方式 * 哈利波特呼嚕粉 * 透過一旁告示牌說明,可以知道走入火爐後輸入`the fountain`就可以前往下一關。 #### ~~歡迎大家複製以下程式碼去執行~~ ```cpp= #include <iostream> //#include <g2**2*3.h> #include <vector> #include <string> using namespace std; int main() { vector<string> thisMayNotBeAClue; for (int i = 69; i < 420; ++i) { thisMayNotBeAClue.push_back("14122訂閱英雄Brine"); } for (auto n: thisMayNotBeAClue) { cout << n << " https://www.youtube.com/channel/UCCZTue2ueya6I9yAsMLJZsA"; } vector<string> SubscriberOfBrine; SubscriberOfBrine.resize(556, "genius"); SubscriberOfBrine.clear(); return 0; } ``` --- ## 第四關 * ### 線索 >![](https://i.imgur.com/Pt5dZA1.png) >超多有用線索的二樓bar * 對話 ~~(有用的?)~~ * 其實有幾隻猴跑到噴水池底下挖了一個洞,聽說洞用了什麼rsa來加密,沒有私鑰是不可能進去的 * 就算有,你也解不開他的密碼,那可是用最先進的rsa演算法加密的ㄟ。~~fxxx,說溜嘴了~~ * 噴水池位置線索: * 你問我噴水池在哪?好像在外面海邊吧.....為什麼噴水池要放海邊?我也不知道這蠢主意是誰想的....大概蓋這裡的人是白痴吧.... > ![](https://i.imgur.com/vfl00xg.png) 噴水池....也太遠了吧... > ![](https://i.imgur.com/WDvLEWz.png) > 沒啥有用線索的一樓bar * ### RSA破解方式 (超重要!!!) 1.將公鑰`N`質因數分解成兩個質數P和Q 2.`R = (p-1)*(q-1)` 3.將另一個公鑰 `e` 和剛剛算出的R放入模逆元計算機 得到`d` 4.`d`即為私鑰 > 因為`d`滿足 `e*d≡1 mod(R)` ,所以`d`叫做`e`在`R`下的**模「逆」元** 在我們遊戲中,`N`已在第二關用ascii code求出,為`851`。 將`N`質因數分解,可以得到`851 = 23 * 37`,`p = 23, q = 37` `R = (23-1)*(37-1) = 22*36 = 792` 另一個公鑰`e`則為第一關的火把數量`17` ``` N = 851 R = 792 e = 17 求 d (e 在 R 下模逆元) ``` 最後透過模逆元計算機,可以得到 `d = 233` 如此一來,就可以前往`the fountain`了!!! > ![](https://i.imgur.com/5vZsWkl.png) > 沒幾個人會用的模逆元計算機:cry: p.s. 附上裡頭程式碼如下 ```python= def ext_euclid(a, b): old_s, s = 1, 0 old_t, t = 0, 1 old_r, r = a, b if b == 0: return 1 else: while(r!=0): q = old_r // r old_r, r = r, old_r-q*r old_s, s = s, old_s-q*s old_t, t = t, old_t-q*t return old_s ``` ```python=+ def gcd(a, b): while b != 0: t = a % b a = b b = t return a ``` ```python=+ try: print("輸入 ed= 1 (mod r) 中的 x 和 r 讓我找到你要的y吧!!") x = input("e=") r = input("r=") if(gcd(int(x),int(r))!=1): print("d並不存在喔12 你輸入錯誤了") else: print("你要的結果如下") k = ext_euclid(int(x),int(r)) if(k<0): k=int(r)+k print("d=",k) print() except KeyboardInterrupt: print("code stop.") ``` --- ## 藏寶區 ##### 這裡就是整個遊戲的最後了!除了會反彈以及一堆彩蛋 ~~(有一個沒有人發現)~~ 之外,~~應該沒什麼困難的吧!?~~ ### 恭喜那些成功過關的隊伍!!!:zap::zap::zap::zap: ![](https://i.imgur.com/nU8qHeI.png) > p.s. ~~google 表單還沒填的,拜託幫我寫好寫滿啊~~🥺🥺🥺 <iframe src="https://docs.google.com/forms/d/e/1FAIpQLSfN3wkps-fZP33zpPl2nwhoh7jyPEoXcJF1Eu_Tn0PdipUckA/viewform?embedded=true" width="640" height="2523" frameborder="0" marginheight="0" marginwidth="0">載入中…</iframe>