Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用CryptoAPI加密Winsock通信_Delphi_Encryption_Aes_Cryptoapi - Fatal编程技术网

Delphi 使用CryptoAPI加密Winsock通信

Delphi 使用CryptoAPI加密Winsock通信,delphi,encryption,aes,cryptoapi,Delphi,Encryption,Aes,Cryptoapi,我从Microsoft MSDN中找到了CryptoAPI,用于加密基本网络应用程序的客户端和服务器之间的通信。(只是为了了解如何保护网络通信) 我决定在CBC中使用AES 256bit密码进行数据包加密,使用RSA 2048bit发送/接收AES对称密钥 我已经阅读了许多示例,甚至成功地使用此库编写了一些代码片段,例如: 使用AES加密/解密Unicode字符串 使用AES加密/解密流 这两个代码段工作得很好,并且非常容易编写 现在我想动态加密/解密任何静态字节数组(来自我的服务器或客户端

我从Microsoft MSDN中找到了CryptoAPI,用于加密基本网络应用程序的客户端和服务器之间的通信。(只是为了了解如何保护网络通信)

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

我已经阅读了许多示例,甚至成功地使用此库编写了一些代码片段,例如:

  • 使用AES加密/解密Unicode字符串
  • 使用AES加密/解密流
这两个代码段工作得很好,并且非常容易编写

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

我甚至不确定使用CryptoAPI是否是满足这些需求的方法

这是我的尝试,失败的错误是:234(错误\u更多\u数据)

我肯定我在什么地方做错了什么,但我不明白为什么

当我将Final改为false时,错误不会出现,但我不知道为什么我需要使用这个标志(true除外),因为我只想逐个包加密数据包

注意:

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

通常:缓冲区:字节数组[0..1023]

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

因此,确切的问题是:


我如何在不使用第三方组件/包的情况下为Winsock通信实时加密/解密数据?仅使用CryptoAPI?

您只需要进行一些调试。看起来您放弃得太快了。不应移动(数据^,目标[0],缓冲区大小);是否移动(数据^,@dest[0],缓冲区大小)?
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;