SHA-3 ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฃผ์š” ๊ตฌํ˜„์œผ๋กœ ์ธํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ทจ์•ฝ์ 

XKCP ํŒจํ‚ค์ง€(eXtended Keccak Code Package)์—์„œ ์ œ๊ณต๋˜๋Š” SHA-3(Keccak) ์•”ํ˜ธํ™” ํ•ด์‹œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์—์„œ ์ทจ์•ฝ์ (CVE-2022-37454)์ด ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠน์ • ํŒจํ‚ค์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜•์‹ํ™”๋œ ๋ฐ์ดํ„ฐ. ์ด ๋ฌธ์ œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด์˜ ์ทจ์•ฝ์ ์ด ์•„๋‹ˆ๋ผ ํŠน์ • SHA-3 ๊ตฌํ˜„ ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. XKCP ํŒจํ‚ค์ง€๋Š” Keccak ๊ฐœ๋ฐœํŒ€์˜ ์˜๊ฒฌ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐœ๋ฐœ๋œ SHA-3์˜ ๊ณต์‹ ๊ตฌํ˜„์œผ๋กœ ์„ ์ „๋˜๋ฉฐ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ SHA-3 ๊ธฐ๋Šฅ์˜ ๊ธฐ์ดˆ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: XKCP ์ฝ”๋“œ๋Š” Python hashlib์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค) ๋ชจ๋“ˆ, Ruby ๋‹ค์ด์ œ์ŠคํŠธ ํŒจํ‚ค์ง€ sha3 ๋ฐ PHP hash_* ํ•จ์ˆ˜).

๋ฌธ์ œ๋ฅผ ํ™•์ธํ•œ ์—ฐ๊ตฌ์›์— ๋”ฐ๋ฅด๋ฉด, ๊ทธ๋Š” ์ด ์ทจ์•ฝ์ ์„ ์ด์šฉํ•ด ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์•”ํ˜ธํ™” ์†์„ฑ์„ ์œ„๋ฐ˜ํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ์‚ฌ์ „ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ๊ณ  ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ํŒŒ์ผ์˜ ํ•ด์‹œ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ต์Šคํ”Œ๋กœ์ž‡์ด ์ƒ์„ฑ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ทจ์•ฝ์ ์€ SHA-3(์˜ˆ: Ed448)์„ ์‚ฌ์šฉํ•˜๋Š” ๋””์ง€ํ„ธ ์„œ๋ช… ํ™•์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐ ์ž ์žฌ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ทจ์•ฝ์ ์ด ๋ชจ๋“  ๊ณณ์—์„œ ์ œ๊ฑฐ๋œ ํ›„ ์ถ”ํ›„ ๊ณต๊ฐœ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ทจ์•ฝ์ ์ด ์‹ค์ œ๋กœ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์–ผ๋งˆ๋‚˜ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€๋Š” ์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์ฝ”๋“œ์— ๋‚˜ํƒ€๋‚˜๋ ค๋ฉด ๋ธ”๋ก์˜ ์ˆœํ™˜ ํ•ด์‹œ ๊ณ„์‚ฐ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ  ์ฒ˜๋ฆฌ๋œ ๋ธ”๋ก ์ค‘ ํ•˜๋‚˜์˜ ํฌ๊ธฐ๊ฐ€ ์•ฝ 4GB(์ตœ์†Œ)์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 2^32 - 200๋ฐ”์ดํŠธ). (ํ•ด์‹œ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ ) ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ณดํ˜ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด์‹œ ๊ณ„์‚ฐ์˜ ํ•œ ๋ฒˆ ๋ฐ˜๋ณต์— ํฌํ•จ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ทจ์•ฝ์ ์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๋ธ”๋ก ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. "int" ์œ ํ˜•์˜ ๊ฐ’์„ ์ž˜๋ชป ๋น„๊ตํ•˜์—ฌ ๋ณด๋ฅ˜ ์ค‘์ธ ๋ฐ์ดํ„ฐ์˜ ์ž˜๋ชป๋œ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๊ณ , ์ด๋กœ ์ธํ•ด ํ• ๋‹น๋œ ๋ฒ„ํผ๋ฅผ ๋„˜์–ด์„œ๋Š” ํ…Œ์ผ์ด ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋น„๊ต์—์„œ๋Š” โ€œpartialBlock + ์ธ์Šคํ„ด์Šค->byteIOIndexโ€๋ผ๋Š” ํ‘œํ˜„์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ด๋กœ ์ธํ•ด ๊ตฌ์„ฑ ๋ถ€๋ถ„์˜ ํฐ ๊ฐ’์— ๋Œ€ํ•ด ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ์— ์ž˜๋ชป๋œ ์œ ํ˜• ์บ์ŠคํŒ… "(unsigned int)(dataByteLen - i)"๊ฐ€ ์žˆ์–ด 64๋น„ํŠธ size_t ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ์ผ์œผํ‚ค๋Š” ์˜ˆ์ œ ์ฝ”๋“œ: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00โ€ณ * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€