1

我正在尝试加密我通过 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;
}
4

0 回答 0