AIS3 2019 - CbC (Crypto, 378)

Challenge

題目:

I make a pretty cool encryption.

檔案 : task.py


Solution

看完整個程式碼後,你可以發現加密時呼叫的 bitchain(cb, state=0) 起始 state0 ,而拿出 b = 0ns = [1,7]

每呼叫一次 bitchain ,雖輸入了一串 cb 但是僅處理第一個 bit : b0

b 會與輸入的 b0 做 xor 而輸出 cipher
ns 則以 b0 的值決定下一個 P-table 的 index

P = [
(0, [1, 7]),
(1, [0, 8]),
(0, [5, 3]),
(1, [8, 6]),
(0, [3, 9]),
(1, [4, 0]),
(0, [9, 1]),
(1, [6, 2]),
(0, [7, 5]),
(1, [2, 4]),
]

稍微研究一下輸出或是 Ptable 都可以發現,無論 ns 怎麼從 Ptable 拿,一定會變成 01010101010101010101010101 ...

任何數字傳入 bitchain 相當於 xor 了一個 01010101010101010 ...

每加密四次會成為一個尋環,而該提加密了 100 次。
亦即,如果拿出任意一對 (pt,ct) 都有 bitchain( swap(ct ^ key2) ) == pt 的結果

\Rightarrow swap(ct ^ key2) = bitchain(pt)
\Rightarrow ct ^ key2= swap(bitchain(pt))
\Rightarrow key1 = swap(blockcipher(key2))

solve.py

AIS3{bb98c0745dc1368efcadbb667835623ad7e85a6a6c6d6939a0d2479610fe4d58}