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}'
'๐ดโโ ๏ธ CTF ๐ดโโ ๏ธ > ๐งฎ ์ํธํ ๐งฎ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dream Hack - Crypto] X-Time Pad (0) | 2023.12.09 |
---|---|
[Dream Hack - Crypto] likeb64 (0) | 2023.12.09 |
[Dream Hack - Pwnable] baby-bof (0) | 2023.11.19 |
[Dream Hack - Crypto] RSA-wiener (0) | 2023.09.05 |
[Dream Hack - Crypto] fuzzy flag (0) | 2023.09.04 |