주말에 이것저것 찾아보다가 새로운 워게임 사이트를 발견했다

Crypto - noisy

encrypt.py

from Crypto.Util.number import *

flag = "UNKNOWN"

p = getPrime(2048)
q = getPrime(2048)
e = 3
phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
N = p * q

a = getPrime(256)
b = getPrime(256)
flag = bytes_to_long(flag)
flag1 =  a * flag + b

c1 = pow(flag1, e, N)
c2 = pow((flag), e, N)

assert(pow(c1, d, N) == flag1)
assert(pow(c2, d, N) == flag)

print(N)
print(e)
print(c1)
print(c2)
print(a)
print(b)

encrypt.py를 보면 내가 구하려는 것은 flag이기 때문에 주어진 6개의 요소 중 c1, a, b는 사용하지 않았다.
다운받은 enc.txt도 보면 e값이 3으로 매우 작은것을 알 수 있었고 낮은지수 공격을 이용하여 문제를 풀었다.

from gmpy2 import *
from Crypto.Util.number import *
import time 
n = 317040651679373211203052920616005723678020156043628323332424772070975737453408838469787064188786011573404860315719531289497744855149648693106833220893566469137933367925417989088393428081488338940326190378085032657287146700415402636680277863355428263621630525484435545273639843015411759501613170657498993265825219268635185095788704667818488133253959599802463638649406699422719391733724583724025291694081932388296146208021483007849056796340521197771858162785429158848258434728868971277822370788477078046638988244145956273926422409006854446490844902097353140906585907615729831021135264713171213218099904040054190835213689864989036128553169219265026898127693711592592146507088549862468638817790078090116453255902533987667528301890465974635865742293209293806778416593653897850790336390681201239324555097941294112232117306893385741521626628689787545632725387549814767531756371737740572219769069441283585425896640819299563592008738345302900504187795287179485677802770486028077737997406541494777650298180989153685352404527946553530659987383623342371095072298448494604853114349302537264362538517244435429874419107749816127165211721817516961841383469631957904885678760629435470386620807103484614770446981317888580422731368821491703012190183243
c = 8297423020022584155011048994131832532824769074603023730133414978795876083975829767265894418737130405482092398749557510849356438382806334207752350424328189587538835124850818790342725062432577666660785216065345678061943982215620548836592472455231224905601436909814422212405387665285635705441455639510030326136599676781656710020740773913531981988901910524876336689922252137646035508407628715768925469851812056183896960489642237162363954459588105185425583983516407862459239754702318180363135870652414123417287108500334785797074965659493879646074666170795550533107295994421467507825853297020990968465269194425974012716422816703183529876173808423121297943817528992643716946584739099328084201918671645348445667073297906942267193317797356444500014074902610476607216717889696917598060829137189261664903853879838844091472012719908117333187156067157240412062289054821454999696908286081864861687576456825071844285971295647010885157801032909560332164820250910702287272446130959717
e = 3


with local_context() as ctx:
    ctx.precision=3000
    m=iroot(c,e)[0]

flag = long_to_bytes(m)

print(flag)