CRC (Cyclic Redundancy Check)는 데이터 전송 중 발생할 수 있는 오류를 검출하기 위한 오류 검출 코드입니다. 주로 네트워크 통신과 저장장치에서 데이터의 무결성을 확인하는 데 사용됩니다.
CRC는 수학적으로 이진 다항식을 이용하며, 데이터를 다항식 연산을 통해 검증합니다.
생성다항식은 CRC 알고리즘에서 데이터를 나눗셈할 때 사용하는 기준 다항식으로, 데이터의 오류 검출 능력을 결정짓는 핵심 요소입니다.
생성다항식은 이진수로 표현되며, 특정 길이의 비트열을 다항식으로 해석합니다. 예를 들어:
1101
→ 다항식: (x^3 + x^2 + 1)CRC에서 자주 사용하는 생성다항식은 아래와 같습니다:
이름 | 다항식 | 표현 | 적용 사례 |
---|---|---|---|
CRC-8 | (x^8 + x^2 + x + 1) | 100000111 | 저속 네트워크 |
CRC-16-CCITT | (x^{16} + x^{12} + x^5 + 1) | 11021 | 무선 통신, 블루투스 |
CRC-32 | (x^{32} + x^{26} + x^{23} + \cdots + 1) | RFC-793 | 이더넷, 파일 시스템 |
CRC-64 | (x^{64} + x^4 + x^3 + x + 1) | 1 000000000000000011101 | 고속 네트워크와 대용량 스토리지 |
def crc_remainder(input_bits, generator_bits):
"""
CRC 잔여값 계산
input_bits: 입력 데이터 (비트열)
generator_bits: 생성다항식 (비트열)
"""
n = len(generator_bits)
data = input_bits + '0' * (n - 1) # 데이터에 0 패딩 추가
data = list(data) # 문자열을 리스트로 변환
for i in range(len(input_bits)):
if data[i] == '1': # MSB가 1이면 나눗셈 수행
for j in range(n):
data[i + j] = str(int(data[i + j]) ^ int(generator_bits[j]))
remainder = ''.join(data[-(n - 1):]) # 나머지 값 추출
return remainder
# 사용 예시
input_bits = "11010011101100" # 입력 데이터
generator_bits = "1011" # 생성다항식
crc = crc_remainder(input_bits, generator_bits)
print(f"CRC 잔여값: {crc}")
CRC는 데이터 무결성을 보장하는 핵심 기술로, 생성다항식 선택과 구현이 시스템의 신뢰성에 큰 영향을 미칩니다.