몇 가지 문제가 있습니다. 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 열쇠를 얻을 수 있는가 ??
업데이트 예를 들어 다음 코드를 사용하고 공용 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'는 어떤 에러 코드를 제공합니까? – Vitaliy
반환 값 FALSE && 오류 코드 f = 2148073485 – Vahagn