๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿด‍โ˜ ๏ธ CTF ๐Ÿด‍โ˜ ๏ธ/๐Ÿงฎ ์•”ํ˜ธํ•™ ๐Ÿงฎ

[DreamHack - Crypto] uncommon_e

๋ฐ˜์‘ํ˜•

Common modulus attack

Common Modulus Attack RSA ์•”ํ˜ธ์—์„œ ๊ฐ™์€ N๊ณผ GCD(e1, e2)=1 ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ™์€ ํ‰๋ฌธ m์„ ์•”ํ˜ธํ™”ํ•ด์„œ ๋‘ ์•”ํ˜ธ๋ฌธ c1, c2์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ, ์ด๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

๊ณต๊ฒฉ์ž๋Š” e1, e2๊ฐ€ ์„œ๋กœ์†Œ๋ผ๋Š” ์ ์„ ํ™œ์šฉํ•ด r*e1 + s*e2=1์ด๊ณ , (r, s) ์Œ์„ ํ™•์žฅ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ GCD ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. 106๊ณผ 16์˜ GCD๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ๋ชฉ๊ณผ ๋‚˜๋จธ์ง€๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ณ€์ด 0์ด ๋  ๋•Œ ๊ทธ์ „ ์‹์˜ ์šฐ๋ณ€ 2๊ฐ€ 106, 16์˜ GCD๊ฐ€ ๋œ๋‹ค.

 

ํ’€์ด ๋ฐฉ๋ฒ•

FLAG_enc1 = FLAG^e1 mod N

FLAG_enc2 = FLAG^e2 mod N

GCD(e1, e2) = 1 ์ด๋ฏ€๋กœ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ FLAG ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

from Crypto.Util.number import inverse, long_to_bytes

N = 18564839028340970630632687927085732690660216946716888067188954046812800985732372062460700863888002343155902759133649880101140768419725781550847529242612574780286876355781415545270149267924318930484262298628091098398893193544538272524290190578306149953368594658823348775434109820836311754081667945186523509419274141640792179302149121645060758381445210342226062749581257840649008843072969882069745488933714383742625035916351887508696280553528500528993974650390749489910938646668966427281419193682964555099697539229141704274820381967489671915008271272572784624353477273387243166242973237904102218303978989538340075110803
FLAG_enc1 = 7527079488835824550176589432384780921138078216741164078317178088512020484637815911814449926944662371885728405467621509470317993615175662631245614263206465411761405248665475018014955011387536383732578999002193581953127201730485926821982569309896641811322758517611730555795173063573946211306084429097792646498732335587337634527626172754334153175582669944053431474970826408358022316126279869698898223075336790046723458233152991869045783807109865365096509043487724858636091575421769914060998644878330883643511254289263960487281213979614256506109469224245020612145584918823245558025971100167133602718304130194072814312710
FLAG_enc2 = 5553467916392779302319650321161682360291392077019602231908379041584499902773710723619110301005008094731504431902945888409491392723061165695579512443486392024940348967751410819758344508288749930005375895909393752897849038447778016747963886132791102187462287312608282729773341145901349954559564077909026595969034706754208713806020071917600988186991043342705750598606533751031166628502148837344385933277599437539183985932955644653119376571815604213229278422645273875273059325957488817516922134037588666169092554553063254879269416996367056713107865228810125004163068707218820011235988174311427569510212386257879728088984
e1 = 26107
e2 = 416

## a - q * b = r
def action (enc1, enc2, a, b) : 
    q = a // b
    r = a % b
    if(r == 1 ) :
        return enc1 * inverse(pow(enc2, q, N), N) % N
    else : 
        return action(enc2, enc1 * inverse(pow(enc2, q, N), N) % N, b, r)

print(action(FLAG_enc1, FLAG_enc2, e1, e2).to_bytes(68, 'big'))

 

์‹คํ–‰ ๊ฒฐ๊ณผ

b'DH{7e532757ebddde149f45c32156e58421e95b5c691b668f1681677af9495f7e36}'
๋ฐ˜์‘ํ˜•