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

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

[Dream Hack - Crypto] RSA-wiener

๋ฐ˜์‘ํ˜•

Wiener ๊ณต๊ฒฉ

์œ„๋„ˆ(Wiener)์˜ ๊ณต๊ฒฉ์€ RSA ์•”ํ˜ธํ™” ๋ฐฉ์‹์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์„ฑ์„ ์ด์šฉํ•œ ๊ณต๊ฒฉ ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. RSA๋Š” ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉฐ, ํฐ ์†Œ์ˆ˜์ธ ๋‘ ๊ฐœ์˜ ์†Œ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์œ„๋„ˆ์˜ ๊ณต๊ฒฉ์€ ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ, RSA์˜ ๊ฐœ์ธํ‚ค๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

์œ„๋„ˆ์˜ ๊ณต๊ฒฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ „์ œ ์กฐ๊ฑด์„ ํ•„์š”๋กœ ํ•œ๋‹ค:

  1. ์†Œ์ˆ˜ p์™€ q๊ฐ€ n = p x q๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ๋˜์—ˆ์„ ๋•Œ, p์™€ q์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์•„ n์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์ƒ๋‹นํ•œ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ.
  2. e๊ฐ€ ๋งค์šฐ ํฐ ๊ฒฝ์šฐ. ๋ณดํ†ต RSA์—์„œ๋Š” ๊ณต๊ฐœ ์ง€์ˆ˜ e๋กœ ์ž‘์€ ์†Œ์ˆ˜, ์ฃผ๋กœ 3 ๋˜๋Š” 65537(2^16 + 1)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ e๊ฐ€ ๋งค์šฐ ํฐ ๊ฒฝ์šฐ์—๋Š” ์œ„๋„ˆ์˜ ๊ณต๊ฒฉ์ด ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๊ฒฝ์šฐ, ์œ„๋„ˆ์˜ ๊ณต๊ฒฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋œ๋‹ค:

  1. n๊ณผ e๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์—์„œ, RSA์˜ ๊ฐœ์ธํ‚ค d๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด d์˜ ๊ทผ์‚ฌ์น˜์ธ d' = 1/e mod (euler_phi(n))๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ euler_phi(n)=(p-1)(q-1) ์€ n์˜ ์˜ค์ผ๋Ÿฌ ํ”ผ ํ•จ์ˆ˜์ด๋‹ค.
  2. d'์˜ ๋ถ„์ˆ˜ ํ‘œํ˜„์„ ์ด์šฉํ•˜์—ฌ d'๋ฅผ d = (k x euler_phi(n)+1)/e ํ˜•ํƒœ๋กœ ํ•œ๋‹ค. ์ด๋•Œ, k๋Š” ์–‘์˜ ์ •์ˆ˜์ด๋‹ค.
  3. ์œ„์˜ ์‹์„ ๋งŒ์กฑํ•˜๋Š” k ๊ฐ’์„ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์—ฐ์†๋œ k ๊ฐ’๋“ค์„ ์‹œ๋„ํ•˜๋ฉด์„œ d๊ฐ€ ์ •์ˆ˜๊ฐ€ ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ด ๋•Œ, d๊ฐ€ ์ •์ˆ˜๊ฐ€ ๋˜๋Š” k ๊ฐ’์„ ์ฐพ๊ฒŒ ๋˜๋ฉด, ํ•ด๋‹น k ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ๊ฐœ์ธํ‚ค d๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

์šฐ๋ฆฌ๋Š” N, e, ์•”ํ˜ธํ™”๋œ Flag๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

N = 237513265686025789186562608732400008100581870458434017952788114554225756652162413702306473956172406315118900180084859436965775540087331299252158189935099309726131944473377703166550089276072127708850460299073570538050902891628197488607150799868080449908160852741234270848472245085906293581136277333188361835161
e = 187224198358976786579749067995497890905799822947128651088251530361387419780131539700347226362649795586438751501544451473659148049507814353125472665954342709257182749776947194758327083239358991106508477303866175029695125086636425667367941964361682844471490598884007406957886946810963902666192471332550759161305
Flag = 24981254080909219230265206235193414028780554719956568981014479247148185251168118446607184006846379494138286369937332491801314184196030148052351232512282822191418093014429056913869049243299733179602660079651535369672864881677595298490260859831553321356068082173796345881132554132547112018880976416128995190760

์ง์ ‘ ํ’€์ด ๊ณผ์ •์„ ์ž‘์„ฑํ•˜์—ฌ ํ’€์–ด๋ณด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ˆซ์ž๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๊ทธ๋ž˜์„œ ํˆด์„ ์‚ฌ์šฉํ•˜์—ฌ์„œ ํ’€์—ˆ๋‹ค.

$ git clone <https://github.com/zweisamkeit/RSHack.git>
$ cd RSHack
$ pip install -r requirements.txt
$ python rshack.py

 

 

๋น„๋ฐ€ํ‚ค ๊ตฌํ•˜๊ธฐ

์š”๊ตฌํ•˜๋Š” ํฌ๋ฉง๋Œ€๋กœ -n {modulus ๊ฐ’} -e {exponent ๊ฐ’} ์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋น„๋ฐ€ํ‚ค๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

๋ณตํ˜ธํ™” ํ•˜๊ธฐ

๋ฐ˜์‘ํ˜•