# 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}```