Cryptography

Challenge
Link

Baby RSA (100 pts)

Learning but Errors (410 pts)

Baby RSA (100 pts)

Solution

Diberikan source code sebagai berikut

from Crypto.Util.number import *

def gen_key():
    while True:
        p = getPrime(1024)
        q = 2 * p + 1
        if isPrime(q):
            break
    return p * q

n = gen_key()
e = 65537

flag = open("flag.txt", "rb").read()
m = bytes_to_long(flag)
c = pow(m, e, n)
print("n = ", n)
print("e = ", e)
print("c = ", c)

Karena equationnya simple, kita bisa gunakan fungsi solve pada sage untuk mendapatkan nilai p

Flag: CBC2024{is_the_safe_prime_in_the_room_with_us?}

Learning but Errors (410 pts)

Solution

Diberikan source code sebagai berikut

Kode diatas jika hanya c[i] += A[i][j] * m[j] maka merupakan matrix multiplication. Namun karena terdapat noise yaitu *e untuk setiap index i maka bukan hanya perkalian matrix namun terdapat perubahan di nilai akhirnya yaitu dikali dengan e. Atau bisa kita tuliskan

Jadi kalau kita bisa mendapatkan nilai e untuk setiap index i maka kita bisa lakukan multiplication inverse seperti biasa. Disini kita tahu bahwa nilai e adalah prima dengan panjang bit 16, idenya adalah melakukan faktorisasi prima untuk semua nilai c dan memfilter hanya yang 16 bit saja untuk menjadi kemungkinan nilai e. Karena setelah dicoba pada c di soal jumlahnya sangat sedikit (mayoritas hanya ada 1 nilai prima 16 bit untuk setiap index di c) maka kita bisa lakukan semua kemungkinan yang ada untuk masing-masing kemungkinan e pada setiap index. Jadi flownya adalah melakukan brute untuk kemungkinan e dimana e[i] sebagai pembagi untuk c[i] lalu tinggal multiplication inverse pada matrix. Berikut solver yang saya gunakan

Flag: CBC2024{whats_the_point_of_this_err0rzz}

Last updated