【发布时间】:2015-02-08 09:07:05
【问题描述】:
我有一些问题。我需要使用 CryptoAPI 生成和导出对称密钥。
if(CryptAcquireContext(&hCryptProv_AES, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0))
{
_tprintf(
TEXT("A cryptographic provider has been acquired. \n"));
}
else
{
DWORD d = GetLastError();
std::cout<<"";
return -1;
}
if (!CryptGenKey(hCryptProv_AES,CALG_AES_256,CRYPT_EXPORTABLE,&hSessionKey_AES))
{
DWORD d = GetLastError();
std::cout<<"";
return -1;
}
else
{
std::cout<<"OK";
}
// Export key
BYTE keybuf[ 1024 ], buffer[ 1024 ];
DWORD i, keylen = sizeof( buffer );
struct ekb
{
PUBLICKEYSTRUC hdr;
ALG_ID algId;
BYTE key[1];
} *encKey = (struct ekb *)buffer;
bool bbb = CryptExportKey(hSessionKey_AES, NULL, SIMPLEBLOB, 0, (BYTE *)encKey, &keylen);
DWORD f = GetLastError();
但不能使用 AES 密钥。 我该如何解决这个问题,请帮助。如何获取 AES 密钥??
更新 例如,我使用下一个代码并且可以获得公共 RSA 密钥。
char * base_txt = "Test text";
char * enc_text = "";
if(CryptAcquireContext(&hCryptProv_RSA, NULL, MS_ENHANCED_PROV , PROV_RSA_FULL, 0))
{
_tprintf(
TEXT("A cryptographic provider has been acquired. \n"));
}
else
{
DWORD d = GetLastError();
std::cout<<"";
return -1;
}
if (!CryptGenKey(hCryptProv_RSA,AT_KEYEXCHANGE,1024<<16,&hSessionKey))
{
DWORD d = GetLastError();
std::cout<<"";
return -1;
}
RSAPubKey1024 key;
DWORD dwLen=sizeof(RSAPubKey1024);
// Export key
bool bb = CryptExportKey(hSessionKey,NULL,PUBLICKEYBLOB,0,(BYTE *)&key,&dwLen);
更新 2 导出后我导入密钥并尝试加密和解密
HCRYPTPROV hCryptProv_AES22;
if (CryptAcquireContext(&hCryptProv_AES22, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0))
{
printf("A cryptographic provider has been acquired.\r\n");
}
else
{
DWORD d = GetLastError();
return -1;
}
int iii = CryptImportKey(hCryptProv_AES22,(BYTE *)&exportKey_AES,keylen,NULL,NULL,&hSessionKey_AES2);
if(CryptSetKeyParam(hSessionKey_AES2,KP_IV, exportKey_AES, 0))
{
BYTE encryptedMessage[1024];
const char * message = "Decryption Works -- using multiple blocks";
BYTE messageLen = (BYTE)strlen(message);
memcpy(encryptedMessage, message, messageLen);
DWORD encryptedMessageLen = messageLen;
CryptEncrypt(hSessionKey_AES2, NULL, TRUE, 0, encryptedMessage, &encryptedMessageLen, sizeof(encryptedMessage));
CryptDecrypt(hSessionKey_AES2,NULL,TRUE,0,encryptedMessage, &encryptedMessageLen);
}
【问题讨论】:
-
为什么你认为你不能赌AES密钥?
CryptExportKey是否返回FALSE?如果是,GetLastError给出的错误代码是什么? -
返回 FALSE && 错误代码 f = 2148073485
标签: c++ encryption aes cryptoapi