int CUtility::deSecretCode(char* pszCode)
{
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
BYTE pbCode[MAX_PASS];
DWORD dwDataLen;
ZeroMemory(pbCode, MAX_PASS);
sprintf((char*)pbCode, "%s", pszCode);
dwDataLen = (DWORD)strlen((char*)pbCode) + 1;
// CSP(Crystographic Service Provider) 핸들 얻기
if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
{
if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
return 1;
}
// 해쉬 만들기
if(!CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash))
return 2;
// 해쉬 값 계산
if(!CryptHashData(hHash, (BYTE*)SECRET_KEY, (DWORD)strlen(SECRET_KEY), 0))
return 3;
// 키 만들기
if(!CryptDeriveKey(hProv, CALG_RC4, hHash, 0x0080*0x10000, &hKey))
return 4;
// 복호화
if(CryptDecrypt(hKey, 0, TRUE, 0, pbCode, &dwDataLen))
sprintf(pszCode, "%s", (char*)pbCode);
else
return 5;
// 해쉬 없애기
CryptDestroyHash(hHash);
// CSP 핸들 풀어주기
CryptReleaseContext(hProv, 0);
return 0;
}