체크섬

위키百科, 우리 모두의 百科事典.

一般的인 체크섬 機能의 結果 (유닉스 cksum 유틸리티)

체크섬 ( checksum )은 重複 檢事 의 한 形態로, 誤謬 訂正 을 통해, 空間( 電子 通信 )이나 時間( 記憶 裝置 ) 속에서 送信된 資料의 無結成을 保護하는 單純한 方法이다.

通信에서 循環 重複 檢事 (CRC)를 체크섬이라고 말하기도 한다. 嚴密히 말하면 체크섬은 羅列된 데이터를 더하여 체크섬 數字를 얻고, 定해진 비트數의 모듈라로 定해진 비트數로 再構成 한다. 單純 덧셈 方式과 循環 重複 檢事의 計算 方式과는 差異가 있으나, 많은 境遇 循環 重複 檢査의 結果를 체크섬이라고 말하므로 單純 덧셈만을 의미하지는 않는다.

基本的인 메시지 構成 要素(普通 비트 )를 追加하여 結果값을 貯藏함으로써 動作한다. 나중에 누구나 데이터에 같은 作業을 遂行할 수 있고, 無結成 檢査에 對한 結果를 比較할 수 있으며, (체크섬이 맞아 떨어지는지 確認해 봄으로써) 메시지가 損傷되지 않았다고 結論을 내릴 수도 있다.

마이크로프로세서 를 活用한 시스템을 設計할 때, 프로그램은 主로 C言語로 作成한다. C 言語는 컴파일러 링커 에 依해 最終 結合하면 機械語 코드의 묶음이 나온다. 이것이 實行파일( 헥사 파일 , hexa)인데, 메모리에 써서 CPU가 動作할 수 있게 한다. 이 實行파일에 체크섬을 適用하여 줄 單位로 誤謬를 檢證한다. 인텔과 過去 모토로라 (現在 프리스케일 , 半導體 칩 製造社)에서 使用하였다. 여기서는 定해진 形式에 따라 바이트 單位로 單純 덧셈을 하여, 1바이트 모듈라를 醉해 最終 값을 만든다. 이것을 該當라인의 끝에 誤謬 체크用으로 붙여 파일을 만든다.

체크섬의 예 [ 編輯 ]

單純한 체크섬의 例는 다음과 같다:

  • 다음과 같이 4 바이트의 데이터가 있다고 치자: 0x25, 0x62, 0x3F, 0x52
  • 1 段階: 모든 바이트를 덧셈하면 0x118이 된다.
  • 2 段階: 캐리 니블 을 버림으로써 0x18을 만든다.
  • 3 段階: 0x18의 2의 保守 를 얻음으로써 0xE8을 얻는다. 이것이 체크섬 바이트이다.
  • 체크섬 바이트를 테스트하려면 元來 그룹의 바이트에 체크섬 바이트까지 모두 더하면 0x200이 된다.
  • 다시 캐리 니블을 버림으로써 0x00이 된다. 0x00이라는 뜻은 誤謬가 없다는 뜻이다. (하지만 誤謬가 있어도 偶然히 0x00이 될 수도 있다.)

循環 重複 檢事 (CRC,cyclic redundancy check) [ 編輯 ]

인터넷 等의 通信시스템에서 誤謬檢證에 重要한 方法으로 使用한다. TCP/IP, MAC 等의 階層에서 誤謬檢證으로 使用한다. 定해진 多項式이 決定되어 있고, 이것에 따라 送信 쪽에서 計算하여 헤더에 붙여 보내면 受信 쪽에서 다시 計算하고 보내진 체크섬과 比較한다.

境遇에 따라 하드웨어 또는 소프트웨어 方法으로 計算한다. 狀況에 따라 開發者가 設計 決定하고 具現한다. 普通 TCP/IP등은 소프트웨어的인 方法이 大部分이고, 밑의 階層으로 갈수록 하드웨어에 依存하는 傾向이 있다.

마이크로프로세서 에서 實行파일 체크섬 [ 編輯 ]

프로그램 後 生成後 實行파일은 여러 가지 形態가 있으나 아스키 코드에 依한 텍스터 파일 形態를 많이 使用한다. 定해진 포맷에 따라 줄單位로 誤謬檢證을 한다. 角줄의 마지막에 체크섬 數字를 붙인다.

인텔 方式의 마이크로프로세서 實行파일 체크섬의 예 [ 編輯 ]

:
10
0100
00
214601360121470136007EFE09D21901
40

:
10
0110
00
2146017EB7C20001FF5F160021480119
88

:
10
0120
00
194E79234623965778239EDA3F01B2CA
A7

:
10
0130
00
3F0156702B5E712B722B732146013421
C7

:
00
0000
01
FF

   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
;

}

모토로라 方式의 마이크로프로세서 實行파일 체크섬의 예 [ 編輯 ]

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

   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
;

}

같이 보기 [ 編輯 ]

外部 링크 [ 編輯 ]