【发布时间】:2017-07-25 14:51:54
【问题描述】:
我正在尝试使用 wincrypt 加密文本消息。然而,我的代码是不可预测的。它不会加密/解密整个明文,而只是其中的一部分。如果我更改密码的长度(例如“password123”),它会加密/解密不同数量的字符。这是我的代码。
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
int main()
{
const char* passw = "password12";
const char* toencrypt = "consectetur adipiscing elit. In tellus nisl, sodales non arcu quis, sagittis maximus orci cras amet.";
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
DWORD todwSize = (DWORD)strlen(toencrypt);
PBYTE pBuffer;
CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
CryptHashData(hHash, (BYTE*)passw, strlen(passw), 0);
CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey);
//--------------------------------------------------------------------
CryptEncrypt(hKey, 0, TRUE, 0, NULL, &todwSize, todwSize);
pBuffer = (BYTE *)malloc(todwSize);
strcpy((char*)pBuffer, toencrypt);
CryptEncrypt(hKey, 0, TRUE, 0, pBuffer, &todwSize, todwSize);
PBYTE pBreturn = pBuffer;
const char* message = (const char*)pBreturn;
printf("%s", message);
//--------------------------------------------------------------------
DWORD dwSize = (DWORD)strlen(message);
PBYTE depBuffer;
depBuffer = (BYTE *)malloc(1460);
strcpy((char*)depBuffer, message);
CryptDecrypt(hKey, 0, TRUE, 0, depBuffer, &dwSize);
CryptDestroyKey(hKey);
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
if(GetLastError() != 0)
{
printf("%d", GetLastError());
}
PBYTE depBreturn = depBuffer;
printf("%s", (const char*)depBreturn);
printf("\n%d", strlen(message));
return 0;
}
提前感谢您的帮助!
【问题讨论】:
-
对
CryptEncrypt的第一次调用将todwSize的值更改为加密数据的大小,但您随后将其作为明文的大小传递给第二次调用和缓冲区的大小。这是两个不同的值,你需要两个不同的变量。 -
strlen(message);和strcpy((char*)depBuffer, message);-message中的主要错误不是 0 终止字符串,而是可以包含 0 个字节的二进制数据。你已经拥有了它todwSize -
当您使用带有 NULL 名称而不是私钥/公钥的
CryptAcquireContext时 - 只需使用CRYPT_VERIFYCONTEXT并调用 `CryptAcquireContext一次。当然,您不会检查任何功能结果,也不会释放资源 -
是的,那是我的错误,谢谢大家!
标签: c++ windows encryption cryptography wincrypt