# 垃圾堆裡拾荒 ###### tags: `ns107` 組名:ls ## 題目 There is a single unknown DES key K. All plain texts are encrypted under K, resulting in the corresponding cipher text. Can you find K? flag is EENS{K}, where K is a 64-bit hexadecimal value, without the 0x prefix. [known_plaintexts.txt](https://eens.ee.ncku.edu.tw/files/0c13a3bc3ec139e5081d2a5783e10319/known_plaintexts.txt) ## 簡介 DES ( Data Encryption Standard )是一種基於使用56位金鑰的對稱演算法。 加密方式如下圖: ![](https://i.imgur.com/hgsqShP.png) DES 的金鑰產生是用 56 bits 的金鑰去算出 16 把 subkeys ,然後他一共有 16 個回合,每次用一把 subkeys ,加密和解密就差在使用 subkey 的順序,而如果你的金鑰是用weak key的話,算出的 16 把 subkey 會完全一樣,所以造成加解密完全一樣。 E(E(m)) = m ## 解題 1. 使用python中的Crypto.Cipher加密包進行解密 ```python= from Crypto.Cipher import DES m = '89bc8acb348c1ecc' c = '9e31e5f5a8cef654' key = [ '\x01\x01\x01\x01\x01\x01\x01\x01', '\xFE\xFE\xFE\xFE\xFE\xFE\xFE\xFE', '\xE0\xE0\xE0\xE0\xF1\xF1\xF1\xF1', '\x1F\x1F\x1F\x1F\x0E\x0E\x0E\x0E'] for k in key: des_func = DES.new(k, DES.MODE_ECB) if m == des_func.decrypt(c.decode('hex')).encode('hex'): print "key: ",k.encode('hex') break ``` 2. key的結果 ![](https://i.imgur.com/qaLGkrh.png) 試了兩組發現解密結果都一樣 <font color="red">-> 代表使用了weak key</font> ## Reference https://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%99%E6%BA%96 https://read01.com/2gkDjz.html#.XQFZKYgzY2w https://github.com/MyDearGreatTeacher/IPAS/blob/master/%E9%99%BD%E6%98%8E%E8%BB%92.md