# CTF解題:Crypto101 以及 Crypto102系列 >題目來源:[高中職生資安研習營](https://m.facebook.com/profile.php?id=100065584200879) -- SecurityFoscusOnline2023 >參加日期:2023/02/11 ~ 2023/02/12 * 因為題目很多,就從裡面挑幾個感覺比較特別的出來寫,都是一些滿考觀察力的題目,寫起來都很有趣 ## CRY1_凱薩密碼 ### 簡述凱撒 凱薩密碼就是用來加密明文的(應該是最經典的)編碼方式,雖然題目也附上很多解碼工具,但是還是要了解一下他大概是如何加解密,以後才可以上課傳紙條的時候用(並不是),還是大家要用這個傳遞什麼浪漫語句我是沒有意見(也不是)。 舉例來說呢 ```ABCDEFGHIJKLMNOPQRSTUVWXYZ``` --經過凱薩加密-->```DEFGHIJKLMNOPQRSTUVWXYZABC``` 會像這樣移動文字,並且向上述那樣移動,稱之為移動3個 以單字來說 ```CODE``` --經凱薩移動3個-->```FRGH``` 就會像這樣子 不過,我自己用程式寫的話,並不會馬上找到,通常是會先列出25種可能,並從裡面找到最可能是我們要的結果 用```CODE```來舉例的話: 0 -> ```CODE``` 1 -> ```DPEF``` 2 -> ```EQFG``` 3 -> ```FRGH``` 4 -> ```GSHI``` 5 -> ```HTIJ``` 6 -> ```IUJK``` 7 -> ```JVKL``` 8 -> ```KWLM``` 9 -> ```LXMN``` 10 -> ```MYNO``` 11 -> ```NZOP``` 12 -> ```OAPQ``` 13 -> ```PBQR``` 14 -> ```QCRS``` 15 -> ```RDST``` 16 -> ```SETU``` 17 -> ```TFUV``` 18 -> ```UGVW``` 19 -> ```VHWX``` 20 -> ```WIXY``` 21 -> ```XJYZ``` 22 -> ```YKZA``` 23 -> ```ZLAB``` 24 -> ```AMBC``` 25 -> ```BNCD``` ### 題目 先來看看題目內容:  完整密文: ```xyzqc{t3_qelrdeq_t3_k33a3a_lk3_lc_qe3p3}``` ### 解題邏輯 這題大概是希望學生能夠利用線上工具解,就用[其中一個工具](https://planetcalc.com/1434/)來試試看吧!  - 輸入之後可以看到下面列出一長串的decipher結果  - 在ROT3可以看到大概像我們需要的結果,輸入到CTF平台完成解題 ### 程式碼 因為平台上還有幾題需要使用凱薩解題,我就參考了一些網路上的寫法,寫出了可以解凱薩的程式碼! ```python= # encrypt data mess = 'xyzqc{t3_qelrdeq_t3_k33a3a_lk3_lc_qe3p3}' #因為給的密文全都是小寫,所以用來解密文的也用小寫 caesapha = "abcdefghijklmnopqrstuvwxyz" #用for迴圈解題 #老實說,用數字26來當for的長度也是可以的 #只是有時候會有需要加上0123456789在caesapha的情況,所以這邊用caesapha的長度 for cae in range(len(caesapha)): #宣告變數蒐集明文 cipher = '' #將mess一個一個拆開來解 for deMess in mess: #如果mess的某自出現在caesapha裡面 if deMess in caesapha: # num = caesapha.find(deMess) num = num - cae if num < 0: num = num + len(caesapha) cipher = cipher + caesapha[num] else: cipher = cipher + deMess print('using key %s, cipher is: %s' % (cae, cipher)) ``` - **程式碼重點**:作為字母表用來加密的 ```caesapha = "abcdefghijklmnopqrstuvwxyz"```順序不能有錯,畢竟是照著字母順序加密,若是錯了一個就全部再見 ```abctf{w3_thought_w3_n33d3d_on3_of_th3s3}``` ## CRY2_凱撒密碼part2 ### 題目  完整密文:```Pxevhfx mh tgzlmkhfvmy. Px ahix rhn xgchr hnk vmy. tvmy{utvd_mh_max_ynmnkx}.``` ### 程式碼 程式碼就用上一題吧!不過記得要把mess的密文改成這題的密文。  dadadadad有一個看起來長得像我們需要的答案 ```using key 19, decipher is: Pelcome to angstromctf. Pe hope you enjoy our ctf. actf{back_to_the_future}.``` 不過到這裡我就碰壁了...後來跟一起上課的不知名人士討論後,發現答案只有最後面```actf{back_to_the_future}.```而已ㅋㅋ我一直以為是全部都要... ## CRY3_ROT13 ### 題目  完整密文:```OernxNYYPGS{kg_gvzr_V'yy_gel_2_ebha_ZNMldSDw}``` ### 簡述ROT13 老實說,我個人認為和凱薩滿相近的,因為他是把明文的每個字母替換成字母表中它前面 13 個位置的字母。例如,字母“A”被字母“N”代替,字母“B”被字母“O”代替。不過,比凱薩好多的是,就不用再一堆答案裡面找,畢竟就是第13個嘛 ### 程式碼 那這邊就換個寫法好了,python有一個codecs module裡面有一個rot13的function可以用 ```python= import codecs cipher = "OernxNYYPGS{kg_gvzr_V'yy_gel_2_ebha_ZNMldSDw}" #將rot13作為第二個參數,以指示我們要使用 ROT13 解碼 decipher = codecs.decode(cipher, 'rot13') print(decipher) ``` ```BreakALLCTF{xt_time_I'll_try_2_roun_MAZyqFQj}``` ## CRY4_ SCYTCRYPTO 密碼棒破密 這題我覺得跟CRY11很像! ### 題目  完整密文:```ERTKSOOTCMCHYRAFYLIPL``` ### 解題邏輯 1. 我先數了一下,總共有21個文字 2. 密碼棒通常是幾個幾個一組,不會有多出來的情況,所以不是3個一組就是7個一組 3. 先來看看7個一組的情況  嗯...好像還看不出來什麼 4. 3個一組的情況  5. 可以發現第一排出現了題目敘述的EKO,而題目中有提及"本題目來自國外EKOPARTY CTF的題目" 6. 稍微排一下結果:```EKOMYFIRSTCRYPTOCHALL```為正解 ## CRY6_頻率分析法  ### 簡述頻率分析法 是一種破解加密密碼的技術,它基於對加密文本中字母出現頻率的分析。 在英文中,不同字母出現的頻率是不同的。例如,字母"E"是英文中出現最頻繁的字母,而字母"Z"則是出現最少的字母。這些頻率的差異可以用來破解加密文本。 頻率分析法的基本思路是:對加密文本中各個字母出現的頻率進行統計分析,然後將統計結果與英文中字母的頻率進行比較,找到加密方法中的一些規律,從而破解加密文本。 例如,對於一個加密文本,如果字母"E"在文本中出現的頻率很高,那麼很有可能加密方法中用來代替"E"的字母也很常見,從而可以猜測出加密方法中的一些信息,進而破解加密文本。 頻率分析法的效果取決於加密方法中字母替換的規律是否足夠複雜,以及加密文本的長度是否足夠大。對於使用複雜的替換規律和較長的加密文本,頻率分析法就會變得困難。 題目附的解題工具:http://quipqiup.com/ ## CRY08_ROT47  完整密文:```qC62<p{{r%uL(92E0`D0#_%cfnm]kN``` ### 簡述ROT47 類似於ROT13的編碼方法,ROT47是將每個字符移動47個位置(ASCII表字符 33-126)的凱撒密碼。 ### 程式碼 ```python= def decode_rot47(text): decoded_text = '' for char in text: if 33 <= ord(char) <= 126: decoded_char = chr(33 + ((ord(char) + 14) % 94)) else: decoded_char = char decoded_text += decoded_char return decoded_text ``` - 這邊先確認要解密的字元是否是在ascii裡的33到129,如果是在範圍內的話,就用原始位置減47得到解碼的位置,如果得出來的結果不在範圍內則wrapping around。如果該字符不是可打印的 ASCII,則保持不變。 ```python= encrypted_message = 'qC62<p{{r%uL(92E0`D0#_%cfnm]kN' decoded_message = decode_rot47(encrypted_message) print(decoded_message) ``` ```BreakALLCTF{What_1s_R0T47?>.<}``` ## CRY11_PythonCrypto 這題是我覺得最考觀察力的一題了! ### 題目 先來看看題目內容:  不知道為什麼這題的密文長到視窗外面,於是我把它複製在下面好了 完整密文: ```cvqBeqacRtqazEigwiAobxrKobxrAobxrLwgk8Lwgk8CrtuiTzahfFreqc{bnjrZwgk8Ikgd4Pj85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}``` ### 解題邏輯 有一起上這門課的不知名人士私下來問我這題,其實仔細觀察可以看到"BREAKALL"這幾個字,於是就有了以下步驟: 1. 先捨去掉前面的"cvq",從大寫"B"開始尋找 2. 發現大寫"B"以及大寫"R"後面都是四個小寫英文一組,於是在"BREAKALL"尋找是否規律一致 3. 發現規律一致,就用賭的了(賭後面也是使用這種規律進行編碼) 4. 程式碼編輯 就說題目要好好看,我真的是沒有想法的看了很久才發現有開頭的大寫提示 ### 程式碼 ```python= #密文 cipher='cvqBeqacRtqazEigwiAobxrKobxrAobxrLwgk8Lwgk8CrtuiTzahfFreqc{bnjrZwgk8Ikgd4Pj85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}' #去掉前面三個"cvq" cipher=cipher[3:] #宣告變數用來蒐集解密後的文字 flag = '' #使用迴圈解規律 for key in range(0,len(cipher),1): #因為五個一組,所以取 mod5==0 的文字 if key%5==0: flag +=cipher[key] #將取得的密文列印 print(flag) ``` ### 另外程式碼解 另外,主辦單位也提供了其他解法 ```python= '''二種解 s = 'cvqBeqacRtqazEigwiAobxrKobxrAobxrLwgk8Lwgk8CrtuiTzahfFreqc{bnjrZwgk8Ikgd4Pj85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}' print(s[3::5])''' '''三種解 cipher='cvqBeqacRtqazEigwiAobxrKobxrAobxrLwgk8Lwgk8CrtuiTzahfFreqc{bnjrZwgk8Ikgd4Pj85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}' ''.join(cipher[3 : : 5])''' ``` 解密後得到:```BREAKALLCTF{ZIPP_7H3_g00D_w0rk_up}```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up