Cryptography

Challenge
Link

Familiar (100 pts)

Elysium (244 pts)

Familiar (100 pts)

Description

-

Solution

Diberikan kode berikut

def encode(data):
    charset = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
    padd = "="

    binstr = "".join(format(byte, "08b") for byte in data)
    padding = (5 - len(binstr) % 5) % 5
    binstr += "0" * padding
    groups = [binstr[i:i+5] for i in range(0, len(binstr), 5)]

    result = ""
    for group in groups:
        dec = int(group, 2)
        result += charset[dec]

    result += padd * (padding // 2)
    return result

FLAG = "flag{fake_flag_dont_submit}"
print(encode(FLAG.encode()))

Kode tersebut melakukan konversi dari 8 bit ke 5 bit lalu nilai dari 5 bit dikonversikan ke nilai pada charset. Jadi untuk mendapatkan plaintextnya tinggal dapatkan nilai 5 bit (dari index) lalu knoversi ke 8 bit. Berikut solver yang kami gunakan

Flag : INTECHFEST{WhY_W0ulD_AnY0n3_Us3_Th1S_Enc0D1nG?}

Elysium (244 pts)

Description

-

Solution

Diberikan kode berikut

Add menjalankan operasi 288*G + 21*P . Karena kita tahu nilai G maka kita bisa kurangkan saja Q dengan 288*G untuk mendapatkan 21*P. Pada ecc terdapat konsep public dan private key dalam bentuk Q = nP dimana Q merupakan public key, n private key, dan P adalah base point. Jadi untuk mendapatkan P disini kita bisa lakukan inverse nilai n dengan order dari Q lalu kalikan dengan Q https://crypto.stackexchange.com/questions/86663/how-to-find-the-base-point-given-public-and-private-key-and-ec-parameters-exceptarrow-up-right atau dalam bentuk persamaan adalah P = 21^-1 * Q. Berikut solver yang kami gunakan

Flag : INTECHFEST{ECC_FUNd4m3nt4l}

Last updated