gpt4 book ai didi

c++ - 如何导出对称 AES key cryptoapi

转载 作者:行者123 更新时间:2023-11-30 02:42:07 26 4
gpt4 key购买 nike

我有一些问题。我需要使用 CryptoAPI 生成和导出对称 key 。

     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 key 。我该如何解决这个问题,请帮忙。我如何获得 AES key ??

更新例如,我使用下一个代码可以获得公共(public) RSA key 。

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导出后我导入 key 并尝试加密和解密

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);

}

最佳答案

CryptExportKey 有一个限制。它需要以加密形式导出非公钥。当您导出公共(public)部分或 RSA key 对时,可以将第二个 CryptExportKey 参数设置为 NULL 并以未加密的形式导出 key 。但是,您不能对必须指定非空 hExpKey 参数的对称 key 执行相同操作。如果您指定 hExpKey 参数,您的代码就可以工作,请参见示例:

#include <Windows.h>
#include <cstdio>

int main(int argc, char *argv[])
{
// Create AES key
HCRYPTPROV hCryptProv_AES;
if (CryptAcquireContext(&hCryptProv_AES, 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;
}
HCRYPTKEY hSessionKey_AES;
if (!CryptGenKey(hCryptProv_AES, CALG_AES_256, CRYPT_EXPORTABLE, &hSessionKey_AES))
{
DWORD d = GetLastError();
return -1;
}
// Create RSA key to encrypt AES one
HCRYPTKEY hSessionKey;
if (!CryptGenKey(hCryptProv_AES, AT_KEYEXCHANGE, 1024 << 16, &hSessionKey))
{
DWORD d = GetLastError();
return -1;
}
// Export key
DWORD keylen;
BOOL ok = CryptExportKey(hSessionKey_AES, hSessionKey, SIMPLEBLOB, 0, NULL, &keylen);
if (ok == FALSE)
{
DWORD d = GetLastError();
return -1;
}
BYTE *encKey = (BYTE *)malloc(keylen);
ok = CryptExportKey(hSessionKey_AES, hSessionKey, SIMPLEBLOB, 0, encKey, &keylen);
if (ok == FALSE)
{
DWORD d = GetLastError();
return -1;
}
else
printf("A cryptographic key export succeeded.\r\n");
return 0;
}

如果你想进行 key 交换(比方说,如果你想让 Alice 将她的 AES key 发送给 Bob),你必须执行以下步骤:

  1. Bob 生成 RSA key 并将其公开部分发送给 Alice。看,Bob 开始,而不是 Alice!
  2. Bob 将他的 key 公开部分发送给 Alice。
  3. Alice 生成 AES key 。
  4. Alice 使用 Bob 的公钥加密 AES key 。
  5. Alice 将 AES key 发送给 Bob。
  6. Bob 使用他的私钥解密 AES key (即使用 CryptImportKey 导入它)。导入 key 时,将hPubKey参数设置为非NULL值,实际上是将其设置为Bob的 key 句柄,否则导入将失败,因为AES key 已加密。

关于c++ - 如何导出对称 AES key cryptoapi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27396474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com