CRC ์ฒดํฌ์ฌ์ด๋?
์ํ ์ค๋ณต ๊ฒ์ฌ(CRC, Cyclic Redundancy Check)๋ ๋คํธ์ํฌ, ์ ์ฅ ์ฅ์น, ํ์ผ ํฌ๋งท ๋ฑ์์ ํญ๋๊ฒ ์ฐ์ด๋ ์ค๋ฅ ๊ฒ์ถ ์ฝ๋์ ๋๋ค(์ด๋๋ท, ZIP, PNG, Modbus, USB ๋ฑ). CRC๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ธด ์ด์ง์๋ก ๋ณด๊ณ , ๊ณ ์ ๋ ์์ฑ ๋คํญ์(generator polynomial)์ผ๋ก ๋๋๋๋ค. ์ด๋ ์๋ฆฌ์ฌ๋ฆผ์ด ์๋ ์ด์ง ์ฐ์ฐ(GF(2), ๋ง์ ๊ณผ ๋บ์ ์ด ๋ชจ๋ XOR์ธ ์ฒด๊ณ)์ ์ฌ์ฉํฉ๋๋ค. ์ด ๋๋์ ์ ๋๋จธ์ง๊ฐ ๋ฐ๋ก CRC ๊ฐ์ ๋๋ค. ๋ฉ์์ง์์ ๋จ 1๋นํธ๋ง ๋ฐ๋์ด๋ ๋๋จธ์ง ๊ฐ์ด ๊ฑฐ์ ํญ์ ํจ๊ป ๋ฐ๋๊ธฐ ๋๋ฌธ์, CRC๋ ์ ์ก์ด๋ ์ ์ฅ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ก์๋ด๋ ๋ฐ ๋งค์ฐ ๋ฐ์ด๋ฉ๋๋ค.
๊ณ์ฐ๊ธฐ ์ฌ์ฉ ๋ฐฉ๋ฒ
์ ๋ ฅ๋์ ASCII ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ํ๋ CRC ๋ฐฉ์์ ์ ํํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ํ์ธํ ์ ์์ต๋๋ค. ์ด ๋๊ตฌ๋ ์ฒดํฌ์ฌ ๊ฐ์ 16์ง์์ 10์ง์๋ก ๋ชจ๋ ํ์ํ๋ฉฐ, ๋นํธ ํญ๊ณผ ์ฒ๋ฆฌํ ๋ฐ์ดํธ ์๋ ํจ๊ป ๋ณด์ฌ ์ค๋๋ค. ๋ค์ ์ธ ๊ฐ์ง ๋ํ ๋ฐฉ์์ ์ง์ํฉ๋๋ค:
CRC-8 โ ๋คํญ์ \(\mathtt{0x07}\), ์ด๊ธฐ๊ฐ \(\mathtt{0x00}\).
CRC-16/CCITT-FALSE โ ๋คํญ์ \(\mathtt{0x1021}\), ์ด๊ธฐ๊ฐ \(\mathtt{0xFFFF}\), ๋ฐ์ฌ(reflection) ์์.
CRC-32 (IEEE 802.3) โ ๋ฐ์ฌ ๋คํญ์ \(\mathtt{0xEDB88320}\), ์ด๊ธฐ๊ฐ \(\mathtt{0xFFFFFFFF}\), ์ต์ข
XOR \(\mathtt{0xFFFFFFFF}\). ZIP, gzip, ์ด๋๋ท์์ ์ฌ์ฉํ๋ ๋ฐฉ์์
๋๋ค.
๊ณต์ ํ์ด
๊ฐ๋ ์ ์ผ๋ก๋ ๋ฉ์์ง \(M(x)\)์ \(x^n\)(\(n\)์ ์์ฑ ๋คํญ์์ ์ฐจ์)์ ๊ณฑํ ๋ค \(G(x)\)๋ก ๋๋๋๋ค. ์ค์ ๊ตฌํ์์๋ ๋ ์ง์คํฐ๋ฅผ ํ ๋นํธ์ฉ ์ํํธํ๋ฉด์, ์ต์์ ๋นํธ๊ฐ 1์ผ ๋๋ง๋ค ๋คํญ์์ XORํ๋ ๋ฐฉ์์ ์๋๋ค. CRC-32 ๊ฐ์ ๋ฐ์ฌ(reflected) ๋ฐฉ์์ ์ตํ์ ๋นํธ๋ถํฐ ์ฒ๋ฆฌํ๋ฉฐ, ์ผ์ชฝ์ด ์๋๋ผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ํํธํฉ๋๋ค.
$$\begin{gathered} \text{CRC} = \mathrm{XorOut} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}_{\text{poly}}(\text{crc}, b) \\[1.5em] \text{where (CRC-16/CCITT-FALSE)}\quad \left\{ \begin{aligned} \text{poly} &= \mathtt{0x1021} \\ \mathrm{init} &= \mathtt{0xFFFF} \\ \mathrm{XorOut} &= \mathtt{0x0000} \\ \text{width} &= 16 \text{ bits (MSB-first, no reflection)} \end{aligned} \right. \end{gathered}$$
์ค์ ์์
๋ํ์ ์ธ ๊ฒ์ฆ ๋ฌธ์์ด 123456789์ ๊ฒฝ์ฐ, CRC-16/CCITT-FALSE๋ 0x29B1(10์ง์ 10673)์ ๋ฐํํ๊ณ , CRC-32/IEEE๋ 0xCBF43926(10์ง์ 3421780262)์ ๋ฐํํฉ๋๋ค. ์ด ๊ฐ๋ค์ CRC ํ์ค ์ฐธ์กฐ ๋ชฉ๋ก์ ๊ณต๊ฐ๋ "check" ๊ฐ์ด๋ฏ๋ก, ์ด๋ค ๊ตฌํ์ด๋ ์ด ๊ฒฐ๊ณผ์ ๋์กฐํด ์ ํ์ฑ์ ํ์ธํ ์ ์์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
๋ค๋ฅธ ๋๊ตฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ์ด์ ๋? CRC ๋ฐฉ์์ ๋คํญ์, ์ด๊ธฐ๊ฐ, ๋นํธ ๋ฐ์ฌ ์ฌ๋ถ, ์ต์ข XOR ๊ฐ์ด ์๋ก ๋ค๋ฆ ๋๋ค. ์ ํํ ๋์ผํ ๋ฐฉ์๋ผ๋ฆฌ ๋น๊ตํ๊ณ ์๋์ง ํ์ธํ์ธ์.
CRC๋ ์์ ํ ํด์์ธ๊ฐ์? ์๋๋๋ค. CRC๋ ์ฐ์ฐํ ๋ฐ์ํ ์ค๋ฅ๋ฅผ ๊ฒ์ถํ ๋ฟ, ์๋์ ์ธ ์์กฐ๋ ๋๋ฌด๋ ์ฝ๊ฒ ๊ฐ๋ฅํฉ๋๋ค. ๋ณด์์ด ํ์ํ๋ค๋ฉด SHA-256 ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ธ์.
์ด๋ค ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋์? ๊ฐ ๋ฌธ์๋ฅผ 8๋นํธ ASCII/Latin-1 ๋ฐ์ดํธ ๊ฐ์ผ๋ก ๋ณํํ ๋ค CRC๋ฅผ ๊ณ์ฐํฉ๋๋ค.