SHA2017CTF Crypto100: Stack Overflow Writeup

題目提供了代碼跟一個使用該代碼加密的 pdf 檔:

要知道發生甚麼錯誤,先看以下代碼:

輸出如下:

大家可以見到 68390392f04509f8f47832a83533c347 一直在重複,為什麼?

問題出處是  counter=lambda: secret

在 PyCrypto 裡,CTR mode 的 counter 是一個函數:它有 0 個 input,1 個 output。題目提供的 counter 函數符合這個條件,但是它的輸出永遠是一樣的。

意味著 Nonce + Counter 那一段是永遠不變的!既然相同的 “Message” (Nonce + Counter) 被相同的 Key 用相同的系統加密,它得出的東西自然是相同的。

所以,現在加密系統就變了一個 16-byte key XOR cipher。

既然知道是這樣,我們可以用 PDF header 等等資訊來得到 XOR cipher 的 key,繼而得到 plaintext。


延伸問題:如果我「死都要用」CTR mode,應該怎樣做?

你可以用 counter = Crypto.Util.Counter.new(64, nonce) 定義 counter。

以下是測試代碼:

輸出:

 


發表迴響