Harukaze pipit berhasil menangkap pesan rahasia dari sebuah sekte rahasia, ia juga mendapatkan bocoran yang dapat membantunya.
Author: AnYujin
Kita diberikan source code beserta outputnya.
chall.py
from Crypto.Util.number import*from sage.all import*import randomdefencrypt(p): p=bin(p)[2:] p='0'*(len(p)%64)+p p=[int(p[i:i+16],2)for i inrange(0,len(p),16)] key=random.getrandbits(16) p=[i^key for i in p]return pflag=b'REDACTED'p=getPrime(1024)q=getPrime(1024)e=0x10001n=p*qtemp = p &((1<<37)-1)p >>=81p <<=81p += tempp =encrypt(p)flag=bytes_to_long(flag)enc=pow(flag,e,n)print(f'enc : {enc}')print(f'n : {n}')print(f'e : {e}')print(f'leaked_p :{p}')
out
Jadi, intinya adalah sebagai berikut:
p terdiri dari 1024 digit dalam binary
81 digit terakhir dari p dihapus dengan bitwise shift
tapi, 37 digit terakhirnya di-preserve/tetap ada
jadi, sekarang di tengah ada (81-37 = 44) digit yang berupa "0000..."
pembagiannya kira2 seperti berikut
[943][44][37]
yang depan diketahui, yang tengah tidak diketahui, yang belakang diketahui
Kita bisa me-recover nilai p dengan me-reverse fungsi encrypt() dan memasukkan nilai leaked_p. Tapi, andaikan sudah kita balik pun, nilai p tersebut bukanlah nilai p asli, melainkan nilai p yang 44 digit-nya hilang. Oleh karena itu, tugas kita adalah me-recover p asli dari p yang nilai bit-nya hilang tersebut.
Sebelum itu, kita cari tahu dulu nilai p yang nilai bit-nya hilang (setelahnya akan saya sebut sebagai p_new) dengan membalikkan fungsi encrypt(). Apabila kita membaca cara kerja fungsinya, tampak bahwa key-nya di-random lalu di-xor-kan dengan chunk2 dari nilai p_new yang masing2 terdiri dari 16-bit. Mengingat ada 44 digit dari nilai p_new yang berupa "0000...", maka setidaknya ada 2 chunk yang hasil pada leaked_p-nya merupakan key nya itu sendiri. Dan benar saya, di leaked_p, kita menemukan dua chunk beruntun yang memiliki nilai sama. Kemungkinan besar ini adalah key-nya.
key found
Berikut adalah kode untuk mendapatkan nilai p_new.
Nah sekarang, kita akan me-recover nilai p asli dari p_new.