#!/usr/bin/python3 from Crypto.Util.number import getPrime, bytes_to_long import flag assert(len(flag.flag) == 131) p = getPrime(512) q = getPrime(512) N = p * q phi = (p - 1) * (q - 1) e = 0x10001 d = pow(e, -1, phi) flag = bytes_to_long(flag.flag) c = pow(flag, e, N) print(f'N = {N}') print(f'e = {e}') print(f'c = {c}') print(f'd = {d}')
が渡されているRSA で、平文が131バイト = 1048bit あり、よりわずかに大きい。したがってとなっている。
interkosenctfx | strengthened と同様に、複合したあと適当にを足しまくれば良い
N = 65667982563395257456152578363358687414628050739860770903063206052667362178166666380390723634587933595241827767873104710537142458025201334420236653463444534018710274020834864080096247524541536313609304410859158429347482458882414275205742819080566766561312731091051276328620677195262137013588957713118640118673 e = 65537 c = 58443816925218320329602359198394095572237417576497896076618137604965419783093911328796166409276903249508047338019341719597113848471431947372873538253571717690982768328452282012361099369599755904288363602972252305949989677897650696581947849811037791349546750246816657184156675665729104603485387966759433211643 d = 14647215605104168233120807948419630020096019740227424951721591560155202409637919482865428659999792686501442518131270040719470657054982576354654918600616933355973824403026082055356501271036719280033851192012142309772828216012662939598631302504166489383155079998940570839539052860822636744356963005556392864865 m = pow(c, d, N) k = 0 while True: f = (m + k*N).to_bytes(131, "big").strip(b"\0") if len(f) == 131: print(f) k += 1