You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中通过TCP Socket读取AES加密消息的问题

C# TCP Socket AES加密消息收发问题解决

问题根源

你发送加密消息时,直接把EncryptStringToBytes返回的byte[]传给STW.WriteLine(),这会自动调用数组的ToString()方法,实际发送的是字符串"System.byte[]",而非真正的加密字节数据,所以接收端拿到的是无效字符串,无法转成解密所需的字节数组。

解决方案

通过Base64编码在二进制数据和字符串之间做转换:

  • 发送时:将加密后的字节数组转为Base64字符串再发送
  • 接收时:将读取到的Base64字符串转回字节数组,再传入解密方法

修改后的发送代码

private void backgroundWorker2_DoWork_1(object sender, DoWorkEventArgs e)
{
    if (client.Connected)
    {
        // 加密得到字节数组,转成Base64字符串再发送
        byte[] encryptedBytes = EncryptStringToBytes(TextToSend, key);
        string encryptedBase64 = Convert.ToBase64String(encryptedBytes);
        STW.WriteLine(encryptedBase64);
        
        this.chat_box.Invoke(new MethodInvoker(delegate ()
        {
            chat_box.AppendText("Me : " + TextToSend + " \n");
        }));
    }
    else
    {
        MessageBox.Show("Failed to send a message");
    }
    backgroundWorker2.CancelAsync();
} 

修改后的接收代码

private void backgroundWorker1_DoWork_1(object sender, DoWorkEventArgs e)
{
    while (client.Connected)
    {
        try
        {
            string recieveBase64 = STR.ReadLine();
            if (!string.IsNullOrEmpty(recieveBase64))
            {
                // 将Base64字符串转回字节数组
                byte[] encryptedBytes = Convert.FromBase64String(recieveBase64);
                // 传入解密方法得到原始消息
                string decryptedMsg = DecryptStringFromBytes(encryptedBytes, key);
                
                this.chat_box.Invoke(new MethodInvoker(delegate ()
                {
                    chat_box.AppendText("You : " + decryptedMsg + "\n");
                }));
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }
}

核心转换逻辑

// 发送端:加密字节数组转Base64字符串
string encryptedBase64 = Convert.ToBase64String(encryptedBytes);

// 接收端:Base64字符串转回加密字节数组
byte[] encryptedBytes = Convert.FromBase64String(recieveBase64);

注意确保你的解密方法DecryptStringFromBytes(对应加密方法EncryptStringToBytes)能正确接收byte[]参数并返回解密后的字符串。

内容的提问来源于stack exchange,提问作者Ali Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:32:34