Sekte Pemuja Osha Oshi [unfinished]

Deskripsi

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 random

def encrypt(p):
	p=bin(p)[2:]
	p='0'*(len(p)%64)+p
	p=[int(p[i:i+16],2) for i in range(0,len(p),16)]
	key=random.getrandbits(16)
	p=[i^key for i in p]
	return p

flag=b'REDACTED'
p=getPrime(1024)
q=getPrime(1024)
e=0x10001
n=p*q

temp = p & ((1<<37)-1)
p >>= 81
p <<= 81
p += temp
p = 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.

Last updated