main.pyxxxxxxxxxxfrom sage.all import *from Crypto.Util.number import *
p = getPrime(1024)q = getPrime(1024)N = p*qe = 5
flag = open("flag.txt", "rb").read()
print(f'e = {e}')print(f'N = {N}')print(f'l = {len(flag)}')print(f'c = {pow(bytes_to_long(flag), e, N)}')output.pyxxxxxxxxxxe = 5N = 12738331786144976628408584962601932300503981320657758070592328404991407468813883686645414154009656690238190579172789903683404637273437397117457373561689012444619426823650785246522182691404988042475126388162721182642829957361466397613478409042980767743277584606227337490629695231723390631048248673270268876696120185173349837701768591415602973998294483589229947507282787032145262364771540599514486278946374659551934084334916633373157348397197599205131909762202122809096952440358033382655250548960242984611039926964337280304882882174539682794142960610875918130570131509376815338749964656662270835139574992464445560548559l = 43c = 68829034175580818037595385380486058481146119314176779392653265570684777934377061660231023209592412738533887287426451491081941388406918844870814300682923844554566803973117705604463199616847051219603692011646985814554709262873409703222220556412167145138331879306747358983145108299652047663942904777455736334417346180833984486051537873634676492222592723854998319668594793557450355021302157167591762956712631060579566159150846015743846084975678356683223634570347682709248173273897202941560635688805593516302480381214349
File main.py không hề có trick gì trong này cả. p và q được tạo ra bằng 1 cách rất tự nhiên để tránh việc factor được n một cách dễ dàng.
Do đó, việc tạo d bằng cách lấy e^-1 mod (p-1)*(q-1) rồi tính pow(c, d, n) để lấy flag là điều hoàn toàn bất khả thi nha 😗 (khả thi nếu mình có tầm 300 triệu năm gì đó để sống theo Google :))) Vì vậy, về mặt lí thuyết thì thuật toán này là bất khả xâm phạm. Nhưng mà, vấn đề lại nằm ở cái flag được mã hóa :3
l là độ dài của flag và bằng 43 bytes. Điều này suy ra được là flag chỉ có vỏn vẹn 43*8=344 bits thôi, dẫn đến việc flag^5 có tầm 344*5 = 1720 bits, nhỏ hơn n là 2048 bits. Một số có 1720 chữ số thì đương nhiên là phải nhỏ hơn số có 2048 chữ số rồi ;)
Mà ta lại có:
do
Vì vậy, để lấy flag, ta chỉ cần tính
xxxxxxxxxxBKSEC{5mALL-Fl@G-Small-eXp-mak3s-it-3a5y!!}