Шифрование пакета с использованием AES - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь зашифровать буфер, который отправляю через 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;
}
...