使用CryptoAPI可以加密Winsock通信

时间:2015-10-24 16:30:56

标签: delphi encryption aes cryptoapi

我从Microsoft MSDN遇到了CryptoAPI,以加密我的客户端和我的服务器之间的通信,以获得基本的网络应用程序。 (只是为了学习保护网络通信)。

我决定在CBC中使用AES 256位密码进行数据包加密,使用RSA 2048bit来发送/接收AES对称密钥。

我已经阅读了很多例子,甚至成功地使用这个lib编写了几个片段,例如:

  • 使用AES加密/解密Unicode字符串
  • 使用AES加密/解密流

这两个片段工作正常并且很容易编写。

现在我想要动态加密/解密任何静态字节数组(来自我的服务器或客户端),但由于某些可能真的很愚蠢的原因,我无法让它工作。

我甚至不确定使用CryptoAPI是否可以满足这些需求。

这是我的尝试因错误而失败:234(ERROR_MORE_DATA)

function AES(const data : Pointer; var dest : TBytesArray; bufferSize : DWORD; Key : String; doCrypt : Boolean) : Boolean;
var AES  : HCRYPTPROV;
    hKEY : HCRYPTKEY;
begin
    CryptAcquireContext(@AES, nil, nil, PROV_RSA_AES, 0);
    try
        hKey := AES_DeriveKeyFromPassword(AES, key);
        try
            SetLength(dest, bufferSize);
            Move(data^, dest[0], bufferSize);

            if NOT CryptEncrypt(hKey, 0, true, 0, @dest[0], @bufferSize, bufferSize) then showmessage(inttostr(getlasterror()));
        finally
            CryptDestroyKey(hKey);
        end;
    finally
        CryptReleaseContext(AES, 0);
    end;
end;

我确定我在某处做错了什么,但我不明白为什么。

当我将Final更改为false时,错误没有出现,但我不知道为什么我需要使用此标志(除了true),因为我只想按数据包加密数据包。

注意:

data参数可以包含静态字节数组(网络到达/发送缓冲区)

通常:缓冲区:字节

的数组[0..1023]

我将这个静态字节数组复制到一个动态的数组,这是一个要加密/解密的目标。

所以确切的问题是:

如何在不使用第三方组件/软件包的情况下加密/解密Winsock通信的即时数据?

0 个答案:

没有答案