체크섬과 CRC란 무엇인가
네트워크로 파일을 전송하거나 저장 장치에 데이터를 기록할 때, 우리는 항상 ‘이 데이터가 원본 그대로 도착했는가’라는 문제를 마주하게 된다. 이를 확인하기 위한 대표적인 방법이 체크섬(Checksum)과 CRC(Cyclic Redundancy Check)다. 둘 다 원본 데이터를 특정 연산에 넣어 짧은 검증값을 만들어내고, 수신 측에서 같은 연산을 다시 수행해 값이 일치하는지 비교하는 방식으로 동작한다.
체크섬은 가장 단순한 형태로, 데이터를 일정 단위로 나눠 모두 더한 값을 사용한다. 예를 들어 바이트 값을 전부 합산해서 나온 숫자를 검증값으로 삼는 식이다. 반면 CRC는 다항식 나눗셈이라는 조금 더 정교한 수학적 연산을 이용해 오류 검출 능력을 크게 높인 방식이다.
동작 원리를 우체국 소포에 비유해보기
이해를 돕기 위해 우체국 소포를 예로 들어보자. 물건을 보내기 전 무게를 재서 영수증에 ‘3.2kg’이라고 적어둔다고 하자. 받는 사람은 소포가 도착하면 다시 무게를 재서 영수증의 숫자와 비교한다. 무게가 다르면 뭔가 빠지거나 파손되었다고 의심할 수 있다. 체크섬과 CRC도 원리는 비슷하다. 보내는 쪽에서 데이터의 ‘무게’에 해당하는 값을 계산해 함께 보내고, 받는 쪽에서 같은 계산을 반복해 비교하는 것이다.
다만 CRC는 단순 합산이 아니라 데이터를 하나의 큰 이진수로 보고, 미리 정해진 ‘생성 다항식’으로 나눈 나머지를 검증값으로 사용한다. 예를 들어 흔히 쓰이는 CRC-32는 32비트 길이의 나머지 값을 만들어낸다. 이 방식은 비트가 뒤바뀌거나 연속된 비트가 손상되는 경우까지도 훨씬 잘 잡아낸다는 특징이 있다. 단순 체크섬은 두 바이트의 값이 서로 자리를 바꿔도 합계가 같아서 오류를 놓치는 경우가 있지만, CRC는 순서와 위치 정보까지 계산에 반영되기 때문에 이런 경우도 대부분 탐지할 수 있다.
실무에서 왜 CRC를 쓰는가
CRC는 계산이 비교적 빠르면서도 오류 검출률이 높아서 다양한 곳에 사용된다. 대표적으로 다음과 같은 영역에서 찾아볼 수 있다.
- ZIP, PNG 같은 파일 포맷에서 압축 데이터의 손상 여부 확인
- 이더넷, Wi-Fi 등 네트워크 프레임의 전송 오류 검출
- 하드디스크, SSD 등 저장 장치의 데이터 무결성 검사
다만 CRC는 우연히 발생하는 전송 오류를 찾아내는 데는 강력하지만, 누군가 의도적으로 데이터를 조작한 뒤 CRC 값까지 맞춰서 위조하는 것을 막지는 못한다. 그래서 보안이 중요한 상황에서는 CRC 대신 SHA-256 같은 암호학적 해시 함수를 사용한다. 즉 CRC는 ‘실수로 인한 손상’을 잡는 도구이고, 해시 함수는 ‘의도적인 변조’까지 막아야 할 때 쓰는 도구라고 구분해서 이해하면 된다.