체크섬
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
체크섬은 통신 시스템에서 데이터 오류를 검증하기 위해 사용되는 방법이다. 데이터를 워드 단위로 나누어 각 워드의 합을 계산하는 방식으로 산출하며, 계산된 체크섬은 데이터와 함께 전송되어 수신 측에서 재계산된 체크섬과 비교하여 오류 발생 여부를 확인한다. 체크섬은 단순한 덧셈 방식을 사용하므로 신뢰성이 높지 않으며, 의도적인 데이터 변조에 취약하다. 다양한 종류의 체크섬 알고리즘이 존재하며, 마이크로프로세서 실행 파일의 오류 검증에도 활용된다.
더 읽어볼만한 페이지
체크섬 |
---|
2. 명칭 및 용어
"체크섬"이라는 명칭은 체크섬의 부호값 자체를 가리키는 경우도 있다.
인터넷과 같은 통신 시스템에서 데이터 전송 중 발생하는 오류를 검증하는 중요한 방법으로 사용된다. 특히 TCP/IP, 이더넷 프레임의 MAC 계층 등 여러 통신 계층에서 오류 검증을 위해 체크섬을 활용한다. 데이터 송신 측에서는 미리 정해진 방식(예: 특정 다항식)에 따라 체크섬 값을 계산하여 데이터의 헤더 부분에 포함시켜 전송한다. 데이터를 수신한 측에서는 동일한 방식으로 체크섬을 다시 계산한 후, 수신된 체크섬 값과 비교하여 데이터의 무결성을 확인한다.
단순한 체크섬의 예를 들면 다음과 같다.
또한, 오류 검출 및 기타 데이터 검증을 위해 널리 사용되어 온 경위로 인해, 속칭 오류 검출 부호 자체의 대명사로 사용되는 경우가 있다. 예를 들어 CRC의 부호값이나 MD5의 해시값을 각각 "'''CRC 체크섬'''", "'''MD5 체크섬'''"이라고 부르기도 한다. 이들은 산출 방법이 다르고 ''sum''도 아니기 때문에, "체크섬"이라고 부르는 것은 어의상 정확하지 않지만, " (체크섬보다) 신뢰성이 높은 오류 검출 부호" 정도의 의미로 사용된다.
3. 산출 방법
체크섬 계산은 필요에 따라 하드웨어를 이용하거나 소프트웨어적으로 구현할 수 있다. 어떤 방식을 사용할지는 개발자가 시스템의 특성과 요구 사항에 따라 결정한다. 일반적으로 TCP/IP와 같이 상대적으로 상위 계층의 프로토콜에서는 소프트웨어적인 방법이 주로 사용되며, 물리 계층이나 데이터 링크 계층과 같은 하위 계층으로 갈수록 하드웨어적인 구현에 의존하는 경향이 있다.
가장 기본적인 체크섬 계산 방법은 데이터를 일정한 크기의 단위인 '워드(word)'로 나누어, 각 워드의 값을 모두 더하는 것이다. 이 총합(sum)의 특정 부분, 예를 들어 가장 하위 비트들로 구성된 1워드를 체크섬 값으로 사용한다. 여기서 1워드를 몇 비트로 정의할지는 구현 방식에 따라 달라질 수 있다 (예: 8비트, 16비트 등).
예를 들어, 1워드를 8비트로 사용하는 경우를 생각해보자. 다음과 같은 16진법으로 표현된 8비트 워드 데이터 열이 있다고 가정한다.
:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
이 워드들의 총합은 16진수로 7816이다. 이 경우, 가장 단순한 방식으로는 이 합계 값 "78
" 자체를 체크섬으로 사용할 수 있다.
이 기본 방식 외에도, 총합에서 어떤 비트 그룹을 최종 체크섬 값으로 선택할지, 또는 계산된 값을 어떻게 추가적으로 처리할지(예: 보수 사용) 등에 따라 다양한 변형된 체크섬 알고리즘이 존재한다.
네트워크를 통해 데이터를 전송할 때, IP 패킷의 헤더 무결성을 검사하기 위한 체크섬 산출 과정은 대표적인 예시이며, 주로 다음과 같은 단계로 이루어진다.
# IP 헤더 내의 체크섬 필드 값을 일단 0으로 설정한다.
# IP 헤더 전체를 16비트 단위로 나누어 각 단위의 값을 모두 더한다. 만약 덧셈 과정에서 자리올림(carry)이 발생하면, 그 자리올림 값을 결과에 다시 더해준다 (1의 보수 덧셈).
# 이렇게 얻어진 합계 값에 대해 1의 보수를 취한다. 이 보수 값이 최종 체크섬 값이 된다.
# 계산된 체크섬 값을 IP 헤더의 체크섬 필드에 기록한 후 패킷을 전송한다.
# 패킷을 수신한 측에서는 IP 헤더 전체(수신된 체크섬 값 포함)를 16비트 단위로 나누어 위의 2단계와 동일한 방식(1의 보수 덧셈)으로 모두 더한다.
# 모든 헤더 정보가 오류 없이 올바르게 수신되었다면, 최종 합계 값은 모든 비트가 1인 값(16진법으로 FFFF)이 되어야 한다. 이는 체크섬 필드에 '체크섬 필드를 0으로 간주하고 계산한 나머지 헤더 합계의 1의 보수'가 들어있기 때문에, 전체 헤더(체크섬 필드 포함)를 1의 보수 덧셈으로 합산하면 이론적으로 모든 비트가 1이 되기 때문이다. (또는 이 합계에 다시 1의 보수를 취하면 0이 된다.)
Intel HEX 형식과 같이 ROM 데이터를 표현하거나 전송할 때 사용되는 체크섬 방식도 있다. 이 경우, 보통 데이터를 8비트 단위로 모두 더한 후, 그 합계의 특정 비트(예: 하위 8비트 또는 32비트)를 사용하거나, 합계의 2의 보수를 사용하는 등 다양한 방식이 적용된다. 예를 들어 데이터가 16진수로 12 34 56 78
이라면, 단순히 8비트 단위로 더한 값은 0x12 + 0x34 + 0x56 + 0x78 = 0x00000114 와 같이 계산될 수 있으며, 실제 체크섬 값은 이 합계를 특정 규칙(예: 하위 8비트만 취하거나, 2의 보수를 취하는 등)에 따라 가공하여 결정된다.
4. 체크섬의 예
`0x25 + 0x62 + 0x3F + 0x52 = 0x118`
`0x100 - 0x18 = 0xE8`
이것이 체크섬 바이트이다.
체크섬 바이트의 정확성 검증 방법은 다음과 같다.
`0x118 + 0xE8 = 0x200`
5. 종류
체크섬 알고리즘에는 여러 종류가 있으며, 각각 다른 방식과 특징을 가진다.
가장 기본적인 형태 중 하나는 세로 중복 검사 방식으로, 데이터 워드들의 비트별 배타적 논리합(XOR)을 이용한다.[3] 또 다른 방식으로는 데이터 워드들을 더한 후 2의 보수를 취하는 합의 보수 방식이 있다.[4]
이러한 단순한 방식들의 한계를 보완하기 위해 데이터의 순서나 위치 정보를 계산에 포함하는 위치 의존적 체크섬(플레처 체크섬, Adler-32, 순환 중복 검사)들이 개발되었다. 이 방식들은 오류 검출 능력이 더 뛰어나다.
특수한 목적으로 설계된 체크섬도 있는데, 예를 들어 이메일 스팸 탐지를 위해 내용이 조금씩 변형된 메시지들을 동일하게 식별하도록 고안된 퍼지 체크섬이 있다.[5]
5. 1. 패리티 바이트 또는 패리티 워드
가장 간단한 체크섬 알고리즘 중 하나는 세로 중복 검사이다. 이 방식은 데이터를 고정된 비트 수 ''n''을 갖는 "워드(word)" 단위로 나눈 뒤, 모든 워드에 대해 비트별 배타적 논리합(XOR) 연산을 수행한다. 이 연산 결과로 얻어진 워드가 체크섬이며, 원래 메시지 끝에 추가된다. 예를 들어, ''n''=1인 경우는 데이터 비트 끝에 하나의 비트를 추가하여 전체 '1'의 개수가 짝수가 되도록 만드는 단순 패리티 비트 방식과 같다. 메시지를 받은 수신자는 체크섬을 포함한 모든 워드에 대해 다시 비트별 XOR 연산을 수행하여 메시지의 무결성을 확인한다. 만약 이 결과가 ''n''개의 0으로 이루어진 워드가 아니라면, 전송 중 오류가 발생했음을 알 수 있다.[3]이 체크섬 방식은 메시지 내에서 단일 비트 오류가 발생했거나 홀수 개의 비트가 변경된 경우 이를 감지할 수 있다. 그러나 두 개의 비트에서 오류가 발생했을 때, 그 두 비트가 서로 다른 워드의 동일한 위치에 있다면 오류를 감지하지 못한다. 또한, 두 개 이상의 워드 순서가 뒤바뀌는 경우도 감지할 수 없다. 만약 오류가 발생하는 비트가 무작위로 독립적으로 선택된다고 가정하면, 2비트 오류가 감지되지 않을 확률은 1/''n''이다.[3]
5. 2. 합의 보수
데이터의 모든 "단어"를 부호 없는 이진수로 더하고, 오버플로 비트(넘치는 부분)를 버린 다음, 그 총합의 2의 보수를 계산하여 체크섬으로 추가하는 방식이다. 메시지를 받은 쪽에서는 체크섬을 포함하여 모든 단어를 동일한 방식으로 더한다. 이 계산 결과가 0으로만 이루어진 단어가 아니라면 전송 중 오류가 발생했다고 판단할 수 있다. 이 방식은 하나의 비트에서 오류가 발생하는 단일 비트 오류를 감지할 수 있다. 프로 모듈러 합은 SAE J1708 표준에서 사용된다.[4]5. 3. 위치 의존
단순한 체크섬 방식은 데이터 워드의 순서가 바뀌거나, 모든 비트가 0으로 설정된 워드가 중간에 삽입 또는 삭제되는 등 여러 비트에 동시에 영향을 미치는 특정 오류들을 감지하지 못하는 약점이 있다.이러한 한계를 보완하기 위해 실제로 많이 사용되는 플레처 체크섬, Adler-32, 순환 중복 검사(CRC)와 같은 체크섬 알고리즘들은 각 워드의 값뿐만 아니라 시퀀스 내에서의 위치 정보까지 고려한다. 이처럼 위치 정보를 함께 활용하면 오류 검출률을 높일 수 있지만, 일반적으로 계산 과정이 더 복잡해지고 처리 비용이 증가하는 단점이 있다.
5. 4. 퍼지 체크섬
퍼지 체크섬은 이메일 스팸을 효과적으로 감지하기 위해 고안된 방식이다. 여러 ISP가 협력하여 스팸으로 의심되는 이메일 정보를 모아 데이터베이스를 구축하는 데 활용된다.[5] 스팸 메일은 발송될 때마다 내용의 세부 사항이 조금씩 바뀌는 경우가 많은데, 이 때문에 일반적인 체크섬 방식으로는 동일한 스팸 메일을 식별하기 어렵다.퍼지 체크섬은 이러한 문제를 해결하기 위해 이메일 본문 텍스트를 특징적인 최소값으로 줄인 뒤, 이 값을 기반으로 체크섬을 생성한다. 이렇게 하면 내용이 약간 다르더라도 동일한 스팸 메일이라면 같은 체크섬 값을 가질 가능성이 매우 높아진다.[5]
SpamAssassin과 같은 ISP의 스팸 감지 소프트웨어는 DCC와 같은 중앙 집중식 서비스에 이메일의 퍼지 체크섬 값을 보낸다. 만약 특정 퍼지 체크섬 값이 일정 횟수 이상으로 제출되면, 중앙 데이터베이스는 해당 이메일을 스팸으로 분류할 가능성이 높다고 판단한다. 일반 사용자들도 자신의 이메일에 대해 퍼지 체크섬을 생성하여 중앙 서비스를 통해 스팸 여부를 조회할 수 있다.[5]
6. 마이크로프로세서 실행 파일 체크섬
프로그램을 만든 후 생성되는 실행 파일은 여러 형태가 존재하지만, 아스키 코드를 기반으로 하는 텍스트 파일 형식이 자주 사용된다. 이러한 파일 형식에서는 정해진 포맷에 따라 각 줄 단위로 데이터 오류를 검증하며, 이를 위해 각 줄의 마지막에 체크섬 숫자를 추가한다. 이 체크섬은 해당 줄의 데이터가 전송이나 저장 과정에서 손상되지 않았는지 확인하는 데 사용된다. 마이크로프로세서 실행 파일에서 사용되는 구체적인 체크섬 구현 방식으로는 인텔 방식이나 모토로라 방식 등이 있다.
6. 1. 인텔 방식
인텔 마이크로프로세서 실행 파일 등에서 사용되는 인텔 HEX 형식 파일의 각 라인은 다음과 같은 구조를 가지며, 마지막 바이트는 해당 라인의 체크섬이다.
:10010000214601360121470136007EFE09D2190140
:100110002146017EB7C20001FF5F16002148011988
:10012000194E79234623965778239EDA3F01B2CAA7
:100130003F0156702B5E712B722B732146013421C7
:00000001FF
각 필드는 다음과 같은 의미를 가진다.
- `:` : 시작 코드 (Start code)
- 첫 두 글자 (예: `10`) : 바이트 수 (Byte count) - 데이터 필드의 바이트 길이 (16진수)
- 다음 네 글자 (예: `0100`) : 주소 (Address) - 데이터가 저장될 메모리 주소 (16진수)
- 다음 두 글자 (예: `00`) : 레코드 유형 (Record type) - 데이터 레코드(00), 파일 끝(01) 등
- 가운데 데이터 부분 (예: `2146...1901`) : 데이터 (Data) - 실제 데이터 바이트 (16진수)
- 마지막 두 글자 (예: `40`) : 체크섬 (Checksum)
체크섬은 해당 라인의 바이트 수, 주소, 레코드 유형, 데이터 바이트를 모두 더한 후, 결과 값의 하위 1바이트(8비트)에 대해 1의 보수를 취하여 계산한다.
예를 들어, 네 번째 라인 `:100130003F0156702B5E712B722B732146013421C7`의 체크섬 `C7`은 다음과 같이 계산된다.
1. 체크섬을 제외한 모든 바이트 값을 16진수로 더한다.
`10 + 01 + 30 + 00 + 3F + 01 + 56 + 70 + 2B + 5E + 71 + 2B + 72 + 2B + 73 + 21 + 46 + 01 + 34 + 21 = 538` (16진수)
2. 합계 `538`의 하위 1바이트는 `38`이다. (538을 256으로 나눈 나머지)
3. `38`의 1의 보수를 계산한다. 이는 모든 비트를 반전시키는 것과 같다.
`~0x38 = 0xC7` (16진수)
따라서 체크섬 값은 `C7`이 된다. 마지막 라인 `:00000001FF`는 파일의 끝(EOF)을 나타내는 레코드이며, 이때 체크섬은 `FF`이다.
다음은 인텔에서 제시한 체크섬 계산 방법의 C 함수 예시이다. 이 함수는 바이트 배열(`data`)과 길이(`leng`)를 입력받아 체크섬을 계산하여 반환한다.
unsigned char CalcChecksum(unsigned char *data, int leng)
{
unsigned char csum;
csum = 0xFF; // 체크섬 계산 시작 값
for (;leng > 0;leng--)
csum += *data++; // 데이터 바이트를 계속 더해나감 (8비트 덧셈, 자리올림 무시)
return ~csum; // 최종 합계의 1의 보수를 반환
}
6. 2. 모토로라 방식
시작 코드 | 레코드 타입 | 바이트 수 | 주소 | 데이터 | 체크섬 |
---|---|---|---|---|---|
S | 0 | 0F | 0000 | 68656C6C6F20202020200000 | 3C |
S | 1 | 1F | 0000 | 7C0802A6900100049421FFF07C6C1B787C8C23783C60000038630000 | 26 |
S | 1 | 1F | 001C | 4BFFFFE5398000007D83637880010014382100107C0803A64E800020 | E9 |
S | 1 | 11 | 0038 | 48656C6C6F20776F726C642E0A00 | 42 |
S | 5 | 03 | 0003 | F9 | |
S | 9 | 03 | 0000 | FC |
모토로라 S-record 형식에서 사용하는 체크섬은 각 레코드의 바이트 수, 주소, 데이터 필드의 바이트 값을 모두 더한 후, 그 합계의 1의 보수를 취하여 계산한다. 즉, 모든 바이트 값을 더한 결과의 최하위 바이트(LSB)를 0xFF에서 뺀 값이다.
예를 들어, 위 표의 네 번째 줄 레코드(S111003848656C6C6F20776F726C642E0A0042)를 살펴보자. 이 레코드에서 체크섬 계산에 사용되는 필드는 다음과 같다.
- 바이트 수: 11 (16진수)
- 주소: 0038 (16진수)
- 데이터: 48 65 6C 6C 6F 20 77 6F 72 6C 64 2E 0A 00 (16진수)
이 값들을 16진수로 모두 더하면 다음과 같다.
11 + 00 + 38 + 48 + 65 + 6C + 6C + 6F + 20 + 77 + 6F + 72 + 6C + 64 + 2E + 0A + 00 = 4BD (16진수)
계산된 합계 4BD (16진수)에서 최하위 바이트(LSB)인 BD를 취한다. 마지막으로, 이 값을 0xFF에서 빼서 체크섬 값을 얻는다.
FF - BD = 42 (16진수)
이 계산 결과(42)는 해당 레코드의 마지막 바이트인 체크섬 값과 일치한다.
다음은 C++ 언어로 구현된 모토로라 방식 체크섬 계산 함수의 예시이다. 이 함수는 데이터 배열과 길이를 입력받아 체크섬 값을 반환한다.
// 데이터 배열과 길이를 받아 체크섬을 계산하는 함수
unsigned char CalcChecksum(unsigned char *data, int leng)
{
unsigned char csum = 0; // 체크섬 합계를 저장할 변수, 0으로 초기화
// 주어진 길이(leng)만큼 데이터 배열을 순회
for (; leng > 0; leng--) {
csum += *data++; // 현재 바이트 값을 csum에 더하고, 포인터를 다음 바이트로 이동
}
// 최종 합계(csum)의 1의 보수를 반환 (0xFF에서 합계를 뺌)
return 0xFF - csum;
}
7. 변형
체크섬 구현에는 몇 가지 변형이 가능하다. 대표적인 변형 방식으로는 체크섬 필드에 기록하는 값의 차이(합계 또는 보수), 계산 시작 시 초기값 설정 방식, 데이터의 위치 정보 반영 여부 등이 있다.
7. 1. 체크섬 란에 기록하는 값
체크섬 필드에 기록되는 값은 주로 두 가지 방식 중 하나를 따른다.하나는 계산된 합계값을 그대로 기록하는 방식이다. 예를 들어 Intel HEX 형식의 ROM 데이터는 각 바이트 값을 더한 합계 자체를 체크섬으로 사용하기도 한다.
다른 하나는 계산된 합계값의 보수를 기록하는 방식이다. IP 패킷의 헤더 체크섬이 이 방식을 사용하는 대표적인 예이다. IP 헤더 체크섬은 다음과 같은 과정을 통해 계산되고 사용된다.
# 전송 전, IP 헤더의 체크섬 필드를 0으로 설정한다.
# 헤더 전체를 16비트 단위로 나눈 뒤 모두 더한다.
# 계산된 합계의 1의 보수를 구하여 체크섬 필드에 기록한 후 전송한다.
# 데이터를 수신한 쪽에서는 체크섬 값이 포함된 IP 헤더 전체를 동일하게 16비트 단위로 더한다.
# 이때 계산된 총합이 특정 값(16진법으로 FFFF, 즉 모든 비트가 1)이 되면 오류가 없는 것으로 판단한다. 이는 체크섬 필드에 원래 합계의 1의 보수가 저장되어 있으므로, 전체를 더했을 때 모든 비트가 1이 되는 원리를 이용한 검증 방식이다.
합계 대신 보수를 기록하는 방식은 수신 측에서 전체 데이터의 길이를 미리 알지 못하는 상황에서도 유용하다. 데이터를 받는 동안 계속해서 값을 더해나가기만 하면, 통신이 종료되었을 때 최종 합계를 통해 전체 데이터의 오류 여부를 검사할 수 있기 때문이다.
7. 2. 초기값 문제
체크섬 필드를 0으로 초기화하는 대신, 0이 아닌 특정 값으로 초기화한 후 덧셈 연산을 수행하는 방식도 사용된다. 이 경우 모든 비트가 0인 데이터(예: `0x00 ... 0x00`)에 대한 체크섬 값은 0이 아닌 다른 값이 된다.데이터 전송 오류로 모든 데이터가 0으로 잘못 수신되는 상황을 가정해 보자. 체크섬 필드를 0으로 초기화하는 일반적인 방식에서는, 모든 비트가 0인 데이터에 대해 계산된 체크섬 값 역시 0이 된다. 이는 데이터가 정상적으로 수신된 것처럼 잘못 판단될 수 있으며, 데이터와 체크섬 필드를 포함한 전체 메시지가 모두 0인 경우를 유효한 데이터로 오인할 가능성을 만든다.
하지만 체크섬 필드를 0이 아닌 값으로 미리 초기화하면, 모든 비트가 0인 데이터에 대한 체크섬 계산 결과는 초기화 값의 영향을 받아 0이 아닌 값이 된다. 따라서 데이터 수신 실패 등으로 모든 값이 0으로 채워진 비정상적인 데이터를 수신하더라도, 계산된 체크섬 값은 메시지에 포함된 체크섬 값(이 경우 0)과 일치하지 않게 된다. 이를 통해 데이터 오류를 성공적으로 감지할 수 있다. 결과적으로, 체크섬 필드를 0이 아닌 값으로 초기화하는 것은 데이터가 제대로 읽히지 않은 경우를 유효한 데이터와 구별하여 오류 검출 능력을 향상시키는 효과가 있다.
7. 3. 위치 의존
단순한 방식의 체크섬은 데이터 조각(워드)의 순서가 바뀌거나, 모든 비트가 0인 데이터 조각이 중간에 삽입되거나 삭제되는 등 여러 비트에 동시에 영향을 주는 일부 흔한 오류들을 감지하지 못하는 약점이 있다. 실제 널리 사용되는 플레처 체크섬, Adler-32, 순환 중복 검사(CRC)와 같은 체크섬 알고리즘들은 이러한 약점을 보완하기 위해 각 데이터 조각의 값뿐만 아니라 데이터열 내에서의 위치 정보까지 고려한다. 하지만 데이터의 위치까지 계산에 포함시키기 때문에 일반적으로 단순한 체크섬보다 계산 비용이 더 많이 든다.8. 신뢰성
체크섬은 계산 방식이 단순한 덧셈에 기반하기 때문에 몇 가지 한계를 가진다. 예를 들어, 데이터 블록 내에서 각 워드(word)의 순서만 바뀌고 내용 자체는 그대로인 경우, 체크섬 값은 변경 전과 동일하게 계산된다. 또한, 다른 종류의 오류가 발생했음에도 우연히 같은 체크섬 값이 나올 확률이 존재하므로, 오류 검출 방법으로서의 신뢰성이 아주 높다고 보기는 어렵다.
체크섬을 포함한 오류 검출 부호는 암호화 해시 함수와는 달리, 데이터의 암호화나 위조 방지를 염두에 두고 설계된 기술이 아니다. 따라서 체크섬은 데이터 전송 과정 등에서 발생할 수 있는 우발적인 오류를 검출하는 데는 유용하지만, 누군가가 의도적으로 데이터를 조작하려는 시도에는 취약하다. 계산 방식이 단순하여, 원래 데이터와 내용은 다르지만 체크섬 값은 동일하게 만드는 것이 비교적 쉽기 때문이다. 예를 들어, '00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F' 데이터의 체크섬 값이 78(16진수)이라고 할 때, 순서를 바꾼 '08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07' 데이터의 체크섬 값도 동일하게 78(16진수)이 된다.
8. 1. 의도적인 개찬의 예
원래의 데이터 열이 '00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F'라고 가정해 보자. 이 데이터 열의 체크섬 값은 특정 계산 방식에 따라 '78'(16진수)이라고 하자.이제 이와 완전히 다른 데이터 열 '70 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00'을 생각해보자. 이 데이터 열의 체크섬 값은 '72'(16진수)이다. 하지만 이 데이터 열의 마지막 바이트를 '00'에서 '06'으로 변경하여 '70 00 02 00 00 00 00 00 00 00 00 00 00 00 00 06'으로 만들면, 체크섬 값이 원래 데이터 열과 동일한 '78'(16진수)이 된다.
이처럼 체크섬 값이 같도록 데이터를 의도적으로 조작하는 것이 가능하다. 만약 어떤 시스템이 수신한 데이터의 무결성을 체크섬 값만으로 확인한다면, 이렇게 조작된 데이터를 원래의 정상적인 데이터로 잘못 인식할 위험이 있다. 이는 체크섬이 데이터의 오류를 검출하는 데는 유용하지만, 데이터의 위변조를 완벽하게 방지하지는 못한다는 것을 보여주는 예시이다.
9. 일반적인 고려 사항
''m''비트 길이의 메시지는 ''m''차원 초입방체의 한 모서리로 볼 수 있다. ''n''비트 체크섬을 생성하는 체크섬 알고리즘은 각 ''m''비트 메시지를 더 큰 (''m'' + ''n'')차원 초입방체의 모서리로 대응시키는 과정이다. 이 초입방체의 2''m'' + ''n''개의 모서리는 수신 가능한 모든 메시지를 나타낸다. 이 중 유효한 수신 메시지, 즉 올바른 체크섬을 가진 메시지는 2''m''개의 모서리로 이루어진 더 작은 집합을 구성한다.
데이터 전송 중 단일 비트 오류는 유효한 모서리(정확한 메시지와 체크섬)에서 ''m''개의 인접한 모서리 중 하나로 이동하는 것에 해당한다. 만약 ''k''개의 비트에 오류가 발생하면 메시지는 올바른 모서리에서 ''k'' 단계 떨어진 모서리로 이동하게 된다. 좋은 체크섬 알고리즘의 목표는 유효한 모서리들을 서로 최대한 멀리 떨어뜨려, 일반적인 전송 오류가 발생했을 때 결과적으로 유효하지 않은 모서리에 도달할 가능성을 높이는 것이다. 이를 통해 오류 검출 확률을 높일 수 있다.
참조
[1]
웹사이트
Definition of CHECKSUM
https://www.merriam-[...]
2022-03-10
[2]
웹사이트
What Is a Checksum (and Why Should You Care)?
https://www.howtogee[...]
2019-09-30
[3]
웹사이트
Checksums & Integrity Checks
https://erg.abdn.ac.[...]
2022-03-11
[4]
웹사이트
SAE J1708
http://www.kvaser.co[...]
Kvaser.com
[5]
웹사이트
IXhash
https://cwiki.apache[...]
Apache
2020-01-07
[6]
간행물
[7]
간행물
[8]
간행물
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com