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를 계산합니다.