CRC (Cyclic Redundancy Check)
- 데이터 전송 중에 발생할 수 있는 오류를 검출하기 위해 사용한다.
- CRC 계산에 사용되는 다항식은 16진수(혹은 2진수)로 나타낸다.
- CRC-16-IBM: x^16 + x^15 + x^2 + 1 (0x8005 = 1000 0000 0000 0101)
- 참고로 CRC 다항식에서는 가장 높은 차수를 암시적으로 포함시기기 때문에 해당 값은 나타내지 않는다.
- 검증 프로세스
- 원본 데이터에 다항식의 비트 수 - 1 만큼의 0을 추가한다.
- 데이터의 앞자리가 1비트인 곳에 다항식 비트를 두고 xor 연산을 수행한다.
- 연산 수행 결과에서 다시 앞자리가 1비트인 곳에 다항식 비트를 두고 xor 연산 수행하기를 반복한다.
- 이후 송신측에서 보낸 CRC 값과 수신측이 계산한 CRC 값의 일치 여부 확인
- 어떤 길이의 CRC를 사용해야 하는가?
- CRC 비트의 길이는 검사 결과 값의 크기를 의미한다.
- CRC-8은 8비트의 검사 값을 생성하고, CRC-16은 16 비트의 검사 값을 생성한다.
- 이는 결과적으로 검사 가능한 시나리오가 각각 256개, 65536개가 됨을 의미한다.
- CRC가 길수록 더 많은 오류를 검출할 수 있지만, 계산 비용도 그만큼 커질 수밖에 없다.
- 작은 데이터에 대해서는 작은 비트의 CRC를, 큰 데이터에 대해서는 큰 비트의 CRC를 사용하도록 한다.
- 통신 프로토콜에서 패킷의 오류 검출은 16, 파일 무결성 체크의 경우 32, 매우 큰 데이터 세트를 처리할 경우 64를 사용한다고 한다. (보다 상세한 기준 관련해서는 추가 스터디 필요)
- CRC vs SHA
- CRC는 오류 검출 목적으로는 적합하나 보안 목적(위조 방지, 정합성 보증)으로 사용하기에는 다소 취약하다.
- SHA는 해시 충돌이 거의 없으므로 데이터의 위조 여부를 확인하는 암호학적인 보안 강화 목적으로 사용한다.
- 단, SHA는 내부에 복잡한 비트 연산이 포함되어 있으므로 최종 단계에서 한 번만 사용하도록 한다.
- 어떤 시나리오에서 주로 사용하는가?
- 데이터 블록 전송 중 오류 검출 -> CRC
- 데이터 전체에 대한 무결성 검증 -> SHA