在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
相关产品推荐
相关产品推荐

