์๋
ํ์ธ์.
๋๋์ด ๊ทธ ๋์ HWP 5.x ๊ตฌํ์ ๊ฑธ๋ฆผ๋์ด์๋ ๋ฐฐํฌ์ฉ ๋ฌธ์์ ์ํธํ๋ฅผ ํธ๋
๋ฐฉ๋ฒ์ ์์๋์ต๋๋ค. ์ ๋ณด๋ฅผ ๊ณต๊ฐํด๋ ๋ฌธ์ ๊ฐ ์๋ ํ์ ์ด ๋ค์ง ์์์ ์ ์
๊ณ ๋ฏผํ์ง๋ง, ์ฌ๋ฌ๊ฐ์ง ์ด์ ๋ก ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋จํ๊ณ ๊ณต๊ฐํฉ๋๋ค.
๋จผ์ ์ ๋ ์ญ๋ถ์์ ํตํด ์์๋ด์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์๊ถ๋ฒ์ ์ธ๊ธ๋ ์ญ
๋ถ์์ ์ ํ์ (3์ ์ ๊ณต ๊ธ์ง, ๋์ผํ ํ๋ก๊ทธ๋จ ๊ธ์ง ๋ฐ์) ๋ฐ์ง ์์ต๋๋ค.
์ฌ์ค ์ญ๋ถ์์ ํ ๋งํ ์ง์์ด๋ ๊ฒฝํ๋ ๋ถ์กฑํ๊ณ ์. ์งง์ ์๊ฐ ๋์ ํ์ปด์ค
ํผ์ค ์ฒดํํ์์ ๋ฌธ์๋ฅผ ์ฌ๋ฌ๋ฒ ์ ์ฅํ๋ฉด์ ํ์ผ์ ๋ค์ฌ๋ค ๋ณด๊ณ ์ด๊ฒ ์ ๊ฒ์
์๋ํด ๋ณด๋ ๊ฒ ๋ง์ผ๋ก๋ ์์๋ผ ์ ์์์ต๋๋ค. ๋ด์ฉ์ ๋ณด๋ฉด ์์๊ฒ ์ง๋ง ์ฅ
๋ดํ๊ฑด๋ HWP ์คํ์ ์ฝ๊ฐ ์ดํดํ๊ณ ์ด๋ ์ ๋ ๊ฒฝํ์ด ์๋ ํ๋ก๊ทธ๋๋จธ๋ผ๋ฉด
์๊ฐ ๋ฌธ์ ์ผ ๋ฟ ์ถฉ๋ถํ ์์๋ผ ์ ์์ต๋๋ค.
์ด ์ํธํ๊ฐ DRM(์ ์๊ถ๋ฒ์ "๊ธฐ์ ์ ๋ณดํธ์กฐ์น")์ผ๋ก ์ทจ๊ธ๋๊ณ ์ด ์ ๋ณด์ ๊ณต
๊ฐ๊ฐ DRM์ ํด์ ํ๋ ๊ฒ์ผ๋ก ์๊ฐ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์์ ๊ฒ๋๋ค. ํ์ง๋ง ๊ณผ
๊ฑฐ์ ๋ฐฐํฌ์ฉ ๋ฌธ์์ ๋ฌธ์ ์ ๋ํด ๊นํธ๋๋์ด ํ์๋ถ์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ์์ ๋
ํ์ปด์์๋ ๋ถ๋ช
ํ ๊ณ ์์ ์ผ๋ก ๋๋ฝํ ๊ฒ์ด ์๋๋ค๋ผ๊ณ ๋ต์ ํ์์ต๋๋ค. ํ
์ปด ์ค์ค๋ก ๋น๋ฐ ์ ๋ณด๋ก ์๊ฐํ์ง ์์ผ๋ DRM์ด ๋ ์ ์๋ค๊ณ ๋ณผ ์ ์์ ๊ฒ๋
๋ค.
์์ธ๋ฌ, ํ๊ธ๊ณผ์ปดํจํฐ(์ฌ)์ ํ์ธ ๊ฒฐ๊ณผ ๋ฐฐํฌ์ฉ ๋ฌธ์์ ์ฌ์ฉํ๋
โViewText" ํฌ๋งท์ ๊ธฐ ๊ณต๊ฐ๋ "BodyText"์ ๋์ผํ ๋ด์ฉ์ผ๋ก ํด๋น ์
์ฒด๋ ์ด๋ฅผ ๊ณ ์์ ์ผ๋ก ๋๋ฝํ ๊ฒ์ด ์๋๋ผ ์ด๋ฏธ ๊ณต๊ฐ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ
ํ๊ณ ์์ผ๋ฉฐ ํ์ฌ ๊ณต๊ฐ์์ ๋๋ฝ๋ ๋ถ๋ถ์ ๋ํ ์ถ๊ฐ์ ์ธ ๋ณด์๋ ์ถ
์งํ๊ณ ์๋ค๊ณ ํฉ๋๋ค. ๋ํ, ๋ฆฌ๋
์ค์ฉ ๋ทฐ์ด์ ๊ฒฝ์ฐ์๋ ๋ฆฌ๋
์ค์ ๊ตญ
๋ด ๋์
์ด๊ธฐ์ ์ฒดํํ ๋ฐฐ๋ถ ๋ฑ์ ํตํด ์ ๊ณตํ์์ผ๋ ์๋ ๋ฆฌ๋
์ค์
๋ฒ์ ์ด๋ ์ข
๋ฅ๊ฐ ๋ค์ํด์ง์ ๋ฐ๋ผ ์ผ์ผํ ์ ๊ณตํ์ง๋ ๋ชปํ๊ณ ์์ผ๋ฉฐ
ํฅํ ์ง์์ ์ธ ๊ด์ฌ์ ๊ฐ์ง๊ณ ๋
ธ๋ ฅํ๊ฒ ๋ค๋ ๋๋ต์ ๋ฐ์์ต๋๋ค.
http://www.ubuntu.or.kr/viewtopic.php?p=81082#p81082
๋ฌด์๋ณด๋ค๋ ์ ๋ ๋ฌธ์ ๋ด์ฉ์ ์ฝ๊ณ ์ถ์ ๋ฟ, ๋ฌธ์ ๋ด์ฉ์ ํธ์ง/์ธ์ ๊ฐ๋ฅํ๋
๋ก ํฌ๋ํ๋ ๋ฐ๋ ๊ด์ฌ์ด ์์ต๋๋ค. ๋ฌธ์ ๋ด์ฉ์ ๋ณด๊ธฐ ์ํด ํ์ํ ์ต์ํ์
์์
์ด ํฌ๋์ด ์ฌ์์ง๋ค๊ณ ๋ถ๋ฒ์ด ๋๋ค๋ฉด ์ด์ํ ์ผ์ผ ๊ฒ๋๋ค.
๊ทธ๋ผ ์์ํฉ๋๋ค.
----------
ViewText๋ BodyText์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ Section0, Section1, ... ์์ผ๋ก ์น
์
์คํธ๋ฆผ์ด ๋ค์ด ์์ต๋๋ค. ๊ฐ ์น์
์คํธ๋ฆผ์ HWPTAG_DISTRIBUTE_DOC_DATA
๋ ์ฝ๋์ ๋ค์ ์ํธํ๋ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- SectionN
<HWPTAG_DISTRIBUTE_DOC_DATA record>
<encrypted data>
HWPTAG_DISTRIBUTE_DOC_DATA ๋ ์ฝ๋๋ ์คํ์๋ ์ธ๊ธ๋์ด ์๋๋ฐ 256๋ฐ์ดํธ๋ผ
๋ ๊ฒ๋ง ์ฐ์ฌ ์์ต๋๋ค. ๋ฐ๋ก ์ด 256๋ฐ์ดํธ ์์ ๋ค์ ์ํธํ๋ ๋ณธ๋ฌธ์ ํธ๋
ํค๊ฐ ๋ค์ด ์์ต๋๋ค.
์ด 256๋ฐ์ดํธ๋ ๋๋ฆ ์ํธํ๋์ด ์๋๋ฐ ๊ฐ๋จํ ์ ์ ์๋ ๋ฐฉ์์
๋๋ค. 256
๋ฐ์ดํธ์์ ์ฒซ 4๋ฐ์ดํธ ์ ์๋ฅผ ์๋๋ก ์ด์ฉํด์, MSVC์ srand()/rand() ๊ฒฐ๊ณผ
๋ฅผ ์ด์ฉํด ๋๋จธ์ง 252๋ฐ์ดํธ๋ฅผ XORํด ๋์์ต๋๋ค. MSVC์ srand()/rand()๋
์ ํต์ ์ธ linear congruential generator๋ก ํ๋ผ๋ฏธํฐ๋ ์ ์๋ ค์ ธ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ต๋๋ค.
srand(seed) {
random_seed = seed;
}
rand() {
random_seed = (random_seed * 214013 + 2531011) & 0xFFFFFFFF;
return (random_seed >> 16) & 0x7FFF;
}
์ฐธ๊ณ :
http://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use
252๋ฐ์ดํธ์ ์ํธ๋ฅผ ํธ๋๋ฐ ์ฒซ๋ฒ์งธ rand() ๊ฒฐ๊ณผ์ ํ์ 8๋นํธ๋ฅผ XORํ ํค๋ก
์ทจ๊ธํ๊ณ , ๋๋ฒ์งธ rand() ๊ฒฐ๊ณผ์ ํ์ 4๋นํธ ๊ฐ์ 1์ ๋ํ ๊ฐ์ XORํ ๊ฐ์
๋ก ์ทจ๊ธํฉ๋๋ค. ๊ทธ๋ ๊ฒ n๋ฐ์ดํธ๋ฅผ ํ๊ณ ๋ค์ ๋์๊ฐ ๋๊ฐ๋ฅผ ๊ตฌํ๋ ๊ฑธ ๋ฐ๋ณตํฉ
๋๋ค. ์ด๋ ๊ฒ 252๋ฐ์ดํธ๋ฅผ ํ๋ฉด ๋๋๋ฐ, ๊ฐ์๋ 256๋ฐ์ดํธ ์ฒ์๋ถํฐ ์นด์ดํธํ
๋ ๊ฒ์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ฝ๋๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
srand(data[3] << 24 | data[2] << 16 | data[1] << 8 | data[0]);
for (i = 0, n = 0; i < 256; i++, n--) {
if (n == 0) {
key = rand() & 0xFF;
n = (rand() & 0xF) + 1;
}
if (i >= 4)
data[i] ^= key;
}
์ ์ด๋ ๊ฒ HWPTAG_DISTRIBUTE_DOC_DATA๋ฅผ ํ์์ต๋๋ค. ์ด ์์ ๋ฐฐํฌ์ฉ ์ค์ ํ
๋ ์
๋ ฅํ ์ํธ์ SHA-1 ์ฒดํฌ์ฌ์ด ๋ค์ด ์์ต๋๋ค. ํน์ดํ๊ฒ๋ ๋ฐ์ด๋๋ฆฌ๋ก ์
๋ค์ด ์๊ณ UCS16 LE ๋ฌธ์์ด 40์๋ก (์ด 80๋ฐ์ดํธ) ๋ค์ด ์๋ ๊ฒ ํน์ดํฉ๋๋ค.
๋ค์ด ์๋ ์์น๋ ์์์ ๋์ ์๋๋ก ์ฌ์ฉํ๋ ์ฒซ๋ฒ์งธ ๋ฐ์ดํธ์ ํ์ 4๋นํธ
๊ฐ๋งํผ ์คํ์
์ ๋ค์ด ์์ต๋๋ค.
sha1ucsstr = &data[4 + (data[0] & 0xF)];
์ด UCS2 LE ํ์์ SHA-1 ๋ฌธ์์ด ์ค์ ์ 16๋ฐ์ดํธ, ์ฆ 128๋นํธ๊ฐ ์ํธํ๋
๋ณธ๋ฌธ์ ํธ๋ ํค์
๋๋ค. ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ AES-128 ECB ๋ชจ๋์
๋๋ค. ํ๋ฆฐ ๋ฐ
์ดํฐ๋ BodyText์ ์น์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ทจ๊ธํ๋ฉด ๋ฉ๋๋ค.
----------
์ฌ๊ธฐ๊น์ง์
๋๋ค. ๊ตฌํ์ ํ์ํ ๊ฒ๋ง ์ค๋ช
ํ๊ณ , ๊ธฐํ ์ค๋ช
์ ๋ต์ผ๋ก ๋ง๋ถ์ด๊ฒ
์ต๋๋ค.