---
# System prepended metadata

title: picoCTF - Cryptography write-up
tags: [write up]

---

# picoCTF - Cryptography write-up
未寫：
* Medium
    * Guess My Cheese (Part 1)
    * Guess My Cheese (Part 2)
* Hard
    * 幾乎全部._.
    * miniRSA



# Easy
## hashcrack
> hash

:::spoiler 解法
這題顧名思義就是要爆破hash
會有三題，用 [crackstation.net](https://crackstation.net/) 就能爆破出每一個的原始密碼了
![image](https://hackmd.io/_uploads/SJz3tJBJWx.png)

:::
## EVEN RSA CAN BE BROKEN???
> RSA

:::spoiler 解法
這題應該算蠻簡單的RSA題(?
用 https://factordb.com/ 把N拆成p跟q就可以計算出明文了 
``` py
c = 19299563540855451833375009754826650975382561529126997079773420450916832233929657435014237118139938964518004372254135381599273364925167849041821593703164849
n = 23773590867200874106198285582257407523714159251112305729184555849807530218449302598642496077891109002150830742101075803806364925644119482175729605818717162
e= 65537


p = 2
q = n//2

phin = (p-1)*(q-1)

d = pow(e,-1,phin)
m = pow(c,d,n)
msg = hex(m)
msg = msg[2:]
msg = bytes.fromhex(msg)
print(msg)
```
:::
## interencdec
> base64、caesar

:::spoiler 解法
打開檔案之後會看到一串==結尾的字串 `YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclh6ZzJhMnd6TW1zeWZRPT0nCg==`
看到==猜是base64
解碼一次之後變成 `b'd3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrXzg2a2wzMmsyfQ=='`
把b裡面的再解碼一次 `wpjvJAM{jhlzhy_k3jy9wa3k_86kl32k2}`
看到有大誇號而且字位數差不多，猜是凱薩
試各種位移量，找到開頭為picoCTF的就是答案
:::

## Mod 26
> ROT13

:::spoiler 解法
題目問說知道ROT13是什麼嗎
所以就把題目給的字串做位移，偏移量13，就是答案了:D
:::

## The Numbers
> ASCII、caesar

:::spoiler 解法
檔案打開是一張圖片，有一堆數字，用py把每個+65轉換成字符
``` py
s = [16,9,3,15,3,20,6]
x = [20,8,5,14,21,13,2,5,18,19,13,1,19,15,14]

for i in s:
        print(chr(65+i),end="")

print()
for i in x:
        print(chr(65+i),end="")

```
然後凱薩找到開頭為PICOCTF的就是答案!
:::

## 13
> ROT13

:::spoiler 解法
題目問ROT13
一樣偏移量13就是答案
:::


# Medium
## ReadMyCert
> CSR

:::spoiler 解法
這題給了CSR檔案
CSR是憑證簽署要求（Certificate Signing Request，CSR）
他是一個加密過的文字檔，其內容記載身份以及使用憑證的域名
我們可以用openssl來解碼這個CSR檔案
CN那欄就是這題的flag
![image](https://hackmd.io/_uploads/BJzsTviJWe.png)

:::
## Vigenere
> Vigenère Cipher

:::spoiler 解法
把message用key做Vigenère cipher解密就有flagㄌ
![image](https://hackmd.io/_uploads/HyT8QIoJZg.png)

:::
## Easy1
> Vigenère Cipher

:::spoiler 解法
這題說給了the encrypted flag, key, and a table
打開table我思考了一下想說，這不是Vigenère cipher的表嗎
把UFJKXQZQUNB 用SOLVECRYPTO做解密就得到flag了 (記得加picoCTF)
![image](https://hackmd.io/_uploads/Bk1tfeYybl.png)

:::
## HideToSee
> atbash cipher

:::spoiler 解法
這題給了一張圖片 上面寫了atbash cipher跟一個網址 
對這張圖片進行各種分析，最後用steghide提取出了一個txt
![image](https://hackmd.io/_uploads/Hyy_bFwkZe.png)

打開是被加密過的flag
圖片上寫了是atbash cipher 做解密就好ㄌ 
![image](https://hackmd.io/_uploads/Hy8_WFD1-x.png)

:::
## rotation
> caesar

:::spoiler 解法
找到picoCTF就是flag了
![image](https://hackmd.io/_uploads/ryzGlU8y-x.png)

:::
## caesar
> caesar

:::spoiler 解法
用 https://theblob.org/rot.cgi 找到最不像亂碼那個
![image](https://hackmd.io/_uploads/SJVkxU8JWl.png)

:::
## Crack the Power
> RSA

:::spoiler 解法
這題給了n、c、e的數值，可以發現他的e只有20，在RSA中太小的數值通常會是可以破解的點👀
上網找腳本就可以直接破解他了~
程式邏輯大概是因為e很小，如果m也沒有太大，m^e的數字就不會比n大太多，取模的次數不多
m^e=c+k * n 可以直接窮舉可能的k，得出來的e次方根是整數就是正確解 
![image](https://hackmd.io/_uploads/S1ma_gQy-x.png)

:::
## substitution0
> 字頻分析

:::spoiler 解法
丟https://quipqiup.com/ 就好ㄌ~
![image](https://hackmd.io/_uploads/BJ44-2jAxe.png)

:::
## substitution1
> 字頻分析

:::spoiler 解法
丟https://quipqiup.com/ 就好ㄌ~
![image](https://hackmd.io/_uploads/rkN8b2iRll.png)


:::
## rsa_oracle
> RSA - Chosen plaintext attack

:::spoiler 解法
題目給了一個secret.enc跟password.enc還有一個能解密除了密碼以外的解密機器，提示說了可以用OpenSSL 來解密這個secret.enc，但是需要密碼
所以推測這題要用Chosen plaintext attack來破解出password
RSA的加密公式是 `c = m^e mod n` ，解密公式是` m = c^d mod n`
我現在要解的是` c (c = password^e)`，我們發送一個已知的明文( m=2 ) 獲得他加密後的c2 (c2=2^e)
然後將兩個相乘後拿去解密 ， 因為我們送入的 `c*c2 = (password*2)^e` ， 所以我們解密解出來的就是 password * 2
將他除2就是password了 ， 把他轉成ascii就是secret.enc的密碼了
![image](https://hackmd.io/_uploads/SyS1kHFCex.png)

:::

## Custom encryption
> xor

:::spoiler 解法
題目給了兩個檔案
一個裡面看起來是程式運行後的結果，有a、b、cipher
另一個是原py檔案
閱讀一下程式
理解出他是隨機a、b然後進行dynamic_xor_encrypt跟encrypt
現在我們有a、b就能算出key，做出解密程式就能得出原本的flag
先把key算出來:
![image](https://hackmd.io/_uploads/ryHHyrFAex.png)
然後先做encrypt的解密，把陣列全部除key*311
![image](https://hackmd.io/_uploads/ByvvkrY0lg.png)

然後做dynamic_xor_encrypt的解碼，由xor的特性可知，我們只要將密文再做一次xor即可得到明文
![image](https://hackmd.io/_uploads/BkAKJHKAxl.png)

組合成一個py檔執行後就能獲得flag!
![image](https://hackmd.io/_uploads/H15cyrKCxg.png)

:::
## C3

:::spoiler 解法
題目會給一個encoder程式跟一個密文，他的加密方法是每一個字元會根據他在lookup1中的位子與他上一個字元做差值，然後對應到lookup2的字元
寫個python來做解密，解出來會是一個python2的程式
![image](https://hackmd.io/_uploads/Sy6ggSY0eg.png)

這個程式會讀取input然後只有 i 等於 b³ 的時候會輸出
上面的# 有一個寫個selfinput，所以就把這個程式作為這個程式的輸入就是flag了
![image](https://hackmd.io/_uploads/SkSWeSKRex.png)

:::

## transposition-trial

:::spoiler 解法
依題意將字串分成三個一組，因為flag格式已知為picoCTF開頭
可判斷出順序為2 3 1
![image](https://hackmd.io/_uploads/B1TUK450gx.png)

然後就寫一個python解決他
![image](https://hackmd.io/_uploads/HJSUYE90xg.png)

::: 


## substitution2
> 字頻分析

:::spoiler 解法
這題一眼看去感覺很多重複的字母，而且拿去跑凱薩找不到正確flag
推測應該跟字頻分析有關，用解碼器來解!
我用的是[quipqiup.com](https://quipqiup.com/)
把密文跟已知(三個大寫字母是CTF)填進去然後讓他跑!就能解出正確的flag了
![image](https://hackmd.io/_uploads/Bkq0FE9Rgl.png)

:::
## rail-fence
> Rail fence cipher

:::spoiler 解法
題目說了是Rail fence cipher而且rails是4
原本要自己寫程式但發現有點難就上網找了參考
大概就是按照⬊⬈先用`*`標記出在哪
然後再橫的填入文字
再依照⬊⬈去得出原文
![image](https://hackmd.io/_uploads/HJA49VqRle.png)
:::
## morse-code
> morse code

:::spoiler 解法
題目給了一個音檔，標題說了是摩斯代碼
所以就上網找個解碼器就好了~我用的是這個[databorder.com](https://databorder.com/transfer/morse-sound-receiver/)
解好之後長這樣
![image](https://hackmd.io/_uploads/Sy1ncN50gx.png)

記得加上picoCTF{}跟把空白換_還有大寫換成小寫就是flag了~
:::
## credstuff
> caesar

:::spoiler 解法
題目給了一個tar檔案
先進行解壓縮 tar xvf leak.tar
會獲得一個資料夾裡面有兩個檔案
![image](https://hackmd.io/_uploads/SJhGoN9Rge.png)

我們要找到 cultiris 對照的密碼
因為太多了所以寫一個py腳本來進行搜尋
![image](https://hackmd.io/_uploads/H1PXj4c0el.png)

得到的結果是 cvpbPGS{P7e1S_54I35_71Z3} 看起來被進行過凱薩加密
進行解碼，偏移量為13
:::
## basic-mod1

:::spoiler 解法
題目給了一串數字，說了要怎麼解碼
按照他說的寫成py就好了
![image](https://hackmd.io/_uploads/SJMKs45Rgl.png)

:::
## basic-mod2
:::spoiler 解法
這題要求的是跟41的模逆元
用py的pow可以求模逆元
![image](https://hackmd.io/_uploads/H129hE9Rlx.png)

:::
## spelling-quiz
> 字頻分析

:::spoiler 解法
這題給的py看起來就是在做單字母替換加密
所以我們可以用字頻分析暴力破解
但只有flag這個檔案的話不夠多分析不出來
所以我加上另一個檔案的前面幾行一起去做分析，成功解出正確的flag
加上picoCTF{}就是答案
![image](https://hackmd.io/_uploads/SkYp1r5Ceg.png)

:::

## Mini RSA
> RSA低指數攻擊

:::spoiler 解法
題目給了N、e、c
RSA的加密是`c = m^e mod n`，但現在e很小，所以我們可以找到一個最小的k使`c + n*k = m^e` ，然後對這個值取整數開 e 次方根，是整數的話就找到明文了
然後把m轉成hex再轉成bytes就有答案了
寫成py讓他跑就可以了
![image](https://hackmd.io/_uploads/ByzPgr9Clg.png)

:::
## Mind your Ps and Qs
> RSA

:::spoiler 解法
題目給了c、n、e的值，因為n很小，所以可以直接用[factordb.com](https://factordb.com/) 分解他，就可以得到p跟q
然後就可以算出歐拉函數 `φ(n) = (p-1)(q-1)`
接下來就可以算出私鑰d，然後就可以解出明文了!
![image](https://hackmd.io/_uploads/BJfaeS5Cex.png)

:::
## Dachshund Attacks
> RSA - Wiener’s attack

:::spoiler 解法
題目說了d很小，所以我上網查了RSA d極小 攻擊
找到一個叫Wiener’s attack
然後看到一大堆推論跟程式碼，將我們得到的n、e、c填入後運行python就能解出flag
![image](https://hackmd.io/_uploads/SkFXZr9Age.png)

:::

## New Caesar

:::spoiler 解法
這題給了加密的程式跟要解的密文
加密的邏輯是先做b16編碼，再把每位元依照key做位移，key的範圍是他有給的ALPHABET，而且key的長度都只有1，所以我們可以直接枚舉key來做解密
觀察每個結果，最不像亂碼的就是flag (記得加上picoCTF{}) 
![image](https://hackmd.io/_uploads/H19dZr9Rle.png)

:::
## No Padding, No Problem
:::spoiler 解法
這題題目跟你說他會幫你解出除了flag以外的密文
查了一下好像是某種常見題型
連線上之後他會給你n、e、c
這題的解題概念是運用乘法同態性 `( Enc(m1) * Enc(m2) ≡ Enc(m1 * m2) mod n )`
所以就是我們要創造一個`c' = (c * (r^e mod n)) mod n `，把這個 c' 丟給他解密，你就會拿到 m * r，然後你可以除以 r 得到原本的 m
![image](https://hackmd.io/_uploads/BJdeMH5Rxl.png)

:::
## Easy Peasy
> xor

:::spoiler 解法
這題nc連線後會給你一個加密過的flag還會讓你輸入字串，觀察一下加密程式，可以發現它會先用key與flag做xor。
然後它會從 key 的當前位置開始繼續做加密，如果長度超過 key 結尾，會從開頭補滿長度，已知key = cipher ^ plaintext。所以我們可以先輸入一個長度為50000-len(flag_enc)的字串再輸入一個長度為flag_enc的字串就能成功解出與flag做xor的key部份了
由於將近50000的長度有點難直接輸入進去，所以用python來解這題
解出來的結果直接加上picoCTF{}就是flag了
![image](https://hackmd.io/_uploads/ryqvGSc0el.png)

:::
## Pixelated
:::spoiler 解法
這題給了兩個圖片要進行疊合，寫一個python將兩個圖片疊成一個
會得到一個全灰的圖
![image](https://hackmd.io/_uploads/HJftIU9Alg.png)

用StegSolve就能找到flag 
![image](https://hackmd.io/_uploads/Sk5tI8qReg.png)

:::
## Mr-Worldwide
:::spoiler 解法
這題給了一堆一對一對的數字，結合標題是world，這些應該是經緯度
用google map查出每個的地點
再找英文的首字母就是flag了
![image](https://hackmd.io/_uploads/r1l_bmuqAxg.png)

:::

## waves over lambda
> 字頻分析

:::spoiler 解法
題目給了一段替換式加密過的密文，也沒說是用甚麼加密方法
直接丟字頻分析就找到flag了(這題flag沒有picoCTF的格式)
![image](https://hackmd.io/_uploads/rJaHQ_qRxl.png)

:::
## Flags
:::spoiler 解法
題目給了張圖，是一堆不同形狀跟顏色的正方形組成的
我原本還想說可能是國旗，結果找不到
最後直接以圖搜圖某一塊，搜出國際信號旗
有兩個對照不出來我直接分別再以圖搜圖一次發現兩個都是數字
![image](https://hackmd.io/_uploads/Skw97u5Axe.png)

:::

## Tapping
> morse code

:::spoiler 解法
這題會獲得一個看起來像摩斯電碼的東西
複製去 [morsecode.world](https://morsecode.world/international/translator.html) 做個解碼
得到的結果就是flag
![image](https://hackmd.io/_uploads/SyVZVu9Rxg.png)

:::
## john_pollard
> RSA

:::spoiler 解法
題述說有些RSA憑證可被破壞，提示1說flag格式是picoCTF{p,q}
檔案裡是一段X.509 憑證，裡面包含了RSA的公鑰，所以可以從中解出n跟e
寫個python就可以了，得到n之後去 [factordb.com](https://factordb.com/) 分解就能得到p和q了
![image](https://hackmd.io/_uploads/SkFAcOqAll.png)

:::
## la cifra de
> Vigenère Cipher

:::spoiler 解法
這題給了一串密文，但有點分辨不出他是甚麼加密方法
所以丟一小段到線上工具去識別看看，第一名是Vigenère Cipher，但他又沒有說他的key是甚麼
[guballa.de](https://www.guballa.de/vigenere-solver) 這個工具可以在沒有key的情況下破解Vigenère Cipher
得到的明文中就包含著flag
![image](https://hackmd.io/_uploads/r12Did5Cgg.png)

:::
# Hard
## Very Smooth
> RSA

:::spoiler 解法
這題是一題 RSA 密碼學題目，漏洞在於 p和 q都是smooth prime，也就是小質因數的乘積加一。
我們可以利用 p - 1與 q - 1的可分解性，使用 Python 的 pollard_pm1()函式來分解出 p跟 q。
求出 p和 q 之後，就能還原出 RSA 私鑰，再進一步解密出 flag。
![image](https://hackmd.io/_uploads/HkNQyt5Cgx.png)

:::
## triple-secure
> RSA

:::spoiler 解法
這題就是做了三次的RSA，因為他的模數共用質因數，所以可以透過gcd得到p、q、r
計算每層對應的 φ(n)，再算出每一次對應的d，從第三層開始往回推就能得到明文了
![image](https://hackmd.io/_uploads/H1ZvkKcClx.png)
![image](https://hackmd.io/_uploads/BJSJgt5Agx.png)


:::
## Play Nice
> Playfair Cipher

:::spoiler 解法
連線後會給一個alphabet跟加密過的文字，要解出明文
觀察一下題目給的py檔案
發現他的矩陣是6\*6，其他都跟Playfair Cipher的規則是一樣的
所以反著推回去就是答案了!
❗這題flag沒有picoCTF開頭，他給的直接就是flag了~
![image](https://hackmd.io/_uploads/HyU4lKcCge.png)

:::

## b00tl3gRSA2
> RSA

:::spoiler 解法
這題看標題就看的出來是一題RSA，先使用 nc 連線取得 n、e、c 三個參數
觀察後可以發現，這題的 e 不是常見的 65537，而是一個非常大的數字。根據 RSA 中 ed ≡ 1 mod φ(n) 的特性，當 e 很大時，d 就會相對很小。可以聯想到RSA常見的Wiener's Attack
Wiener's Attack 能在私鑰指數 d 很小的情況下，透過 continued fraction 解出 d，進而解密密文取得明文。
可以參考 CryptoHack 的說明與攻擊腳本：
🔗 [cryptohack.gitbook.io](https://cryptohack.gitbook.io/cryptobook/untitled/low-private-component-attacks/wieners-attack)
只需要將腳本中的 n、e、c 換成本題給的參數，並安裝套件 owiener（pip install owiener），就能成功跑出 d 並解出 flag。

:::
