Visual C++ 에서 MD5
게임서버와 웹, 빌링쪽에 연동하려할때 상대쪽에선 자바나 펄위주라 md5에 대한 암호 방식을 선호하던군요.
문제는 이걸 게임서버 (C++)에서 이용하려 할때 마땅한 정보가 없더군요.. ㅠㅠ
그러더중 msdn을 훝어보던중 적당한 예제소스를 발견했습니다.
참고 : MD5 ? http://ko.wikipedia.org/wiki/MD5
그리고 전체 알고리즘 : http://www.zedwood.com/article/121/cpp-md5-function
출처 : http://msdn.microsoft.com/ko-kr/library/windows/desktop/aa382380(v=vs.85).aspx
.. 좀더 핵심만, MD5 압축데이터를 얻고 오고 싶을때는...
#include <iostream>
#include <windows.h>
#include <wincrypt.h>
/*!==========================================================================================
* @brief MD5 해쉬 데이터를 얻어오기
* @return bool 성공/실패
* @param char * buffer 입력 버퍼
* @param DWORD dwBufferSize 입력 문자열 사이즈 "\0"제외
* @param BYTE * byteFinalHash 결과 해쉬 버퍼
* @param DWORD * dwFinalHashSize 결과 해쉬 버퍼의 총 크기
* @author Kim Dong-Sung (galaxy_wiz@naver.com)
* @date 2012-11-30
==========================================================================================*/
bool GetMD5Hash(char *buffer, DWORD dwBufferSize, BYTE *byteFinalHash, DWORD *dwFinalHashSize)
{
DWORD dwStatus = 0;
BOOL bResult = FALSE;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
DWORD cbHashSize = 0;
try{
//프로바이더 압축핸들 얻어오기
if(0 == CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
throw "CryptAcquireContext";
//압축알고리즘 선택, 여기서는 MD5
if(0 == CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
throw "CryptCreateHash";
//입력된 버퍼를 기반으로 한 헤쉬 데이터 생성
if(0 == CryptHashData(hHash, (const BYTE*) buffer, dwBufferSize, 0))
throw "CryptHashData";
//총 해쉬 사이즈얻어오기
DWORD dwCount = sizeof(DWORD);
if(0 == CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cbHashSize, &dwCount, 0))
throw "CryptGetHashParam";
//출력버퍼에 헤쉬데이터를 충분히 담을 수 있는지 확인
if(*dwFinalHashSize < cbHashSize){
printf("\n Output buffer %d, is not sufficient, Required size = %d", *dwFinalHashSize, cbHashSize);
bResult = TRUE;
throw "Memory problem";
}
//이제 해쉬를 계산해서 얻기
if(CryptGetHashParam(hHash, HP_HASHVAL, byteFinalHash, dwFinalHashSize, 0)){
bResult = TRUE;
}
else{
throw "CryptGetHashParam";
}
}
catch(char *errMsg){
printf("%s failed, Error=0x%.8x\n", errMsg, GetLastError());
}
if(hHash) CryptDestroyHash(hHash);
if(hProv) CryptReleaseContext(hProv, 0);
return bResult;
}
int main(int argc,char *argv[])
{
BYTE byteHashbuffer[256];
DWORD dwFinalHashSize= 256;
CHAR str[] = "password";
//_count_of(str)-1을 해서 맨 뒤의 '\0'을 뺀 버퍼 사이즈를 넣음.배열검사 생략했음
GetMD5Hash(str, _countof(str)-1, byteHashbuffer, &dwFinalHashSize);
printf("%s\n", byteHashbuffer);
return 0;
}
대충 감을 잡으실수 있을꺼 같습니다.
위의 예제 단어 "password"의 경우 메모리 디버거에서는
같은 결과 값이 나왔습니다.