- Deleted all 14 dummy docs from DB + filesystem - Created 14 Gemastik warmup writeups + index via create_document API (DB-first) - ch1-ch12: encoding/stego/web/pwn basics - ch13: RSA small factors - ch14: RSA special integers via paper-search (GCD with paper appendix primes) - All 15 docs indexed and live at wiki.asepharyana.my.id
2.5 KiB
2.5 KiB
title, type, section, status, author, tags, path, created_at, updated_at, event, challenge, category, points, difficulty, flag
| title | type | section | status | author | tags | path | created_at | updated_at | event | challenge | category | points | difficulty | flag | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Slopped wave-2 — RSA Special Integers (Paper Search) | writeup | writeups | published | asep |
|
writeups/gemastik-2026-warmup/ch14-slopped-wave2.md | 2026-08-21T07:25:51.729Z | 2026-08-21T07:25:51.729Z | GEMASTIK 2026 Warmup | Slopped wave-2 — RSA Special Integers (Paper Search) | crypto | 501 | hard | GEMASTIK19{test_vector_of_listP_on_quant} |
Slopped wave-2 (501 pts) — Crypto / RSA "special integers"
File: chals.py — Kategori: crypto, misc
Challenge
p = #### (hidden_length)
q = #### (hidden_length)
n = p * q
print(n)
e = 0x10001
p = bytes_to_long(b'GEMASTIK19{...}') # flag hijacked as 'p'
c = pow(p, e, n)
print(c)
c = pow(p, e, n) dengan p = bytes_to_long(flag), e = 0x10001, n 2048-bit.
Analisis Serangan
Semua serangan standar gagal:
- Fermat (close primes): gap > 1.2×10^159
- ECM: tidak smooth (B1=43M)
- Pollard p-1: B=2M — tidak smooth
- ROCA: n mod M bukan pangkat 65537
- Wiener / Boneh-Durfee: e kecil berarti d besar
- Trial division ke 10M: bersih
Hint "paper search"
Hint dari ch13 ("you should use paper search mcp skill") mengarah ke paper akademik.
Paper mendefinisikan "special integer": n = p·q di mana kedua prima berbeda tepat 2 bit (popcount(p XOR q) = 2). Appendix Table S1 berisi 10 contoh (N, p, q) yang menggunakan kembali prima yang sama — inilah "sloppiness" wave-2: modulus challenge merekonstruksi ulang dua prima dari dua contoh berbeda.
Solusi
Hitung gcd(n, P_i) untuk setiap prima P_i di 10 contoh paper:
import math
from Crypto.Util.number import long_to_bytes
n = <2048-bit modulus from challenge>
e = 0x10001
c = <ciphertext>
# 10 contoh dari appendix paper, setiap contoh punya (p, q)
paper_examples = [...]
for ex in paper_examples:
for P in (ex.p, ex.q):
g = math.gcd(n, int(P))
if 1 < g < n:
p_factor = g
q_factor = n // g
break
phi = (p_factor - 1) * (q_factor - 1)
d = pow(e, -1, phi)
flag = pow(c, d, n)
print(long_to_bytes(flag))
# GEMASTIK19{test_vector_of_listP_on_quant}
Flag
GEMASTIK19{test_vector_of_listP_on_quant}