검색결과 리스트
글
MD5(Message-Digest algorithm 5)
기타
2010. 12. 10. 01:58
MD5(Message-Digest algorithm 5)
임의의 길이의 메시지를 입력받아, 128비트 짜리 고정길이의 출력값을 내는 암호화 해시함수. 역함수가 존재하지 않는 함수이다. 역함수가 존재하지 않는 함수라는 것은, 동일한 키를 알지 못한다면, 해싱된 결과로 키를 유추해 낼수 없다는 의미이다. 주로 파일의 내용이 변경됐지는 여부를 검사하기 위해 사용된다고 한다.
URL인코딩
HTTP 프로토콜에서 URL 에 주소를 지정할 때, 공백과 같은 특수문자를 포함할 수 있게 하기 위해서 만들어진 인코딩 방식으로, 알파벳과 수, @, .(dot) 문자들을 제외한 특수문자들을 아스키값을 2개의 16진수 문자로 표현하고, 앞에 %문자를 붙여 표현한 인코딩방식이다. 이 인코딩 방식을 적용하면, 아스키값 32를 값는 공백문자는 %20으로 표현된다. 인코딩된 문자열을 디코딩하면 원래의 문자열로 복원할 수 있는데, %를 포함한 3문자를 읽어서 16진수를 10진수로 변환하면 원래 문자를 얻을 수 있다. 다음은 URL인코딩과 디코딩을 수행하는 c 함수이다.
char * URLEncode(const char *origin)
{
char *decoded, *src, *dst;
int cntOfPercent = numOfEncodingChar(origin); // 인코딩을 적용할 문자의 수 카운트
src = origin;
decoded = dst = (char*)malloc(strlen(origin) + 1 + cntOfPercent*2); // 메모리 할당
while (*src != '\0') {
if ( (*src >= 'A' && *src <= 'Z') || (*src >= 'a' && *src <= 'z') ||
(*src >= '0' && *src <= '9') || (*src == '@' || *src == '.') ) {
*dst++ = *src++;// 인코딩 적용이 안되는 문자는 그대로 복사
} else {
*dst++ = '%';// %문자를 붙히고,
sprintf(dst, "%02X", *src++); // 16진수로 변환
dst += 2;
}
}
*dst = '\0'; // 널문자로 종료
return decoded;
}
char * URLDecode(const char *encoded)
{
char *decoded, *src, *dst;
int cntOfPercent = numOfPercent(encoded);// %문자의 개수를 카운트
src = encoded;
decoded = dst = (char*)malloc(strlen(encoded) + 1 - cntOfPercent*2); // 메모리 할당
while (*src != '\0') {
if (*src == '%') {// %를 만나면 이후 2문자를 10진수로 변환
src++;
if (*src >= 'A' && *src <= 'F') {
*dst = *src++ - 55;
} else if (*src >= 'a' && *src <= 'f') {
*dst = *src++ - 87;
} else if (*src >= '0' && *src <= '9') {
*dst = *src++ - '0';
}
*dst <<= 4;
if (*src >= 'A' && *src <= 'F') {
*dst++ += *src++ - 55;
} else if (*src >= 'a' && *src <= 'f') {
*dst++ += *src++ - 87;
} else if (*src >= '0' && *src <= '9') {
*dst++ += *src++ - '0';
}
} else {// 인코딩이 적용안된 문자는 그대로 복사
*dst++ = *src++;
}
}
*dst = '\0';
return decoded;
}
// %의 개수를 카운트 (인코딩된 문자의 개수)
int numOfPercent(const char * str)
{
int cntOfPercent = 0;
char *pstr = str;
while (*pstr++ != '\0') {
if (*pstr == '%') {
cntOfPercent++;
}
}
return cntOfPercent;
}
// 인코딩할 문자 카운트 (알파벳, 숫자, . , @를 제외한 특수문자)
int numOfEncodingChar(const char * str)
{
int cntOfEncodingChar = 0;
char * src = str;
while (*src++ != '\0') {
if ( (*src >= 'A' && *src <= 'Z') || (*src >= 'a' && *src <= 'z') ||
(*src >= '0' && *src <= '9') || (*src == '@' || *src == '.') ) {
;
} else {
cntOfEncodingChar++;
}
}
return cntOfEncodingChar;
}
'기타' 카테고리의 다른 글
| 지갑 (0) | 2011.05.26 |
|---|---|
| 2011년 자바 개발자 컨퍼런스 등록!! (1) | 2011.05.23 |
| Base64 Encoding (0) | 2011.02.18 |
| muju (33) | 2011.02.14 |
| 정규표현식(Regular Expression) (0) | 2010.12.10 |
| MD5(Message-Digest algorithm 5) (0) | 2010.12.10 |