Cryptography

Challenge
Link

choose exponent

CryptoVault

Knapsack

choose exponent

Description

-

Solution

Diberikan source code sebagai berikut

from Crypto.Util.number import getPrime, bytes_to_long

FLAG = b"COMPFEST15{REDACTED}".ljust(256, b"\x00")

class RSA:
    def __init__(self):
        self.p = getPrime(1024)
        self.q = getPrime(1024)
        self.n = self.p * self.q
        # you can choose your own public exponent
        # self.e = 65537

    def encrypt(self, m, e):
        return pow(m, e, self.n)

    def decrypt(self, c, d):
        return pow(c, d, self.n)


def main():
    print("Welcome to RSA challenge!")
    print("In this challenge you can choose your own public exponent")

    rsa = RSA()
    m = bytes_to_long(FLAG)
    count = 0
    while count < 3:
        print("What do you want to do?")
        print("1. Get encrypted flag")
        print("2. Exit")

        option = input(">> ")
        if option == "1":
            e = int(input("Enter your public exponent (e cannot be 1 and even): "))
            if e == 1 or e % 2 == 0:
                print("loh gak bahaya tah")
                continue
            c = rsa.encrypt(m, e)
            print(f"Here is your encrypted flag: {c}")
            count += 1
        elif option == "2":
            print("Bye!")
            exit()
        else:
            print("Invalid option")
            continue
    
    print("You have reached maximum number of public exponent")

if __name__ == "__main__":
    main()

Jadi intinya kita bisa kontrol nilai e, karena disini nilai modulus tidak diketahui maka kita perlu leak terlebih dahulu dengan persamaan berikut

Dengan melakukan gcd pada k1*n dan k2*n kita akan mendapatkan nilai n. Selanjutnya, karena kita menggunakan nilai exponent yang kecil namun terdapat padding, maka lakukan eliminasi terhadap padding dengan melakukan inverse terhadap 256 (padding b”\x00) ^ i untuk nilai kurang dari 256 kemudian tinggal integer root. Berikut solver yang kami gunakan

Flag : COMPFEST15{bezout_identity_is_key_8316a2afd2}

CryptoVault

Description

-

Solution

Diberikan source code sebagai berikut

Dapat dilihat bahwa message_hash tidak dilakukan hash, jadi kita bisa input plaintext pada message_hash. Mencari informasi mengenai hal tersebut kami menemukan referensi berikut https://crypto.stackexchange.com/questions/48716/is-it-secure-to-ecdsa-sign-a-public-key-without-hashing-it-firstarrow-up-right .

Jadi kita bisa menginputkan null byte unutk message_hash dan nilai r,s == x_a , untuk nilai x_a kami dapatkan dengan cara menambahkan print .x() pada fungsi verifies (/Users/kosong/.pyenv/versions/3.11.2/lib/python3.11/site-packages/ecdsa/ecdsa.py

).

Dapat nilai x_a yaitu 93233629630266104566162329194337469407578449363377301369248925679328375971650, selanjutnya tinggal kirim ke server.

Flag : COMPFEST15{mU57_vErIFy_TH3_h4SH_373dd88e55}

Knapsack

Description

-

Solution

Diberikan source code sebagai berikut

Tebak panjang key dengan sedikit bruteforce dan statistik (karena panjangnya/bit_length tidak selalu disekitar 113-114) . Selanjutnya setelah dapat key_size yang mungkin perlu dilakukan pengembalian nilai public key, karena kita tahu nilai dari message nya sepanjang 1194 bytes jadi kita cukup lakukan inverse matrix untuk dapat nilai public key. Setelah dapat public key langkah selanjutnya manfaatkan LLL untuk menyelesaikan subset sum problem, karena solver saya untuk SSP sejenis hilang, maka gunakan solusi di ch sebagai referensi. Berikut solver yang kami gunakan

Flag : COMPFEST15{D4ngerr_LLL_1s_Ev3ryWh3r3_ed2c699bb3}

Last updated