您的位置:首页 > 产品设计 > UI/UE

CryptAcquireContext函数返回“密钥集不存在”错误的解决代码

2009-03-23 16:25 567 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: