---
# System prepended metadata

title: 'HKCERT CTF 2023: baDES'

---

# HKCERT CTF 2023: baDES

## Part 1: Understanding the encryption method

By looking at "Guide to handwavy challenges" [here](https://hackmd.io/@blackb6a/hkcert-ctf-2023-ii-en-4e6150a89a1ff32c#%E4%B8%8B%E6%89%8B%E3%81%A7%E3%81%99%E3%81%AD--BADES-Crypto), we found out a few properties:
1. The message is padded to a size of 8, and is chopped into blocks of 8 bytes.
2. `Encrypt(Encrypt(x)) = x`. This means we just have to use a similar method to encrypt our input.

It happens that the way to decrypt our input is also present in the guide.

## Part 2: Retrieving the first block ($m_1$)

$m_1$ can be retrieved as stated in the guide:
$\texttt{348201303ca1dd0f} \oplus \texttt{cec9b43b33d17775} = \texttt{fa4bb50b0f70aa7a}$
$\texttt{Encrypt(fa4bb50b0f70aa7a)} = \texttt{348201303ca1dd0f5ce962554ed5ef3c17354837c14f7579}$\
$\texttt{348201303ca1dd0f} \oplus \texttt{5ce962554ed5ef3c} = \texttt{686b636572743233}$

Note that we only extracted the second last block in the encryption result (in Python, it should be `s[len(s)-32:len(s)-16]`). In this and future queries, we should only extract the second last block in the encryption result.

Converting $m_1 = \texttt{686b636572743233}$ from hexadecimal to ASCII gives $\texttt{hkcert23}$, which should be the first part of the flag.

## Part 3: Retrieving succeeding blocks

Now, we have to generalise the method for $m_1$ to find all $m_k$. Before that, we still need to correlate strings $c$ and $m$:

::: info
Note that $$\texttt{Encrypt(} m_1 || m_2 || \dots || m_{k-1} || (c_{k-1} \oplus c_k) \texttt{)} = c_0 || c_1 || \dots || c_{k-1} || (c_{k-1} \oplus m_k) || \texttt{[another block]}$$
:::

With that, $m_{i+1}$ can be easily retrieved after retrieving $m_i$. The diagram below shows the relation between retrieving $m_i$ and $m_{i+1}$:

![image](https://hackmd.io/_uploads/HJBhb9RmT.png)


For example, to find $m_2$:

1. Compute $c_1 \oplus c_2:$

$$ \texttt{cec9b43b33d17775} \oplus \texttt{d68fa7eb588a1060} = \texttt{184613d06b5b6715}$$

2. Encrypt $m_1 || (c_1 \oplus c_2):$

$$\texttt{Encrypt(686b636572743233184613d06b5b6715} = \texttt{348201303ca1dd0fcec9b43b33d17775b58df1686cb2431b0320cab5ad916c7d}$$

We take $(c_1 \oplus m_2)$, which is the second last block. In this case, the result we need is $\texttt{b58df1686cb2431b}$.

3. Compute $c_1 \oplus (c_1 \oplus m_2):$

$$\texttt{cec9b43b33d17775} \oplus \texttt{b58df1686cb2431b} = \texttt{7b4445535f63346e}$$

We get $m_2 = \texttt{7b4445535f63346e}$.

Using the same method, we can generate the following table:

| k | $c_{k-1} \oplus c_k$ | $c_{k-1} \oplus m_k$ | $m_k$ |
| :-: | :----: | :----: | :----: |
| $1$ | $\texttt{fa4bb50b0f70aa7a}$ | $\texttt{5ce962554ed5ef3c}$ | $\texttt{686b636572743233}$ |
| $2$ | $\texttt{184613d06b5b6715}$ | $\texttt{b58df1686cb2431b}$ | $\texttt{7b4445535f63346e}$ |
| $3$ | $\texttt{907f3f93afc9167e}$ | $\texttt{89b9c2b46bbe6351}$ | $\texttt{5f36655f33347331}$ |
| $4$ | $\texttt{aa9cb1c3e9d0d357}$ | $\texttt{2a89c71cc7346879}$ | $\texttt{6c795f6430776e67}$ |
| $5$ | $\texttt{c73e9530d42f6ecf}$ | $\texttt{9e584d887acce330}$ | $\texttt{72346433645f3679}$ |
| $6$ | $\texttt{524d3d77cd894d74}$ | $\texttt{7431d4bfa4db88b7}$ | $\texttt{5f6368346e673331}$ |
| $7$ | $\texttt{c5d4e24c36385040}$ | $\texttt{1778de903641c1c3}$ | $\texttt{6e675f6c31743731}$ |
| $8$ | $\texttt{ec4444d9c5532dc2}$ | $\texttt{d99417d800639fc1}$ | $\texttt{655f7468316e3973}$ |
| $9$ | $\texttt{b26ed28006ab69e4}$ | $\texttt{2d88206ef3598c77}$ | $\texttt{7d07070707070707}$ |

![pic](https://hackmd.io/_uploads/H1NrIqyNT.jpg)

Now, we have $m = \texttt{686b6365727432337b4445535f63346e5f36655f333473316c795f6430776e6772346433645f36795f6368346e6733316e675f6c31743731655f7468316e39737d07070707070707}$ which can be converted to $\texttt{hkcert23{DES_c4n_6e_34s1ly_d0wngr4d3d_6y_ch4ng31ng_l1t71e_th1n9s}}$.