importsysfromCrypto.Util.numberimport*fromflagimportflagdefdie(*args):pr(*args)quit()defpr(*args):s=" ".join(map(str,args))sys.stdout.write(s+"\n")sys.stdout.flush()defsc():returnsys.stdin.buffer.readline()defkeygen(r):assertlen(r)<=60v,l=int(r,16),len(r)e=(64-l)<<4u,w=v<<e,2**(e>>1)for_inrange(110):r=getRandomRange(1,w)p=r+uwhilep>>e==v:ifisPrime(p):whileTrue:x,y=[2*getRandomNBitInteger(p.bit_length()>>2)for_in'__']P,Q=x*p|1,y*p|1ifisPrime(P)andisPrime(Q):returnP,Qp+=1defmain():border="|"pr(border*72)pr(border,f"Welcome to Blex task! Your mission is break our complex cryptosystem",border)pr(border*72)pr(border,f"please provide your desired seed to generate key in hex:")seed=sc().decode()try:_b=len(seed)<=60andint(seed,16)>=0except:die(border,f"The seed you provided is either not in hex or is not valid!")if_b:pr(border,f"Generating keypair, please wait...")p,q=keygen(seed)e,n=65537,p*qm=bytes_to_long(flag)assertm<nc=pow(m,e,n)pr(border,f'n = {n}')pr(border,f'c = {c}')else:die(border,f"Your seed is too long!!!")if__name__=='__main__':main()
سرور با دریافت یک seed، اعداد اول موردنیاز رمزنگاری RSA را تولید می کند. با تحلیل کد می فهمیم که مقدار و طول seed روی متغیرهای w ,u (خطهای 19 تا 21) تاثیر داره و در ادامهاش روی مقدار p (خط 24) اثر داره. پس باید طولانی ترین و کم ارزش ترین حالت ممکن برای seed در نظر بگیریم تا اندازه اعداد اول تا جای ممکن کوچک بشه. با توجه به کد سرور حداکثر طول که می توانیم برای سرور بفرستیم 60 کاراکتر hex (خط 42) است اما در ادامهی کد چون این طول باعث می شود مقدار m ازn بزرگتر شود باید تعداد کاراکتری کاهش دهیم و ارسال کنیم. پس با سعی و خطا متوجه میشیم که بهترین حالت برای seed یک رشته hex با طول حدود 50 کاراکتر hex است و بهترین مقدار 0 است که با عث صفر شدن متغیرهای v, u می شود.
seed='0'*50
پس با ارسال این مقدار به سرور کاری میکنیم کوچکترین حالت ممکن برای پیمانه n تولید شود.
باتوجه عکس بالا بنظر مقدار n قابل تجزیه (factorzation) است. اول سایت factodb چک کردم که فاکتور های آن در سایت نبود پس با ابزار yafu مقدارهای p و q بدست آوردیم.
بعد از بدست آوردن p و q، مقدار c با استفاده از کد زیر رمزگشایی می کنیم و فلگ بدست میاریم: