Вы должны импортировать ключ с помощью функции CryptImportKey .
BOOL CryptImportKey(
HCRYPTPROV hProv,
const BYTE *pbData,
DWORD dwDataLen,
HCRYPTKEY hPubKey,
DWORD dwFlags,
HCRYPTKEY *phKey
);
hProv - дескриптор CSP, полученный с помощью функции CryptAcquireContext.
hPubKey - в вашем случае должно быть 0.
dwFlags - в вашем случае должно быть 0.
phKey - результирующий ключ, который ожидал CryptDecrypt.
А вот какая-то хитрая часть. pbData должна содержать структуру BLOBHEADER , за которой следует значение ключа.
typedef struct _PUBLICKEYSTRUC {
BYTE bType;
BYTE bVersion;
WORD reserved;
ALG_ID aiKeyAlg;
} BLOBHEADER, PUBLICKEYSTRUC;
bType = PLAINTEXTKEYBLOB (0x08) - in your case
bVersion = CUR_BLOB_VERSION (0x02)
reserved = 0
aiKeyAlg = algorithm id which you used in CryptGenKey
Пример кода:
BYTE key_value[] = { 0x76, 0xFD, 0x3D, 0xBD, 0xFA, 0x2A, 0xA0, 0x71, 0x13, 0xA2, 0x27, 0xD9, 0xE0, 0x31, 0x1D, 0xC5,
0xBC, 0x7F, 0xA7, 0x8A, 0x7E, 0x4F, 0xC3, 0xCE, 0x63, 0x91, 0x9B, 0x9C, 0x49, 0xDC, 0x4F, 0x06 };
BLOBHEADER bh;
bh.bType = PLAINTEXTKEYBLOB;
bh.bVersion = CUR_BLOB_VERSION;
bh.reserved = 0;
bh.aiKeyAlg = CALG_AES_256;
DWORD dwDataLen = sizeof(key_value) + sizeof(bh);
BYTE* pbData = (BYTE*)malloc(dwDataLen);
BYTE* ptr = pbData;
memcpy(ptr, (BYTE*)&bh, sizeof(bh));
ptr += sizeof(bh);
memcpy(ptr, key_value, sizeof(key_value));
if (!CryptImportKey(hProv, pbData, dwDataLen, 0, 0, &hKey)) {
return GetLastError();
}