from Crypto.Util.number import bytes_to_long n = 73542616560647877565544036788738025202939381425158737721544398356851787401183516163221837013929559568993844046804187977705376289108065126883603562904941748653607836358267359664041064708762154474786168204628181667371305788303624396903323216279110685399145476916585122917284319282272004045859138239853037072761 e = 0x10001 flag = bytes_to_long(open("flag.txt", "rb").read()) print(f"n = {n}") print(f"e = {e}") print(f"ct = {pow(flag, e, n)}") print(""" Transcription of image: 735426165606478775655440367887380252029393814251587377215443983568517874011835161632 289108065126883603562904941748653607836358267359664041064708762154474786168204628181 9145476916585122917284319282272004045859138239853037072761 108294440701045353595867242719660522374526250640690193563048263854806748525172379331 341078269246532299656864881223 679098724593514422867704492870375465007225641192338424726642090768164214390632598250 39563231146143146482074105407 (n, p, q) """)
謎の画像もついている
n = 73542616560647877565544036788738025202939381425158737721544398356851787401183516163221837013929559568993844046804187977705376289108065126883603562904941748653607836358267359664041064708762154474786168204628181667371305788303624396903323216279110685399145476916585122917284319282272004045859138239853037072761 e = 65537 ct = 2657054880167593054409755786316190176139048369036893368834913798649283717358246457720021168590230987384201961744917278479195838455294205306264398417522071058105245210332964380113841646083317786151272874874267948107036095666198197073147087762030842808562672646078089825632314457231611278451324232095496184838 Transcription of image: 735426165606478775655440367887380252029393814251587377215443983568517874011835161632 289108065126883603562904941748653607836358267359664041064708762154474786168204628181 9145476916585122917284319282272004045859138239853037072761 108294440701045353595867242719660522374526250640690193563048263854806748525172379331 341078269246532299656864881223 679098724593514422867704492870375465007225641192338424726642090768164214390632598250 39563231146143146482074105407 (n, p, q)
よくわからないけどTranscription of imageは
p = 108294440701045353595867242719660522374526250640690193563048263854806748525172379331????341078269246532299656864881223 で
q = 679098724593514422867704492870375465007225641192338424726642090768164214390632598250????39563231146143146482074105407 ということらしい。に合わせてp, qの桁数を揃えればunivariate coppersmith methodで解ける
from Crypto.Util.number import long_to_bytes n = 73542616560647877565544036788738025202939381425158737721544398356851787401183516163221837013929559568993844046804187977705376289108065126883603562904941748653607836358267359664041064708762154474786168204628181667371305788303624396903323216279110685399145476916585122917284319282272004045859138239853037072761 P.<x> = PolynomialRing(Zmod(n), implementation='NTL') poly = 108294440701045353595867242719660522374526250640690193563048263854806748525172379331 * 10^71 + x * 10^30 + 341078269246532299656864881223 f = poly.monic() d_p = f.small_roots(X=10^41, beta=41/155)[0] p = int(poly(d_p)) q = n // p assert p * q == n e = 65537 ct = 2657054880167593054409755786316190176139048369036893368834913798649283717358246457720021168590230987384201961744917278479195838455294205306264398417522071058105245210332964380113841646083317786151272874874267948107036095666198197073147087762030842808562672646078089825632314457231611278451324232095496184838 d = pow(e, -1, (p-1)*(q-1)) print(long_to_bytes(pow(ct,d,n)))