체크섬

중복 검사의 한 형태

체크섬(checksum)은 중복 검사의 한 형태로, 오류 정정을 통해, 공간(전자 통신)이나 시간(기억 장치) 속에서 송신된 자료의 무결성을 보호하는 단순한 방법이다.

일반적인 체크섬 기능의 결과 (유닉스 cksum 유틸리티)

통신에서 순환 중복 검사(CRC)를 체크섬이라고 말하기도 한다. 엄밀히 말하면 체크섬은 나열된 데이터를 더하여 체크섬 숫자를 얻고, 정해진 비트수의 모듈라로 정해진 비트수로 재구성 한다. 단순 덧셈 방식과 순환 중복 검사의 계산 방식과는 차이가 있으나, 많은 경우 순환 중복 검사의 결과를 체크섬이라고 말하므로 단순 덧셈만을 의미하지는 않는다.

기본적인 메시지 구성 요소(보통 비트)를 추가하여 결과값을 저장함으로써 동작한다. 나중에 누구나 데이터에 같은 작업을 수행할 수 있고, 무결성 검사에 대한 결과를 비교할 수 있으며, (체크섬이 맞아 떨어지는지 확인해 봄으로써) 메시지가 손상되지 않았다고 결론을 내릴 수도 있다.

마이크로프로세서를 활용한 시스템을 설계할 때, 프로그램은 주로 C언어로 작성한다. C 언어는 컴파일러링커에 의해 최종 결합하면 기계어 코드의 묶음이 나온다. 이것이 실행파일(헥사 파일, hexa)인데, 메모리에 써서 CPU가 동작할 수 있게 한다. 이 실행파일에 체크섬을 적용하여 줄 단위로 오류를 검증한다. 인텔과 과거 모토로라(현재 프리스케일, 반도체 칩 제조사)에서 사용하였다. 여기서는 정해진 형식에 따라 바이트 단위로 단순 덧셈을 하여, 1바이트 모듈라를 취해 최종 값을 만든다. 이것을 해당라인의 끝에 오류 체크용으로 붙여 파일을 만든다.

체크섬의 예

편집

단순한 체크섬의 예는 다음과 같다:

  • 다음과 같이 4 바이트의 데이터가 있다고 치자: 0x25, 0x62, 0x3F, 0x52
  • 1 단계: 모든 바이트를 덧셈하면 0x118이 된다.
  • 2 단계: 캐리 니블을 버림으로써 0x18을 만든다.
  • 3 단계: 0x18의 16(0x100)의 보수를 얻음으로써 0xE8을 얻는다. 이것이 체크섬 바이트이다.
  • 체크섬 바이트가 정확히 계산되었는지 테스트 해 보는 방법은
  • 계산된 체크섬 바이트와 원래 그룹의 바이트를 더해서 0x100이 되는지 확인해 보면 된다. (16의 보수를 통해 체크섬 바이트를 구했기 때문에)
  • 참고로 0x100에서 캐리 니블을 버리면 0x00이 되며 이는 오류가 없다는 의미이다. (오류가 있어도 우연히 0x00이 될 수도 있다.)

순환 중복 검사 (CRC,cyclic redundancy check)

편집

인터넷 등의 통신시스템에서 오류검증에 중요한 방법으로 사용한다. TCP/IP, MAC 등의 계층에서 오류검증으로 사용한다. 정해진 다항식이 결정되어 있고, 이것에 따라 송신 쪽에서 계산하여 헤더에 붙여 보내면 수신 쪽에서 다시 계산하고 보내진 체크섬과 비교한다.

경우에 따라 하드웨어 또는 소프트웨어 방법으로 계산한다. 상황에 따라 개발자가 설계 결정하고 구현한다. 보통 TCP/IP등은 소프트웨어적인 방법이 대부분이고, 밑의 계층으로 갈수록 하드웨어에 의존하는 경향이 있다.

마이크로프로세서에서 실행파일 체크섬

편집

프로그램 후 생성후 실행파일은 여러 가지 형태가 있으나 아스키 코드에 의한 텍스터 파일 형태를 많이 사용한다. 정해진 포맷에 따라 줄단위로 오류검증을 한다. 각줄의 마지막에 체크섬 숫자를 붙인다.

인텔 방식의 마이크로프로세서 실행파일 체크섬의 예

편집
:10010000214601360121470136007EFE09D2190140
:100110002146017EB7C20001FF5F16002148011988
:10012000194E79234623965778239EDA3F01B2CAA7
:100130003F0156702B5E712B722B732146013421C7
:00000001FF
  Start code
  Byte count
  Address
  Record type
  Data
  Checksum

데이터만 더하면

:100130003F0156702B5E712B722B732146013421C7
FF +  10 + 01 + 30 +  3F + 01 + 56 + 70 + 2B + 5E + 71 + 2B + 72 + 2B +73 + 21 + 46 + 01 + 34 + 21 = 538

한바이트로 모듈라를 취하고, 다시 1의 보수를 취하면 계산이 끝난다. ~38 = C7

인텔에서 제시한 체크섬은 다음과 같은 함수를 사용하면 된다.

unsigned char CalcChecksum(unsigned char *data, int leng)
{
  unsigned char csum;

    csum = 0xFF;
    for (;leng > 0;leng--)
        csum += *data++;
    return ~csum;
}
S00F000068656C6C6F202020202000003C
S11F00007C0802A6900100049421FFF07C6C1B787C8C23783C6000003863000026
S11F001C4BFFFFE5398000007D83637880010014382100107C0803A64E800020E9
S111003848656C6C6F20776F726C642E0A0042
S5030003F9
S9030000FC
  Start code
  Record type
  Byte count
  Address
  Data
  Checksum


데이터만 더하면

S111003848656C6C6F20776F726C642E0A0042
11 + 00 + 38 + 48 + 65 + 6C + 6C + 6F + 20 + 77 + 6F + 72 + 6C + 64 + 2E + 0A +00 = 4BD

4BD에서 한바이트로 모듈라를 취하고, 0xFF에서 빼면 계산이 끝난다.

FF - BD = 42

모토로라에서 제시한 체크섬은 다음과 같은 함수를 사용하면 된다.

unsigned char CalcChecksum(unsigned char *data, int leng)
{
  unsigned char csum;

    csum = 0;
    for (;leng > 0;leng--)
        csum += *data++;

    return 0xFF - csum;
}

같이 보기

편집

외부 링크

편집