我正在尝试加密我通过 Winsock 发送的缓冲区。除了绝对基础知识之外,我对加密一无所知,我使用了 Windows 的 WinCrypt 库,因为它似乎是我可以实现的最基本和最简单的库,但是,我似乎无法让我的代码工作。
第一次尝试加密后文本为空白(可能是因为 Crypt 函数失败),最后一个错误是加密后的 ERROR_MORE_DATA 和解密尝试后的 NTE_BAD_DATA。
我根本无法在网上获得有关这些错误的太多信息,它们对我来说也很新。
ERROR_MORE_DATA 的 MSDN 描述说“有更多数据可用”,并且在 CryptEncrypt 的 MSDN 页面上(这是抛出它的函数)它说我给它的缓冲区不足以容纳所有加密数据,所以我假设,与我的想法相反,加密以某种方式延长了字符串,但我需要在我的代码结构中给出一个设定的大小(至少在我目前的思考过程中),那么我能做些什么呢?
谢谢!
我写了以下代码供大家测试:
struct Packet
{
char Message[250];
};
HCRYPTKEY g_Key;
bool GenerateKey()
{
HCRYPTPROV prov = {};
if (CryptAcquireContextA(&prov, 0, 0, PROV_RSA_AES, 0))
{
if (CryptGenKey(prov, CALG_AES_128, CRYPT_EXPORTABLE, &g_Key))
{
return true;
}
}
return false;
}
Packet EncryptPacket(Packet Pack)
{
DWORD Size;
Packet NewPacket;
memcpy(&NewPacket, &Pack, sizeof(Packet));
if (CryptEncrypt(g_Key, 0, true, 0, reinterpret_cast<BYTE*>(&NewPacket.Message), &Size,
sizeof(NewPacket.Message)))
{
return NewPacket;
}
return Packet();
}
Packet EncryptPacket(Packet Pack)
{
DWORD Size;
Packet NewPacket;
memcpy(&NewPacket, &Pack, sizeof(Packet));
if (CryptDecrypt(g_Key, 0, true, 0, reinterpret_cast<BYTE*>(&NewPacket.Message), &Size))
{
return NewPacket;
}
return Packet();
}
int main()
{
GenerateKey();
Packet Test;
strcpy_s(Test.Message, "This is a test!");
printf("Unencrypted: %s\n", Test.Message);
printf("Last Error: %x\n", GetLastError());
Packet EncryptedTest = EncryptPacket(Test);
printf("Encrypted: %s\n", EncryptedTest.Message);
printf("Last Error: %x\n", GetLastError());
Packet DecryptedTest = DecryptPacket(EncryptedTest);
printf("Decrypted: %s\n", DecryptedTest.Message);
printf("Last Error: %x\n", GetLastError());
getchar();
return 0;
}