udp通信中使用rc4加解密时,客户端解密后出现大量乱码,根本原因是未正确截取接收到的有效数据长度,而是对整个1024字节数组(含填充空字节)进行了rc4解密。
在您提供的客户端代码中,关键问题出现在这一行:
byte[] decryptedMessage = decryptCipher.doFinal(receivePacket.getData());
receivePacket.getData() 返回的是整个预分配的缓冲区数组(new byte[1024]),而实际接收到的加密数据远小于1024字节(例如仅20字节)。RC4是一种流密码,其解密操作会逐字节处理输入数组——包括那些未被网络写入、默认值为 0x00 的“空字节”。这些多余的 0x00 字节经RC4解密后,会生成不可见或非法的Unicode字符(如控制符、替代字符等),最终在 new String(…, UTF_8) 中表现为杂乱无章的符号(如 `、♥、♦` 等)。
✅ 正确做法是:只对实际接收到的加密数据段进行解密,即使用 DatagramPacket.getLength() 获取有效载荷长度,并显式指定偏移量与长度: