#include <WinCrypt.h> #define KEYLENGTH 0x00800000 BOOL MyEncryptData(PBYTE pbyBuff, int iLen, char *szPasswd) { HCRYPTPROV hCryptProv; HCRYPTKEY hKey; HCRYPTHASH hHash; BOOL bRet = FALSE; DWORD dwLen, dwTmp = *((DWORD*)pbyBuff); PBYTE p = pbyBuff; DWORD dwErr = GetLastError(); if(!CryptAcquireContext(&hCryptProv, NULL, MS_DEFAULT_CSP, PROV_RSA_FULL, CRYPT_DELETEKEYSET)) { dwErr = GetLastError(); printf("Err: CryptAcquireContext(CRYPT_DELETEKEYSET),dwErr = 0x%08X/n", dwErr); } else { printf("CryptAcquireContext(CRYPT_DELETEKEYSET) OK,hCryptProv=0x%08X!/n", hCryptProv); CryptReleaseContext( hCryptProv, 0); } if(!CryptAcquireContext(&hCryptProv, NULL, MS_DEFAULT_CSP, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { dwErr = GetLastError(); printf("Err: CryptAcquireContext(CRYPT_NEWKEYSET),dwErr = 0x%08X/n", dwErr); } else { printf("CryptAcquireContext(CRYPT_NEWKEYSET) OK,hCryptProv=0x%08X!/n", hCryptProv); CryptReleaseContext( hCryptProv, 0); } printf("/nBegin:/n"); dwLen = iLen; bRet = CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0); if( !bRet ) { printf("%08x Error CryptAcquireContext()!/n", ::GetLastError() ); return bRet; } bRet = CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash); if( !bRet ) { printf("%08x Error CryptCreateHash()!/n", ::GetLastError() ); return bRet; } bRet = CryptHashData(hHash, (BYTE *)szPasswd, strlen(szPasswd), 0); if( !bRet ) { printf("%08x Error CryptHashData()!/n", ::GetLastError() ); return bRet; } bRet = CryptDeriveKey(hCryptProv, CALG_RC4, hHash, KEYLENGTH, &hKey); if( !bRet ) { printf("%08x Error CryptDeriveKey()!/n", ::GetLastError() ); return bRet; } bRet = CryptEncrypt(hKey, 0, 1, 0, p, &dwLen, dwLen); if( !bRet ) { printf("%08x Error CryptEncrypt()!/n", ::GetLastError() ); return bRet; } CryptDestroyKey(hKey); CryptDestroyHash(hHash); CryptReleaseContext( hCryptProv, 0); return bRet; }