본문 바로가기

프로그래밍(TA, AA)/C C++

[C/C++] CRC32 란?

CRC32란? 여러 용도가 있지만, PC에서는 주로, 파일의 에러를 체크하는데 CRC가 사용됩니다. 즉 파일이 깨졌는지 아닌지 알아보는데 사용하는 것입니다.


예를 들어, 어떤 홈페이지에서 100기가짜리 파일을 며칠 걸려서 다운로드 받았는데, 그 파일이 깨지지 않고 정확하게 전송되었는지 알려면 어떻게 해야할가요. 그 파일을 다시 한 번 더 다운로드 받아서, 전에 받은 파일과 한 글자씩 비교해 보아야할 것입니다. 그러나 그러면 같은 파일을 2번 다운받아야 하니 아주 비효율적입니다.


그런데 만약 파일의 CRC값을 알게된다면 간단히 해결됩니다. 운영자가 "그 파일의 CRC 값은 D01B0B02다" 라고 알려주게되면, 다운받은 파일의 CRC값을 계산하여, D01B0B02라는 값이 나오면 파일이 100% 정확히 받아진 것이고, 틀리다면 파일이 깨진 것이라는 사실을 간단히 알 수 있습니다.


100기가짜리 파일을 다시 다운받지 않아도, 고작 8글자의 CRC 값만 알면, 그 파일의 훼손 여부를 정확히 알 수 있습니다. 즉 CRC는 파일의 지문에 해당되는 것입니다. 사람이 모두 고유한 지문을 가지고 있듯이 파일에도 고유한 지문이 있습니다.


요즘에 쓰는 CRC는 CRC32입니다. CRC32는 C9AEBFF7 이런식으로, HEX를 사용해 8글자로 표시합니다. 그러나 CRC32가 완벽하게 에러를 검출하는 것은 아닙니다. 파일이 훼손되거나 변경되었지만 같은 CRC32 값을 가지고 있을 수 있습니다.


CRC32는 00000000 ~ FFFFFFFF 까지 2^32(약 43억)개의 경우의 수가 있습니다. 그래서 만약 파일이 43억개가 있다면, 확률적으로, 그 중의 하나에서 CRC가 제 기능을 못할 수 있습니다. 


더 엄밀한 에러 체커를 위해서, MD5(Message-Digest algorithm 5)라는 알고리즘이 사용됩니다. 32비트가 아닌 128비트입니다. 리눅스 CD를 다운받으러 가면 사이트에 MD5 값이 함께 적혀 있습니다.


ZIP이나 RAR 같은 압축 프로그램이 파일을 압축할 때에는, 파일과 그 파일의 CRC32 값을 함께 저장합니다. 그러면 압축파일 속에 들어있는 파일들이 깨졌는지/변조되었는지를 알 수 있기 때문입니다. WinRAR 이나 WinZip에는 "Test"라는 것이 있습니다. 이것이 바로 CRC를 검사하는 것입니다. 만약 파일이 깨졌다면 그 파일의 CRC32 값과 불일치하게 됩니다. 이것이 CRC 에러입니다.


즉, CRC 에러가 났다는 것은, 그 파일이 깨졌다는 의미입니다. 파일이 깨지면 이론상 그 파일을 완벽히 복구하는 것은 불가능 합니다.


C로 CRC32 값 구하기 : http://mwultong.blogspot.com/2006/05/c-c-crc32.html

Perl로 CRC32 값 구하기 : http://mwultong.blogspot.com/2006/06/perl-crc-crc32.html