money gone, wallet also gone (100 pts)

help me find my wallet please :c

Author: tipsen

Diberikan file chall.py dan encrypted_memory.txt. Isi file chall.py adalah sebagai berikut.

import hashlib
import random

methods = ['md5', 'sha256', 'sha3_256', 'sha3_512', 'sha3_384', 'sha1', 'sha384', 'sha3_224', 'sha512', 'sha224']

def random_encrypt(x) :
    method = random.choice(methods)
    hash_obj = hashlib.new(method)
    hash_obj.update(x.encode())
    return hash_obj.hexdigest()

def main() :
    message = open("tipsen_memory.txt", "r").read()
    enc = []

    for char in message :
        x = (ord(char) + 20) % 130
        x = hashlib.sha512(str(x).encode()).hexdigest()
        x = random_encrypt(x)
        enc.append(x)

    with open('encrypted_memory.txt', 'w') as f :
        f.write(str(enc))

if __name__ == "__main__" :
    main()

Pada kode di atas, intinya adalah setiap karakter pesan pada file asli (tipsen_memory.txt) di-hash dengan salah satu algoritma hash random.

Maka dari itu, kita bisa pertama-tama membuat sebuah database berisi semua kemungkinan hash dari semua karakter printable yang ada di ascii. Bentuk database tersebut adalah sebuah dictionary yang terdiri dari 1 karakter sebagai key, dan valuenya adalah sebuah list berisi hash dari karakter tersebut dalam berbagai algoritma yang ada di list โ€œmethodsโ€. Kira-kira akan seperti ini:

Setelah itu, kita akan baca masing-masing hash yang ada di encrypted_memory.txt. Untuk setiap hash, kita akan cari ke dalam list-list yang ada di dictionary. Jika ketemu, kita akan mencatat key (char aslinya) dan menambahkannya ke sebuah string baru. String tersebut kemudian kita print. Berikut adalah kode lengkapnya.

Berikut adalah hasilnya.

Ternyata ada chall lanjutan :D. Di sini, jika kita lihat pada kodenya, kita akan menyadari bahwa ada flag di-encrypt sebanyak 16 kali menggunakan 16 n yang berbeda. Masalahnya, cara pembangkitan n tersebut tidak aman, karena bilangan prima yang digunakan untuk suatu nilai n, digunakan lagi pada n setelahnya. Jadi, kita tinggal ambil GCD dari dua nilai n terakhir, dan kita dapatkan bilangan prima q.

Nilai q ini bisa kita gunakan untuk membagi nilai n sebelumnya dan kita akan mendapatkan p. Lalu nilai p ini kita gunakan lagi untuk membagi nilai n sebelumnya, begitu seterusnya. Pada akhirnya kita bisa mendapatkan private key d untuk semua round enkripsi dari flag. Berikut adalah solver lengkapnya.

Flag: COMPFEST16{d0nt_F0rg3t_ur_w4ll3T_4g4in_0r_3lse_ur_m0n3y_1s_G0ne_47dcdc753c}

Last updated