我正在尝试使用UDP进行服务器客户端通信,它涉及使用RC4相互发送加密文本。它是这样的:
启动主持人。
启动客户端。
客户端使用RC4
主机接收加密文本并使用RC4解密
我的RC4取自在线资源,似乎正在运作。如果我在客户端进行加密和解密(用于测试目的),它可以工作。但是在我将加密文本发送到主机后出现问题。当我的主机解密消息时,输出不是预期的输出。
以下是我在客户端上的代码示例:
RC4 rc4 = new RC4(rc4Key);
String message = "Hello";
char[] result = rc4.encrypt(message.toCharArray());
System.out.println("encrypted string: " + new String(result)); //M®FW?
System.out.println("decrypted string: " + new String(rc4.decrypt(result))); //Hello
从上面,我假设我的RC4正在工作,因为我似乎能够正确加密和解密。所以现在我将加密的文本发送到我的主机
sentence = new String(result);
sendData = sentence.getBytes();
sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
在我的主机方面,我将收到加密文本
receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
realSentence = Arrays.copyOf(receivePacket.getData(), receivePacket.getLength());
sentence = new String(realSentence);
RC4 rc4 = new RC4(ad.toString());
char[] result = rc4.decrypt(sentence);
System.out.println("decrypted string: " + new String(result)); //H?ll?
这只发生了一半的时间,我看到的模式只有当我的加密文本包含?
作为特殊字符时才会出现。所以我猜测当我将char转换为字符串然后转换为字节并通过UDP发送时,出现了问题。
答案 0 :(得分:2)
为了将来参考,调试它的一个好方法是忘记密码的所有内容并编写一个测试,从一侧向另一侧发送一个已知的字节数组(包含一个特殊字符)。
话虽如此,我认为这条线是错的:
sendData = sentence.getBytes();
在获取字节时,您没有指定字符集。这意味着您使用的是平台默认值。在连接的另一端,您正在执行此操作:
sentence = new String(realSentence);
同样,将字节转换为字符串而不指定字符集。我的猜测是你的目的地有一个不同的默认字符集。
注意:这段代码看起来很奇怪。为什么RC4密码会返回char数组?我会寻找代替管理字节数组的代码,只是通过网络发送原始值。