# 垃圾堆裡拾荒
###### 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位金鑰的對稱演算法。
加密方式如下圖:

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的結果

試了兩組發現解密結果都一樣 <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