通过UDP发送byte []导致byte []值改变

时间:2014-01-28 08:28:33

标签: java io cryptography udp rc4-cipher

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

  1. 启动主持人。

  2. 启动客户端。

  3. 客户端使用RC4

  4. 发送加密文本
  5. 主机接收加密文本并使用RC4解密

  6. 我的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发送时,出现了问题。

1 个答案:

答案 0 :(得分:2)

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

话虽如此,我认为这条线是错的:

sendData = sentence.getBytes();

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

sentence = new String(realSentence);

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

注意:这段代码看起来很奇怪。为什么RC4密码会返回char数组?我会寻找代替管理字节数组的代码,只是通过网络发送原始值。