У меня есть некоторые проблемы. Мне нужно создать и экспортировать симметричный ключ с использованием CryptoAPI.Как экспортировать симметричный ключ AES 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?
UPDATE Например, я использую следующий код и могу получить открытый ключ 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);
UPDATE 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'? – Vitaliy
return FALSE && код ошибки f = 2148073485 – Vahagn