Blowfish
用三個密鑰解密河豚密碼
免責聲明:我對密碼學很陌生,而且我沒有很強的數學背景。如果我錯過了明顯的事情,我會提前道歉。
我這個週末參加了一個安全 CTF,我無法解決其中一個問題。現在已經三天了,每當我有空閒時間時,我仍然會嘗試一下,這讓我發瘋。起初看起來很簡單。
標題是“triple Schneier, no Rivest”,它給出了一個明顯加密的文件和三個包含這些數據的二維碼:
# First QR key=5EBE2294ECD0E0F08EAB7690D2A6EE69 iv=26AE5CC854E36B6B # Second QR key=3FDD884B0F6491110CE7A27CD9C670E2 iv=2384D24993B7A941 # Third QR key=5A1F31323B5F3E79DF1A1A2ABC89B85F iv=B9B9F5320FDD8706
這是用 base64 編碼的文件:
ewx68DgfNLMEabX/dl62gVO4zki0vaZHWv6E+WCK8i0BH/rsKtIIV0ZlB8Z+fCFWwPQ04ZAi5Np6 s9lG4KnxUyVSAW/E1ccQ9QcOVxTTwduGdZ5+/ypgRIDKbx9B3mE8cZu0KBQ5k+Y1TfhlqYLwzs9E Xld9C3IMIrzBChFFoVmGEOZT/I/idBoE++ZDDlMGZMsZO37l2/Th/73y5qNn6Ezp1uuqAPoeZbAB ZSOaGnkKYnMPcjqoJR47NP4L3j0Wt39nZtbvHjQfIAyefqliklsChbTEGeRavqJX8zOg1W5zi3Q/ qKWilBOT5eLhtH9WxOa7aY8gxjcPQWzzXhSUtlZeCXUt2DW+
它有 264 字節長,每個鍵中的 IV 長 8 字節,每個鍵長 16 字節。加上標題中提到的 Schneier,我認為我們有一個河豚密碼是一個非常安全的賭注。
我試過用第一個密鑰解密文件,然後用第二個,然後用第三個。我還嘗試了算法的不同庫/實現。
我什至編寫了一個 python 程序來嘗試這三個鍵的所有可能排列,但沒有一個給我一個明文。
我顯然錯過了一些大事。
這是我最後一次嘗試,我認為這濃縮了我嘗試過的大部分其他事情:
for kr in key_permutations: out_name = ''.join( [ str(k['id']) for k in kr ] ) output = [ first_input ] for k in kr: cipher = blowfish.Cipher(k['key']) i = b''.join(output) sys.stdout.buffer.write(i) output = cipher.decrypt_cbc(i,k['iv']) open(out_name,'wb').write(b''.join(output))
key_permutations
是一個 3-uples 列表,其中每個元素都是一個字典,其中包含一個鍵、對應的 iv 和一個任意 ID。我正在使用這個河豚庫。所以我想問題是三個:
- 有沒有辦法確保這確實是河豚密碼?
- 給定這 3 個密鑰,有哪些方法可以嘗試破解程式碼
- Rivest 與 Blowfish 有什麼關係?
提前致謝!
加密是帶有 Blowfish CBC 的 EDE。要解碼密文 ct 反轉加密,即執行
CBC_Decrypt(key3, iv3, ct, t3) CBC_Encrypt(key2, iv2, t3, t2) CBC_Decrypt(key1, iv1, t2, pt)
在此之後,純文字 pt 將以:
訣竅是使用 3DES 方法解密,但使用不同的加密算法。雖然 DES 通常使用 3 次,但使用 3DES 方法可以使用 3 種不同的算法……