Back to writeups
FlagYardcryptoEasysolved

FastRsa

12 Jul 2026 · by 0xIDA

Solvers

FastRsa

Author: 0xIDA
Platform: FlagYard · Category: crypto · Difficulty: Easy

Solvers

Summary

Interactive RSA challenge: 14 timed rounds print n, m^3 mod n, and (m+1)^3 mod n. Recover m each round with Franklin-Reiter (related messages, e=3, difference 1). After all rounds the server prints the flag.

Solution

Step 1: Analyze chall.py

Server generates RSA modulus from two primes near 2^b, encrypts random m with e=3, and also encrypts m+1. Five-second timeout per answer.

Step 2: Franklin-Reiter for m and m+1

Polynomial GCD of x^3 - c1 and (x+1)^3 - c2 over Z/nZ yields linear factor x - m.

#!/usr/bin/env python3
from pwn import *

def egcd(a, b):
    if b == 0:
        return a, 1, 0
    g, x, y = egcd(b, a % b)
    return g, y, x - (a // b) * y

def modinv(a, n):
    g, x, y = egcd(a % n, n)
    if g != 1:
        raise ValueError("no inv")
    return x % n

def franklin_reiter_m_m1(n, c1, c2):
    A, B = 3 % n, 3 % n
    C = (1 - c2 + c1) % n
    invA = modinv(A, n)
    b = (B * invA) % n
    c = (C * invA) % n
    p = (b * b - c) % n
    q = (b * c - c1) % n
    return (-q * modinv(p, n)) % n

r = remote("tcp.flagyard.com", PORT)  # from start_instance
for i in range(1, 15):
    n = int(r.recvline())
    c1 = int(r.recvline())
    c2 = int(r.recvline())
    m = franklin_reiter_m_m1(n, c1, c2)
    r.recvuntil(b"Enter Number : ")
    r.sendline(str(m).encode())
    r.recvuntil(b"============================\n")
    r.recvuntil(b"============================\n")
print(r.recvall(timeout=5))

Instance address obtained via Flagyard MCP start_instancetcp.flagyard.com:<port>.

Flag

FlagY{559bf2a4d502fad715f6949b6aca6f96}

Live submitted: success (2026-07-12).

Tools

  • Flagyard MCP (start_instance, submit_flag)
  • pwntools remote
  • Franklin-Reiter pure Python