윈도우 서버에 대해서

Visual C++ 에서 MD5

중년 플머 김씨 2012. 11. 30. 11:35

게임서버와 웹, 빌링쪽에 연동하려할때 상대쪽에선 자바나 펄위주라 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"의 경우 메모리 디버거에서는

 

 

 

같은 결과 값이 나왔습니다.