---
# System prepended metadata

title: 垃圾堆裡拾荒
tags: [ns107]

---

# 垃圾堆裡拾荒
###### 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
