昨天稍微認識了現代密碼學的概念,今天就來打題目~
這次使用選的題目是 Hackme CTF 的 easy AES
,難度應該算是蠻剛好的,如果想自己挑戰看看的讀者就先不要往下看~~
題目會給一段 Python code,大致如下:
def main(data):
c = AES.new(b'Hello, World...!')
plain_text = bytes.fromhex(input('What is your plain text? '))
if c.encrypt(plain_text) != b'Good Plain Text!':
print('Bad plain text')
exit()
c2 = AES.new(plain_text[::-1], mode=AES.MODE_CBC, IV=b'1234567887654321')
decrypted = c2.decrypt(data)
with open('output.jpg', 'wb') as fout:
fout.write(decrypted)
這題會用到
pycrypto
這個 package,不過這個專案已經沒有維護了,如果要解這題的話用 3.9 以前的 Python 版本會比較方便,3.10 以後的版本會報錯。
這個程式有 c
和 c2
兩個 cipher,第一個 cipher 是用 "Hello, World...!
" 當 key,加密後的明文如果等於 "Good Plain Text!
" 才會跑到下半部分。
下半部分解密出來的資料會被寫到一張 jpg 圖檔中,這就是我們的目標了。
依照這段邏輯,我們需要知道什麼明文使用 c
加密完之後會等於 "Good Plain Text!
",但我們也不需要自己算。
大家應該還記得 AES 是對稱式加密的演算法,也就是加密與解密都是同一把 key,那我們其實只要用 c
來解密 "Good Plain Text!
" 就可以得到得到我們需要的明文,修改程式如下:
def main(data):
c = AES.new(b'Hello, World...!')
plain_text = c.decrypt(b"Good Plain Text!")
if c.encrypt(plain_text) != b'Good Plain Text!':
print('Bad plain text')
exit()
...
執行後即可在圖片中找到 flag!
希望明天可以順利找到難度適中的非對稱式加密的題目,不然我只好寫別的主題了 XD