gpt4 book ai didi

c++ - 使用 WinCrypt 进行 AES-128 加密

转载 作者:行者123 更新时间:2023-11-30 19:09:09 37 4
gpt4 key购买 nike

我需要使用 WinCrypt 为我的 C/C++ 应用程序加密 AES-128 下的字符串。

为了理解整个事情是如何工作的,我编写了一个程序来使用 16 字节 AES key (128 位)加密 16 字节字符串,但它没有按预期工作(并且 MSDN 示例没有帮助)。

我的主要问题是对 CryptEncrypt 的调用,我可能不清楚如何使用参数:

  • *pbData
  • *pdwDataLen
  • dwBufLen

这是我的代码:

#include <windows.h> 
#include <stdio.h>
#include <wincrypt.h>
#define ENCRYPT_ALGORITHM CALG_AES_128

int main()
{

HCRYPTPROV hCryptProv;
HCRYPTKEY hKey;

//---------------------------------------------------------------
// Get the handle to the provider.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL, //MS_ENH_RSA_AES_PROV
PROV_RSA_AES,
0))
{
printf("A cryptographic provider has been acquired. \n");
}
else
{
printf("Error during CryptAcquireContext!\n");
exit(1);
}


//---------------------------------------------------------------
// Create a random session key.

if(CryptGenKey(
hCryptProv,
ENCRYPT_ALGORITHM,
CRYPT_EXPORTABLE, //KEYLENGTH | CRYPT_EXPORTABLE,
&hKey))
{
printf("A session key has been created.\n");
}
else
{
printf("Error during CryptGenKey.\n");
exit(1);
}
}

char text_test [] = "abcdabcdabcdabcd";
DWORD text_len = strlen(text_test);

printf("PlainText: %s\n",text_test);
printf("Buf Len: %d\n",text_len);

if (!CryptEncrypt(hKey,
NULL, // hHash = no hash
1, // Final
0, // dwFlags
&text_test, //*pbData
&text_len, //*pdwDataLen
32)) { //dwBufLen
printf("Encryption failed\n");
}

printf("CipherText: %s\n",text_test);
printf("Len: %d\n",text_len);

if (!CryptDecrypt(hKey,
NULL, // hHash = no hash
1, // Final
0, // dwFlags
&text_test,
&text_len)) {
printf("Decryption failed\n");
}

printf("PlainText: %s\n",text_test);
printf("Len: %d\n",text_len);
.
.
.
CryptDestroyKey(hKey)
.
.
CryptReleaseContext(hCryptProv, 0)
.

cmd中的输出是:

enter image description here

谁能解释一下为什么解密后的字符串更长,以及 CryptEncrypt 的三个参数的正确用法是什么?我将最后一个值设置为 32,因为经过一些尝试和错误,这是使这个东西起作用的唯一值。请帮忙并提前致谢!

最佳答案

我也是密码学新手,但是这段代码来自 here可能有您的解决方案:

  // This acts as both the length of bytes to be encoded (on input) and the
// number of bytes used in the resulting encrypted data (on output).
DWORD length = kAesBytes128;
if (!CryptEncrypt(hKey,
NULL, // hHash = no hash
true, // Final
0, // dwFlags
reinterpret_cast<BYTE*>(encrypted->data()),
&length,
encrypted->length())) {
throw std::runtime_error("Encryption failed");
}

// See comment above.
encrypted->chop(length - kAesBytes128);

或者我可能会使用 Crypto++ 从类似的项目代码中进行一些工作

关于c++ - 使用 WinCrypt 进行 AES-128 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43656951/

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