티스토리 뷰
반응형
Rev 1.01
CRC32 (Cyclic Redundancy Checking)
CRC[씨알씨]는 통신 링크로 전송되어온 데이터 내에 에러가 있는지 확인하기 위한 방법 중의 하나이다. 송신장치는 전송될 데이터 블록에 16 비트 또는 32 비트 다항식을 적용하여, 그 결과로 얻어진 코드를 그 블록에 덧붙인다.
수신측에서는 데이터에 같은 다항식을 적용하여 그 결과를 송신측이 보내온 결과와 비교한다. 만약 두 개가 일치하면, 그 데이터는 성공적으로 수신된 것이며, 그렇지 않은 경우 그 데이터 블록을 재 송신하도록 송신측에게 요구한다.
ITU-T(이전의 CCITT)는 송신블록에 부가될 코드를 얻는데 사용되는 16 비트 다항식에 대한 표준을 제정했다.
IBM의 SDLC와 다른 프로토콜들은 CRC-16과 다른 16 비트 다항식을 사용한다. 16 비트 CRC는 두 개의 비트가 동시에 에러가 난 경우를 포함하여, 일어날 수 있는 모든 에러에 대하여 99.998% 검출을 보장한다.
이 정도의 검출보증은 4 KB 이하의 데이터 블록 전송에는 충분한 것으로 평가되고 있으며, 그 이상의 대량 전송에는 32 비트 CRC가 사용된다. 이더넷과 토큰링 프로토콜에서도 모두 32 비트 CRC를 사용한다.
이상, www.terms.co.kr 에 적혀 있는 CRC 에 관한 내용을 발췌 하였습니다.
쉽게 말하자면 여러 용도가 있지만, PC에서는 주로, 파일의 에러를 체크하는데 CRC가 사용됩니다. 즉 파일이 깨졌는지 아닌지 알아보는 데 사용하는 것입니다.
예를 들어, 맹구가 어떤 홈페이지에서 100기가짜리 파일을 며칠 걸려서 다운로드 받았는데, 그 파일이 깨지지 않고 정확하게 전송되었는지 알려면 어떻게 해야 할까요. 그 파일을 다시 한 번 더 다운로드 받아서, 전에 받은 파일과 한 글자씩 비교해 보아야 할 것입니다. 그러나 그러면 같은 파일을 2번 다운받아야 하니 아주 비효율적입니다.
그런데 만약 그 홈페이지 주인장이 그 파일의 CRC값을 알려준다면 간단히 해결됩니다. 가령 홈페이지 주인장이, "그 파일의 CRC 값은, D01B0B02 다" 라고 알려 주었다고 가정합시다.
맹구가 다운 받은 그 파일의 CRC값을 계산해서, D01B0B02 라는 값이 나오면 파일이 100% 정확히 받아진 것이고, 틀리다면 파일이 깨진 것이라는 사실을 간단히 알 수 있습니다.
100기가짜리 파일을 다시 다운받지 않아도, 고작 8글자의 CRC 값만 알면, 그 파일의 훼손 여부를 정확히 알 수 있습니다. 즉 CRC는 파일의 지문에 해당되는 것입니다. 사람이 모두 고유한 지문을 가지고 있듯이 파일에도 고유한 지문이 있습니다.
CRC의 정확성
만약 그 D01B0B02 라는 CRC 값을 가진 파일에서 단 글자라도 깨진다면 또는 단 1비트라도 변한다면, 그 파일의 CRC 값은 엄청나게 달라집니다. D01B0B02 가 D01B0B03 정도의 값으로 변하는 것이 아니라, 79D52C9D 등으로 아주 확 달려져 버립니다. 그래서 파일의 일부가 변경 또는 훼손되었다는 사실을 한눈에 알 수 있습니다.
요즘에 쓰는 CRC는 CRC32 입니다.
CRC32 는 C9AEBFF7 이런 식으로, 십육진수를 사용해 8글자로 표기합니다.
그러나 CRC32가 완벽하게 에러를 검출하는 것은 아닙니다. 파일이 훼손되거나 변경되었지만 같은 CRC32 값을 가지고 있을 수도 있습니다.
2의 32 승 = 4294967296 (약 43억)
결국 CRC32는, 00000000 ~ FFFFFFFF 까지 약 43억개의 경우의 수가 있습니다.
그래서 만약 파일이 43억개가 있다면, 확률적으로, 그 중의 하나에서 CRC가 제 기능을 못할 수 있습니다. 따라서 CRC32 가 오류를 일으킬 확률은 43억분의 1이라고 생각됩니다. ※ 제 생각일 뿐이지, 학술적으로 정확한지는 모르겠습니다.
아무튼 일반 PC 에서 사용할 때는 CRC32로도 충분합니다. 더 엄밀한 에러 체커를 위해서, MD5 (Message-Digest algorithm 5) 라는 알고리즘이 사용됩니다. 32비트가 아닌 128비트입니다. (리눅스 CD를 다운받으러 가면 사이트에 MD5 값이 함께 적혀 있습니다.) 그러나 이것도 완벽한 것은 아닙니다. 해커가 속이려고 들면 속이는 건 시간 문제라고 하더군요.
ZIP 이나 RAR 같은 압축 프로그램이 파일을 압축할 때에는, 파일과 그 파일의 CRC32 값을 함께 저장합니다.
예제:
Date Time CRC-32 Name
---- ---- -------- ----
2006-06-04 20:45 7E83AC61 simcity_2000_happylnd.png
2006-06-02 14:19 B4F36322 chess_kchess_elite.png
2006-06-04 14:57 D01B0B02 chessboard_std_medium.zip
2006-06-03 11:36 521E65D3 0.htm
2006-06-04 20:08 791AB223 simcity_2000_toolbar.png
그러면 압축파일 속에 들어 있는 파일들이 깨졌는지/변조되었는지를 알 수 있기 때문입니다. WinRAR 이나 WinZip에는 "Test" 라는 것이 있습니다. 이것이 바로 CRC를 검사하는 것입니다.
만약 파일이 깨졌다면 그 파일의 CRC32 값과 불일치하게 됩니다. 이것이 CRC 에러 입니다.
즉, CRC 에러가 났다는 것은, 그 파일이 깨졌다는 의미입니다. 파일이 깨지면 (이론적으로) 그 파일을 완벽히 복구하는 것은 불가능합니다.
단, RAR로 압축할 때에 Put recovery record 라는 옵션을 켜면, CRC 에러가 났을 때 100% 복구할 수도 있습니다. 그러나 이러면 압축파일의 용량이 약간 커지는 문제가 있습니다.
CRC32 값 구하기
파일의 CRC 값을 알기 위한 가장 간단한 방법은 그 파일을 WinRAR 이나 WinZip 등으로 압축해 보는 것입니다. (WinRAR 이나 WinZip에서는 기본적으로, CRC값을 보여주지 않는데, 보여주도록 화면을 설정하면 됩니다.)
CRC32 (Cyclic Redundancy Checking)
CRC[씨알씨]는 통신 링크로 전송되어온 데이터 내에 에러가 있는지 확인하기 위한 방법 중의 하나이다. 송신장치는 전송될 데이터 블록에 16 비트 또는 32 비트 다항식을 적용하여, 그 결과로 얻어진 코드를 그 블록에 덧붙인다.
수신측에서는 데이터에 같은 다항식을 적용하여 그 결과를 송신측이 보내온 결과와 비교한다. 만약 두 개가 일치하면, 그 데이터는 성공적으로 수신된 것이며, 그렇지 않은 경우 그 데이터 블록을 재 송신하도록 송신측에게 요구한다.
ITU-T(이전의 CCITT)는 송신블록에 부가될 코드를 얻는데 사용되는 16 비트 다항식에 대한 표준을 제정했다.
IBM의 SDLC와 다른 프로토콜들은 CRC-16과 다른 16 비트 다항식을 사용한다. 16 비트 CRC는 두 개의 비트가 동시에 에러가 난 경우를 포함하여, 일어날 수 있는 모든 에러에 대하여 99.998% 검출을 보장한다.
이 정도의 검출보증은 4 KB 이하의 데이터 블록 전송에는 충분한 것으로 평가되고 있으며, 그 이상의 대량 전송에는 32 비트 CRC가 사용된다. 이더넷과 토큰링 프로토콜에서도 모두 32 비트 CRC를 사용한다.
이상, www.terms.co.kr 에 적혀 있는 CRC 에 관한 내용을 발췌 하였습니다.
쉽게 말하자면 여러 용도가 있지만, PC에서는 주로, 파일의 에러를 체크하는데 CRC가 사용됩니다. 즉 파일이 깨졌는지 아닌지 알아보는 데 사용하는 것입니다.
예를 들어, 맹구가 어떤 홈페이지에서 100기가짜리 파일을 며칠 걸려서 다운로드 받았는데, 그 파일이 깨지지 않고 정확하게 전송되었는지 알려면 어떻게 해야 할까요. 그 파일을 다시 한 번 더 다운로드 받아서, 전에 받은 파일과 한 글자씩 비교해 보아야 할 것입니다. 그러나 그러면 같은 파일을 2번 다운받아야 하니 아주 비효율적입니다.
그런데 만약 그 홈페이지 주인장이 그 파일의 CRC값을 알려준다면 간단히 해결됩니다. 가령 홈페이지 주인장이, "그 파일의 CRC 값은, D01B0B02 다" 라고 알려 주었다고 가정합시다.
맹구가 다운 받은 그 파일의 CRC값을 계산해서, D01B0B02 라는 값이 나오면 파일이 100% 정확히 받아진 것이고, 틀리다면 파일이 깨진 것이라는 사실을 간단히 알 수 있습니다.
100기가짜리 파일을 다시 다운받지 않아도, 고작 8글자의 CRC 값만 알면, 그 파일의 훼손 여부를 정확히 알 수 있습니다. 즉 CRC는 파일의 지문에 해당되는 것입니다. 사람이 모두 고유한 지문을 가지고 있듯이 파일에도 고유한 지문이 있습니다.
CRC의 정확성
만약 그 D01B0B02 라는 CRC 값을 가진 파일에서 단 글자라도 깨진다면 또는 단 1비트라도 변한다면, 그 파일의 CRC 값은 엄청나게 달라집니다. D01B0B02 가 D01B0B03 정도의 값으로 변하는 것이 아니라, 79D52C9D 등으로 아주 확 달려져 버립니다. 그래서 파일의 일부가 변경 또는 훼손되었다는 사실을 한눈에 알 수 있습니다.
요즘에 쓰는 CRC는 CRC32 입니다.
CRC32 는 C9AEBFF7 이런 식으로, 십육진수를 사용해 8글자로 표기합니다.
그러나 CRC32가 완벽하게 에러를 검출하는 것은 아닙니다. 파일이 훼손되거나 변경되었지만 같은 CRC32 값을 가지고 있을 수도 있습니다.
2의 32 승 = 4294967296 (약 43억)
결국 CRC32는, 00000000 ~ FFFFFFFF 까지 약 43억개의 경우의 수가 있습니다.
그래서 만약 파일이 43억개가 있다면, 확률적으로, 그 중의 하나에서 CRC가 제 기능을 못할 수 있습니다. 따라서 CRC32 가 오류를 일으킬 확률은 43억분의 1이라고 생각됩니다. ※ 제 생각일 뿐이지, 학술적으로 정확한지는 모르겠습니다.
아무튼 일반 PC 에서 사용할 때는 CRC32로도 충분합니다. 더 엄밀한 에러 체커를 위해서, MD5 (Message-Digest algorithm 5) 라는 알고리즘이 사용됩니다. 32비트가 아닌 128비트입니다. (리눅스 CD를 다운받으러 가면 사이트에 MD5 값이 함께 적혀 있습니다.) 그러나 이것도 완벽한 것은 아닙니다. 해커가 속이려고 들면 속이는 건 시간 문제라고 하더군요.
ZIP 이나 RAR 같은 압축 프로그램이 파일을 압축할 때에는, 파일과 그 파일의 CRC32 값을 함께 저장합니다.
예제:
Date Time CRC-32 Name
---- ---- -------- ----
2006-06-04 20:45 7E83AC61 simcity_2000_happylnd.png
2006-06-02 14:19 B4F36322 chess_kchess_elite.png
2006-06-04 14:57 D01B0B02 chessboard_std_medium.zip
2006-06-03 11:36 521E65D3 0.htm
2006-06-04 20:08 791AB223 simcity_2000_toolbar.png
그러면 압축파일 속에 들어 있는 파일들이 깨졌는지/변조되었는지를 알 수 있기 때문입니다. WinRAR 이나 WinZip에는 "Test" 라는 것이 있습니다. 이것이 바로 CRC를 검사하는 것입니다.
만약 파일이 깨졌다면 그 파일의 CRC32 값과 불일치하게 됩니다. 이것이 CRC 에러 입니다.
즉, CRC 에러가 났다는 것은, 그 파일이 깨졌다는 의미입니다. 파일이 깨지면 (이론적으로) 그 파일을 완벽히 복구하는 것은 불가능합니다.
단, RAR로 압축할 때에 Put recovery record 라는 옵션을 켜면, CRC 에러가 났을 때 100% 복구할 수도 있습니다. 그러나 이러면 압축파일의 용량이 약간 커지는 문제가 있습니다.
CRC32 값 구하기
파일의 CRC 값을 알기 위한 가장 간단한 방법은 그 파일을 WinRAR 이나 WinZip 등으로 압축해 보는 것입니다. (WinRAR 이나 WinZip에서는 기본적으로, CRC값을 보여주지 않는데, 보여주도록 화면을 설정하면 됩니다.)
반응형
'Board' 카테고리의 다른 글
[통신관련] dns 서버 바꾸기 (필터링을 피하기 위한) (0) | 2007.08.30 |
---|---|
[하드웨어] 캐시 메모리의 작동 원리 (0) | 2007.08.30 |
[C언어] Visual C++ 로, 파일의 CRC32 값 구하기 (0) | 2007.08.30 |
SATA HDD의 NCQ지원(AHCI) 활성화 방법 (0) | 2007.08.30 |
Windows 별 메모리 최대 지원 입니다. (0) | 2007.08.30 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- apache
- 파일
- delete
- 오라클
- table
- 서버
- 백업
- user
- select
- DB
- Oracle
- MySQL
- Windows
- server
- Shell
- 자동차
- 테이블
- mssql
- eclipse
- DATABASE
- IP
- Linux
- 설정
- Toad
- 리눅스
- java
- 데이터
- sql
- 윈도우
- tomcat
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함