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

최종 업데이트: