1

我正在尝试使用 UDP 进行服务器客户端通信,它涉及使用 RC4 相互发送加密文本。它是这样的:

  1. 启动主机。

  2. 启动客户端。

  3. 客户端使用 RC4 发送加密文本

  4. 主机接收加密文本并使用 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 发送时,出现了问题。

4

1 回答 1

2

为了将来参考,调试它的一个好方法是忘记所有关于加密的内容并编写一个测试,将一个已知的字节数组(包含一个特殊字符)从一侧发送到另一侧。

话虽如此,我认为这条线有问题:

sendData = sentence.getBytes();

在这里,您在获取字节时没有指定字符集。这意味着您正在使用平台默认值。在连接的另一端,您正在执行以下操作:

sentence = new String(realSentence);

同样,将字节转换为字符串而不指定字符集。我的猜测是您的目的地有不同的默认字符集。

注意:这段代码一般看起来很奇怪。为什么 RC4 密码应该返回一个 char 数组?我会寻找管理字节数组并通过网络发送原始值的示例代码。

于 2014-01-28T09:03:02.287 回答