###### tags: `cakeCTF` `crypto`
# [crypto] Together as one - cakeCTF 2021
## Challenge
RSA問題
以下の値が貰える。
$$
n = p \cdot q \cdot r\\
c \equiv m^{\text{0x10001}} \pmod{n} \\
x \equiv (p + q)^r \pmod{n}\\
y \equiv (p + q\cdot r)^r \pmod{n}
$$
## Solution
$x, y$をそれぞれ数論パワーで殴ることで、$p, q, r$を求めることができる。
まず、二項定理より
$$
\begin{eqnarray}
\left\{
\begin{array}{l}
x \equiv p^r + q^r \pmod{n} \\
y \equiv p^r + (qr)^r \pmod{n}
\end{array}
\qquad (1)
\right.
\end{eqnarray}
$$
となることがわかる。
ここで$q$を法としてみると、
$$
\begin{eqnarray}
\left\{
\begin{array}{l}
x \equiv p^r \pmod{q} \\
y \equiv p^r \pmod{q}
\end{array}
\right.
\end{eqnarray}
$$
となる。($\bmod{n}$は$k\cdot n$となり、$\bmod{q}$では当然0となる)
つまり法$q$において、$x$と$y$は合同である。よって、
$$
\begin{align}
x &\equiv y \pmod{q}\\
&= y + k\cdot q\\
x - y &= k\cdot q
\end{align}
$$
となり、$gcd(x-y, n)$から$q$を求めることができる。
次に、(1)から$r$を法としてみると
$$
\begin{eqnarray}
\left\{
\begin{array}{l}
x \equiv p + q \pmod{r} \\
y \equiv p \pmod{r}
\end{array}
\right.
\end{eqnarray}
$$
となる。(フェルマーの小定理より、$p^r\pmod{r} \equiv p$)
ここで、$x, y, p$が手元にあるので、
$$
\begin{align}
x &\equiv y + q \pmod{r}\\
x - y - q &\equiv 0 \pmod{r}\\
&= k\cdot r
\end{align}
$$
となり、$gcd(x - y - q, n)$から$r$を求めることができる。
以上より、$q, r$が求まったので$p$も求めることができ、フラグを入手できる。
```python=
from Crypto.Util.number import long_to_bytes, inverse, GCD
exec(open("./../distfiles/output.txt").read())
q = GCD(n, x-y)
r = GCD(n//q, y - (x - q))
p = n // (q * r)
assert n == p*q*r
d = inverse(0x10001, (p-1)*(q-1)*(r-1))
print(long_to_bytes(pow(c, d, n)))
```
```
$ python3 solver.py
b'cakeCTF{This_chall_is_inspired_by_this_music__Check_out!__https://www.youtube.com/watch?v=vLadkYLi8YE}\n'
```
問題名とフラグはTimmy Trumpetの[Diamonds](https://www.youtube.com/watch?v=vLadkYLi8YE)から