Crypto in CTF: Q2 2022
CTF | Challenge Name | Solves (Difficulty) |
---|---|---|
Midnight Sun Quals 2022 | Pelle’s Rotor-Supported Arithmetic 🔥 | 35/346 (⭐⭐) |
Midnight Sun Quals 2022 | BabyZK 🔥 | 19/346 (⭐⭐) |
Midnight Sun Quals 2022 | kompot_512 🔥 | 15/346 (⭐⭐⭐) |
Midnight Sun Quals 2022 | WeedSolomon 420 | 3/346 (❓) |
PlaidCTF 2022 | pressure | 18/431 (⭐⭐) |
PlaidCTF 2022 | choreography | 14/431 (⭐⭐) |
ångstromCTF 2022 | log log log | 104/1319 (⭐) |
ångstromCTF 2022 | Strike-Slip Fault | 50/1319 (⭐⭐) |
ångstromCTF 2022 | Prophet | 45/1319 (⭐⭐) |
ångstromCTF 2022 | RSA-AES 🔥 | 36/1319 (⭐⭐) |
Midnight Sun CTF Quals 2022⌗
Pelle’s Rotor-Supported Arithmetic 🔥⌗
- Solves: 35/346
- Difficulty: ⭐⭐
- Tags:
rsa
- Author: @carllondahl
Let $p$ and $q$ be two 512-bit primes for RSA and $n = pq$ be its modulus. Let $e = 65537$ and $d$ has $l$ digits in base 10. Here we denote $d = \overline{d_0 d_1 … d_{l-2} d_{l-1}}$).
Suppose that we have an oracle, $\mathcal{O}(c, i)$, which returns $m$ defined by the below steps:
- Compute $d' = \overline{d_i d_{i+1} … d_{l-2} d_{l-1} d_0 d_1 … d_{i-2} d_{i-1}}$.
- Compute $m = c^{d'}\ \text{mod}\ n$.
We are given $\approx 340$ oracle calls and the encrypted flag $c_0$ (and nothing else). The goal is to decrypt $c_0$, which is encrypted with a different $e$ but the same $n$.
BabyZK 🔥⌗
- Solves: 19/346
- Difficulty: ⭐⭐
- Tags:
math
- Author: @carllondahl
Let $p$ be a 1024-bit safe prime (i.e., $p = 2q+1$ with $q$ is also a prime). Let $m(x)$ be a polynomial of degree 14 and $g \in \mathbb{Z}_p$.
Suppose that we have an oracle $\mathcal{O}(x)$, which returns $h$ defined below:
- Compute $u = m(x)\ \text{mod}\ (p-1)$.
- Compute $h = g^u\ \text{mod}\ p$.
We are given 17 oracle calls. After that, we are given $x_1, x_2, …, x_{100}$. The objective is to find $0 \leq y_1, y_2, …, y_{100} < p$ such that $y_i \equiv g^{\text{m}(x_i)}\ (\text{mod}\ p)$ for all $i = 1, 2, …, 100$.
kompot_512 🔥⌗
- Solves: 15/346
- Difficulty: ⭐⭐⭐
- Tags:
math
- Author: @carllondahl
Definition. If $f$ is a rational function of degree 1, then it can be represented by
$$f(x) = \frac{ax + b}{cx + d}$$
for some constants $a, b, c, d$.
Let $p$ be a prime. Define the addition (denoted by $\oplus$) of two rational functions of degree 1 (namely $f(x)$ and $g(x)$) under modulo $p$ by $f \oplus g := f(g(x))\ \text{mod}\ p$, i.e.,
$$\begin{aligned} & f(x) = \frac{a_1 x + b_1}{c_1 x + d_1}, g(x) = \frac{a_2 x + b_2}{c_2 x + d_2} \\ \qquad & \Longrightarrow f(x) \oplus g(x) = \frac{a_1 \frac{a_2 x + b_2}{c_2 x + d_2} + b_1}{c_1 \frac{a_2 x + b_2}{c_2 x + d_2} + d_1} = \frac{(a_1a_2 + b_1c_2) x + (a_1b_2 + b_1d_2)}{(c_1a_2 + d_1c_2) x + (c_1b_2 + d_1d_2)}. \end{aligned}$$
We are given $f$ and $g$ defined below:
$$f(x) = \frac{x + 2}{3x + 4}, \quad g(x) = \frac{2x + 1}{13x + 37}.$$
Four numbers $x_0, x_1, y_0, y_1 \in [0, 2^{128})$ are randomly generated (not given). We are also given $A$ and $B$ defined by
$$\begin{aligned} & A = \underbrace{f \oplus f \oplus … \oplus f}_{x_0\ f\text{’s}} \oplus \underbrace{g \oplus g \oplus … \oplus g}_{x_1\ g\text{’s}}, \\ & B = \underbrace{f \oplus f \oplus … \oplus f}_{y_0\ f\text{’s}} \oplus \underbrace{g \oplus g \oplus … \oplus g}_{y_1\ g\text{’s}}. \end{aligned}$$
Define $C$ by
$$C = \underbrace{f \oplus f \oplus … \oplus f}_{(x_0 + y_0)\ f\text{’s}} \oplus \underbrace{g \oplus g \oplus … \oplus g}_{(x_1 + y_1)\ g\text{’s}}.$$
The objective is to recover $C$.
WeedSolomon 420⌗
- Solves: 3/346
- Difficulty: ❓
- Tags: ?
- Author: @carllondahl
PlaidCTF 2022⌗
pressure⌗
- Solves: 18/431
- Difficulty: ⭐⭐
- Tags:
ecc
,private set intersection
- Author: mserrano
Notations. Denote $G$ be a generator of the curve ED25519. Let also $\mathcal{P}$ be the set of points on that curve.
Also, if $k \in \mathbb{Z}$ and $S \in \mathcal{P}$, the set $k \cdot S$ is given by $\{k Q \in \mathcal{P} : Q \in S\}$.
When connected to the server, the below private parameters are randomly generated:
- $r \in [1, 2^{32})$,
- $n \in [128, 256]$,
- $(x_0, …, x_{n-1}) \in \{1, 2, …, 255\}^n$, and
- $b_1, b_2 \in [0, 2^{512})$.
It is used to generate a secret set $\mathcal{S}$ with $n + 4096$ entries:
- [The $n$] $\text{SHA512}(25037 \cdot r \cdot x_i + i) \cdot G \in \mathcal{S}$ for $i = 0, 1, …, n-1$.
- [The 4096] $\text{SHA512}(k + 4096 \cdot (r\ \text{mod}\ k)) \cdot G \in \mathcal{S}$ for $k = 1, 2, …, 4096$.
The client (us) interacts with the server with the below procedures:
- The client sends a set $A_1 \subseteq \mathcal{P}$ to the server.
- The server computes $T = b_1 \cdot A$ and $B_1 = b_1 \cdot \mathcal{S}$ and sends them to the client.
- The server computes $B_2 = b_2 \cdot \mathcal{S}$ and sends it to the client.
- The client sends sets $A_2, B_2' \subseteq \mathcal{P}$ to the server.
- The server checks if $\left|B_2\right| = \left|B'_2\right|$ and $B_2 \cap B'_2 = \phi$ and $B'_2 = b_2 \cdot A$. If that is the case, the server sends the flag to the client.
The goal is to win the flag from the server.
choreography⌗
- Solves: 14/431
- Difficulty: ⭐⭐
- Tags:
block cipher
- Author: @ubuntor
The challenge defined two ciphers encrypt1
and encrypt2
which encrypts a 4-byte message into a 4-byte ciphertext using a 4-byte key. Hereby sbox
is a permutation of $\mathbb{Z}_{256}$ and ROUNDS = 2**22 + 2
:
def encrypt1(k, plaintext):
a,b,c,d = plaintext
for i in range(ROUNDS):
a ^= sbox[b ^ k[(2*i)&3]]
c ^= sbox[d ^ k[(2*i+1)&3]]
a,b,c,d = b,c,d,a
return bytes([a,b,c,d])
def encrypt2(k, plaintext):
a,b,c,d = plaintext
for i in range(ROUNDS)[::-1]:
b,c,d,a = a,b,c,d
c ^= sbox[d ^ k[(2*i)&3]]
a ^= sbox[b ^ k[(2*i+1)&3]]
return bytes([a,b,c,d])
When connected to the server, a 4-byte key $k$ is generated. We can send 1000 4-byte plaintexts $m_1, …, m_{500}, m'_1, …, m'_{500}$ to the server. After that, we will obtain 1000 4-byte ciphertexts $\text{Enc}_1(k, m_1), …, \text{Enc}_1(k, m_{500}), \text{Enc}_2(k, m'_1), …, \text{Enc}_2(k, m'_{500})$. The goal is to recover $k$ in 30 seconds.
ångstromCTF 2022⌗
log log log⌗
- Solves: 104/1319
- Difficulty: ⭐
- Tags:
dlog
- Author: lamchcl
Suppose that $p$ and $q$ are two primes such that $p = 2^{1024} q + 1$. Let $g \in \text{GF}(p)$ be a generator and $h \equiv g^x\ \text{mod}\ p$ for some hidden $x$. We are given $p$, $g$ and $h$ and the goal is to recover $x$.
q = 127049168626532606399765615739991416718436721363030018955400489736067198869364016429387992001701094584958296787947271511542470576257229386752951962268029916809492721741399393261711747273503204896435780180020997260870445775304515469411553711610157730254858210474308834307348659449375607755507371266459204680043
p = 2**1024 * q + 1
g = 3
h = 22167430376059430630679676235652972242459549427184424487101004659078731951275684400544395455032520211526504936260764167543579962894859895105461241638191329157341317508524604123528869569970436522398088133282816501026124675867597303023053315921006794737150458893962604878313958214001541026011431916550491653311353413427974497947502149907519824065494644815580044942957676947079119519638286167265601768018850753567210484166464342762618682061366667502051134347228205613775687498269608568148198217826596701451568949937835734503519735835665755712108573943924004834183073368205468093930976680849195434185471527862856627210807
Strike-Slip Fault⌗
- Solves: 50/1319
- Difficulty: ⭐⭐
- Tags:
rsa
- Author: lamchcl
We are given a RSA public key $(n, e)$ and the encrypted flag $c$. Denote $d$ be the private exponent, and $d'$ to be $d$ with three bits flipped. We are also given
$$m' = c^{d'}\ \text{mod}\ n.$$
The goal is to recover the flag.
Prophet⌗
- Solves: 45/1319
- Difficulty: ⭐⭐
- Tags:
prng
- Author: aplet123
Let $\mathcal{R}$ be the PRNG that is used in the math
package in Golang 1.18 with a hidden 64-bit seed. Let $v_k$ be the $k$-th 64-bit output (zero-indexed) from $\mathcal{R}$. We are given
- the encrypted flag (the flag XOR-ed with $v_{100000}, v_{100001}, v_{100002}$ and $v_{100003}$), and
- 607 non-consecutive outputs: $v_{n_0}, v_{n_1}, …, v_{n_{606}}$.
Here $n_0 = 100004$ and $n_{k+1} = n_k + 1 + (k\ \text{mod}\ 13)$ for all $k \geq 0$. The objective is to recover the flag.
RSA-AES 🔥⌗
- Solves: 36/1319
- Difficulty: ⭐⭐
- Tags:
aes
,rsa
- Author: lamchcl
We are given a RSA exponent $(n, e)$ and the encrypted flag $c$ (this is unchanged for all server connections). Upon connecting to the server, a 32-byte key $\mathcal{K}$ and a 16-byte IV (used for AES-CBC) are generated.
n = 0xbb7bbd6bb62e0cbbc776f9ceb974eca6f3d30295d31caf456d9bec9b98822de3cb941d3a40a0fba531212f338e7677eb2e3ac05ff28629f248d0bc9f98950ce7e5e637c9764bb7f0b53c2532f3ce47ecbe1205172f8644f28f039cae6f127ccf1137ac88d77605782abe4560ae3473d9fb93886625a6caa7f3a5180836f460c98bbc60df911637fa3f52556fa12a376e3f5f87b5956b705e4e42a30ca38c79e7cd94c9b53a7b4344f2e9de06057da350f3cd9bd84f9af28e137e5190cbe90f046f74ce22f4cd747a1cc9812a1e057b97de39f664ab045700c40c9ce16cf1742d992c99e3537663ede6673f53fbb2f3c28679fb747ab9db9753e692ed353e3551
e = 0x10001
We are allow to interact with the server by sending $c \in [0, n)$. We will then obtain $s$:
$$s := \text{AES-CBC}_\mathcal{K}(c^d\ \text{mod}\ n),$$
where $d$ is the private exponent of RSA, and the IV used in $\text{AES-CBC}$ is the last ciphertext block (or IV if no encryptions are done yet). The objective is to recover the flag.