Gafna Blog

Back

Another RSA Challenge#

RSA di gitu gituin challenge

DIberi 2 file yaitu file skrip python dan outputnya, isinya kek gini:

alt text

Pertama, kita lihat dulu skrip generatornya. Intinya, skrip ini melakukan beberapa hal:

  1. Bikin sebuah modulus n1 yang merupakan hasil perkalian dari rand (antara 2-12) bilangan prima 512-bit.

  2. Bikin modulus RSA biasa, n2 = p\*q.

  3. Flag-nya dienkripsi pake e1 = 0x10001 dengan modulus gabungan N = n1 - n2.

  4. Kita dikasih beberapa leak atau bocoran: n1, n2, leaked_phi (beberapa bit terakhir dari phi(n1)), ct (ciphertext), dan dua nilai aneh hehe1 & hehe2.

Untuk dekripsi, kita butuh private key d1, yang artinya kita butuh phi(N). Karena n1 dan n2 koprima, maka phi(N) = phi(n1) \* phi(n2). Jadi, misi kita dibagi dua: cari phi(n1) dan cari phi(n2).

Langkah 1: Membongkar n2

Ini bagian yang bikin kita muter-muter. Leak yang kita punya untuk n2 adalah:

  • hehe1 = d2^3 mod n2
  • hehe2 = phi2^3 mod n2

Hubungan antara d2 dan phi2 adalah 3 _ d2 = k _ phi2 + 1 untuk suatu integer k. Karena d2 < phi2, nilai k ini pasti kecil, kemungkinannya cuma 1 atau

Kita bisa bikin dua polinomial yang punya akar yang sama, yaitu X = p+q-1.

  1. Dari hehe2: kita tahu phi2^3 ≡ hehe2 (mod n2). Karena phi2 = n2 - X, ini bisa disederhanakan jadi X^3 + hehe2 ≡ 0 (mod n2). Jadilah polinomial pertama: P1(x) = x^3 + hehe2

  2. Dari hehe1: kita tahu d2^3 ≡ hehe1 (mod n2). Setelah dijabarkan, ini bisa jadi polinomial kedua dalam X: P2(x) = (-2x+1)^3 - 27\*hehe1. (Kita pakai k=2 karena secara matematis ini yang paling valid).

Kita bisa pakai metode GCD Polinomial buat nemuin akarnya. Dengan sedikit manipulasi aljabar (mengeliminasi suku pangkat tertinggi), kita bisa dapet persamaan linear buat X. Dari situ, nilai X langsung ketemu.

Setelah X dapet, kita bisa:

  • Hitung s = X+1.
  • Faktorkan n2 dengan mencari akar dari y^2 - s\*y + n2 = 0.
  • Dapet p dan q, lalu hitung phi2 = (p-1)\*(q-1).

Langkah 2: Mencari phi(n1)

Kita punya leaked_phi, yaitu bit-bit terakhir dari phi(n1). Bit-bit awalnya hilang.

  1. Cari rand: rand ini jumlah bilangan prima yang menyusun n1. Cara paling bener buat nebaknya adalah rand = round(n1.bit_length() / 512). Di kasus kita (setelah dapet data yang bener), rand jadi 11. 9.

  2. Tebak Bit yang Hilang: Kita bisa aproksimasi nilai phi(n1) itu deket banget sama n1. Selisihnya, n1 - phi(n1), kira-kira sebesar rand dikali 2^(BITS\*(rand-1)). Dari sini, kita bisa tebak bit-bit awal phi(n1) yang hilang dengan rumus phi_H ≈ n1_H - rand. 10.

  3. Brute-force: Karena ini cuma tebakan, kita tinggal looping di sekitar nilai tebakan itu. Kita coba beberapa nilai i di range(-250, 250), gabungkan dengan leaked_phi, dan coba dekripsi. Salah satunya pasti bener

Langkah 3: Dekripsi Final

Setelah phi1 (dari langkah 2) dan phi2 (dari langkah 1) ketemu

  1. Hitung totient total: PHI_total = phi1 \* phi2.
  2. Hitung private key: d1 = inverse(e1, PHI_total).
  3. Dekripsi ciphertext: m = pow(ct, d1, n1 \* n2).
  4. Ubah m jadi bytes: flag_bytes = long_to_bytes(m).

Berikut untuk skrip solper nya

Flag: Meta4Sec{B1M1ll4H_G4_D1ON3SH0T_LLM}
Another RSA Challenge
https://gafnaa.vercel.app/blog/cyberops/crypto/another-rsachallenge
Author Gafna Al Faatiha Prabowo
Published at August 1, 2025