1 개요 #
CRC-32는 ISO-3309을 통해 발표된 cyclic redundancy check에 기초한 채크섬 생성 알고리즘입니다. 결과 체크섬값은 4바이트의 octet으로 계산됩니다. CRC-32는 키기반의 방식도 아니고 원본값이 겹치는 것(충돌)을 방지한다는 것을 보장하지도 않습니다. (대신 연산속도는 꽤 빠른 편입니다. 충돌확률도 그리 낮은 편은 아닙니다.) 그러므로 보안체계 공격자는 체크섬을 만족하는 또다른 메세지를 생성하기위해 예측가능한 텍스트 모음을 통한 공격을 사용할 수 있습니다. 이렇게 심각한 위험이 우려되는 부분에는 충돌방지를 보장해주는 체크섬방식을 사용하는 것이 좋습니다.
4 괜찮은 용도 #
루아에서 __index 메타메소드를 사용해서 문자열을 키값으로 받는경우(즉, 필드처리할 경우), 매개변수로 넘어온 필드명 문자열을 strcmp()로 비교하는건 좀 미친 짓입니다. 이때 비교할 필드에 대한 crc32값을 미리 구해두고 매개변수로 전달된 필드명 문자열의 crc32값을 구해 비교하면 if stcmp() ...else if strcmp() ... 체계가 아닌 switch(hash_key) { } 문으로 깔끔하게 정리되고 속도도 개선될 수 있겠죠.
5 C code #
/*------------------------------ crc.h ----------------------*/ #ifndef _PRINTF_H /* defined in stdio.h */ #include <stdio.h> #endif /* generate the crc table. Must be called before calculating the crc value */ void gen_table(void); unsigned long get_crc(FILE *); /* calculate the crc32 value */ /*-----------------------------------------------------------*/ /*-------------------------- crc.c --------------------------*/ static unsigned long crc_table[256]; void gen_table(void) /* build the crc table */ { unsigned long crc, poly; int i, j; poly = 0xEDB88320L; for (i = 0; i < 256; i++) { crc = i; for (j = 8; j > 0; j--) { if (crc & 1) crc = (crc >> 1) ^ poly; else crc >>= 1; } crc_table[i] = crc; } } unsigned long get_crc( FILE *fp) /* calculate the crc value */ { register unsigned long crc; int ch; crc = 0xFFFFFFFF; while ((ch = getc(fp)) != EOF) crc = (crc>>8) ^ crc_table[ (crc^ch) & 0xFF ]; return( crc^0xFFFFFFFF ); }








![[http]](/wiki/imgs/http.png)
