Я пытаюсь зашифровать буфер, который отправляю через Winsock. Я ничего не знаю о шифровании вообще, кроме абсолютных основ, и я пошел с Windows библиотекой WinCrypt, так как она кажется самой простой c и самой простой, которую я могу реализовать, однако, я не могу получить свою код для работы.
Текст остается пустым после первой попытки шифрования (возможно, из-за сбоя функций Crypt), а последней ошибкой является ERROR_MORE_DATA после шифрования и NTE_BAD_DATA после попытки расшифровки.
I Я не смог вообще получить много информации в Интернете ни об одной из этих ошибок, они также довольно новы для меня.
В описании MSDN для ERROR_MORE_DATA написано «Доступно больше данных» и на странице MSDN для CryptEncrypt (это функция, которая генерирует его), он говорит, что буфер, который я предоставляю, недостаточно велик для хранения всех зашифрованных данных, поэтому я предполагаю, что вопреки тому, что я думал, шифрование как-то удлиняет строку, но мне нужно было бы иметь установленный размер в структуре для моего кода (по крайней мере, с моим текущим что мне делать с этим?
Спасибо!
Я написал следующий код для проверки всех вас:
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;
}