# war(sa)mup - zer0pts CTF 2021
###### tags: `zer0pts CTF 2021` `crypto`
## 問題概要
PKCS#1 v1.5を利用してRSAが実装されている。気になる点は以下:
- eが1337
- $m^e \mod N$と$\lfloor{\cfrac{m}{2}}\rfloor^e \mod N$が貰える
eがphiを互いに素であることはコードで確認されているので、特に問題なさそう。
パディングの実装も見た感じ怪しいところはない。
## 解法
5分ほど式を眺めると、いつも名前を忘れるFranklin Reiter's Attackであることが分かる。(名前は分からないので調べる。)
今回、$m_1 = 2m_2$あるいは$m_1 = 2m_2 + 1$の2通りが考えられる。
前者の場合、$2^e c_2 \mod N = c_1$となるはずだが、確認するとそうはならないので、$m_1 = 2m_2 + 1$であることが分かる。
```python=
with open("output.txt") as f:
n = int(f.readline().split("=")[1])
e = int(f.readline().split("=")[1])
c1 = int(f.readline().split("=")[1])
c2 = int(f.readline().split("=")[1])
def gcd(a, b):
while b:
a, b = b, a % b
return a.monic()
def franklinreiter(C1, C2, e, N, a, b):
P.<X> = PolynomialRing(Zmod(N))
g1 = (a*X + b)^e - C1
g2 = X^e - C2
result = -gcd(g1, g2).coefficients()[0]
return result
m = franklinreiter(c1, c2, e, n, 2, 1) * 2 + 1
print(int.to_bytes(int(m), 0x80, 'big'))
```
これを実行するとPKCS#1 v1.5でパディングされたフラグが貰える。
`zer0pts{y0u_g07_47_13457_0v3r_1_p0in7}`
## 感想
- warmupで良いと思う