MCP๋กœ ์—ฐ๊ฒฐ โ†’

๊ณ„์‚ฐ ์ž…๋ ฅ

๊ณต์‹

๊ด‘๊ณ 

๊ฒฐ๊ณผ

CRC ์ฒดํฌ์„ฌ (16์ง„์ˆ˜)
0x29B1
16-bit checksum
10์ง„์ˆ˜ ๊ฐ’ 10,673
๋น„ํŠธ ํญ 16 bits
์ฒ˜๋ฆฌํ•œ ๋ฐ”์ดํŠธ ์ˆ˜ 9

CRC ์ฒดํฌ์„ฌ์ด๋ž€?

์ˆœํ™˜ ์ค‘๋ณต ๊ฒ€์‚ฌ(CRC, Cyclic Redundancy Check)๋Š” ๋„คํŠธ์›Œํฌ, ์ €์žฅ ์žฅ์น˜, ํŒŒ์ผ ํฌ๋งท ๋“ฑ์—์„œ ํญ๋„“๊ฒŒ ์“ฐ์ด๋Š” ์˜ค๋ฅ˜ ๊ฒ€์ถœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค(์ด๋”๋„ท, ZIP, PNG, Modbus, USB ๋“ฑ). CRC๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๊ธด ์ด์ง„์ˆ˜๋กœ ๋ณด๊ณ , ๊ณ ์ •๋œ ์ƒ์„ฑ ๋‹คํ•ญ์‹(generator polynomial)์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์ด๋•Œ ์ž๋ฆฌ์˜ฌ๋ฆผ์ด ์—†๋Š” ์ด์ง„ ์—ฐ์‚ฐ(GF(2), ๋ง์…ˆ๊ณผ ๋บ„์…ˆ์ด ๋ชจ๋‘ XOR์ธ ์ฒด๊ณ„)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚˜๋ˆ—์…ˆ์˜ ๋‚˜๋จธ์ง€๊ฐ€ ๋ฐ”๋กœ CRC ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€์—์„œ ๋‹จ 1๋น„ํŠธ๋งŒ ๋ฐ”๋€Œ์–ด๋„ ๋‚˜๋จธ์ง€ ๊ฐ’์ด ๊ฑฐ์˜ ํ•ญ์ƒ ํ•จ๊ป˜ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์—, CRC๋Š” ์ „์†ก์ด๋‚˜ ์ €์žฅ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ด๋Š” ๋ฐ ๋งค์šฐ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ์ดํ„ฐ์™€ ์ถ”๊ฐ€๋œ CRC ์ฒดํฌ์„ฌ ํ•„๋“œ๋กœ ๋‚˜๋‰œ ๋ธ”๋ก ๋‹ค์ด์–ด๊ทธ๋žจ
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, ์ด๋”๋„ท์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

$$\text{CRC}_{8} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b) \quad\left\{ \begin{aligned} \mathrm{init} &= \mathtt{0x00} \\ \text{poly} &= \mathtt{0x07} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 8 \text{ bits, MSB-first} \end{aligned} \right.$$$$\text{CRC}_{16} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b) \quad\left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFF} \\ \text{poly} &= \mathtt{0x1021} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 16 \text{ bits, MSB-first} \end{aligned} \right.$$$$\text{CRC}_{32} = \mathtt{0xFFFFFFFF} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b) \quad\left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFFFFFF} \\ \text{poly} &= \mathtt{0xEDB88320}\ (\text{reflected}) \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \gg 1\big) \oplus (\text{LSB}?\,\text{poly}:0) \\ \text{width} &= 32 \text{ bits, LSB-first} \end{aligned} \right.$$

๊ณต์‹ ํ’€์ด

๊ฐœ๋…์ ์œผ๋กœ๋Š” ๋ฉ”์‹œ์ง€ \(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}$$
XOR ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GF(2)์—์„œ ๋ฉ”์‹œ์ง€ ๋น„ํŠธ๋ฅผ ์ƒ์„ฑ ๋‹คํ•ญ์‹์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋‹คํ•ญ์‹ ๊ธด ๋‚˜๋ˆ—์…ˆ
CRC๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑ ๋‹คํ•ญ์‹ \(G(x)\)๋กœ ์ด์ง„ ๋‹คํ•ญ์‹ ๋‚˜๋ˆ—์…ˆ(XOR)ํ•œ ๋‚˜๋จธ์ง€์ž…๋‹ˆ๋‹ค.

์‹ค์ „ ์˜ˆ์ œ

๋Œ€ํ‘œ์ ์ธ ๊ฒ€์ฆ ๋ฌธ์ž์—ด 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๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ข… ์—…๋ฐ์ดํŠธ: