Java安全聊天乱码问题

时间:2019-04-04 00:52:02

标签: java sockets cryptography

因此,我完成了一个用Java编写的套接字程序,在开始聊天之前,您基本上必须设置会话密钥建立。

设置会话密钥建立后,服务器和客户端即可开始聊天。

当主机和客户端发送消息时,将首先对消息进行哈希处理,然后再进行加密,然后再发送。当接收方接收到密文时,他们应该解密该密文,并查看哈希是否匹配。

发送方可以对自己的消息进行加密和解密,而不会出现任何问题。

如何使接收方了解服务器正在发送的内容?

对于接收方,所有消息均以String格式接收。然后,我使用byte []将它们转换为字节,以便对其进行解密(它在RC4中,我从其他地方获得它。SHA1函数也是如此)。

首先,我尝试将其简单地转换为字节,然后尝试将其转换为UTF-8。

服务器端(聊天功能,问题的一部分):

            boolean cont=true;

    while(cont)
    {
        Scanner msgReader=new Scanner (System.in);

        System.out.print("Enter message to Client: ");
        String msg=msgReader.nextLine();

        String h=SHA1.encryptThisString(sharedKey+msg);
        byte [] c=RC4.encrypt(msg+h, sharedKey);
        String s2=RC4.decrypt(c, sharedKey);

                System.out.println("Ciphertext: "+c);
        System.out.println("Ciphertext in String: "+c.toString());
        System.out.println("Deciphered Ciphertext: "+RC4.decrypt(c, sharedKey));;

        out.println(c.toString());

        String msgC=in.readLine();
        System.out.println("Client: "+msgC);

        if(msgC.equals("exit"))
        {
            cont=false;
            break;
        }
    }

客户端(聊天功能,问题的一部分):

    while(cont)
    {
        Scanner msgReader=new Scanner (System.in);

        String cH=in.readLine();
        byte[] cHB=cH.getBytes("UTF-8");

        String msgH=RC4.decrypt(cHB, sharedKey);

        System.out.println("Server Ciphertext (String): "+cH);
        System.out.println("Server Ciphertext (Byte): "+cHB);
        System.out.println("Deciphered Message: "+msgH);

        System.out.print("Enter message to Server: ");
        String msg=msgReader.nextLine();
        out.println(msg);

        if(msg.equals("exit"))
        {
            System.out.print("Chat session ended");
            cont=false;
            break;
        }
    }

假设我要向接收者发送“ Hello Bob”。字节和字符串格式的加密密文将为[B @ 224aed64。

期望发送者和接收者具有相同的解密文本:Hello Bob52f1f8dab56a1c980223c6176ece1fcb576905d6。

但是只有发送者显示正确的字符串,而接收者显示乱码!

以下是发件人显示的内容:

密文:[B @ 224aed64 字符串中的密文:[B @ 224aed64 解密的密文:您好Bob52f1f8dab56a1c980223c6176ece1fcb576905d6

期望接收器显示:

服务器密文(字符串):[B @ 224aed64

服务器密文(字节):[B @ 224aed64

解密后的消息:您好Bob52f1f8dab56a1c980223c6176ece1fcb576905d6

但接收者实际上显示了此内容:

服务器密文(字符串):[B @ 224aed64

服务器密文(字节):[B @ 224aed64

解密后的消息:Åtû–bx¬&ÁzÖ

建议?干杯!

2 个答案:

答案 0 :(得分:1)

[B@224aed64不是密文。这就是在数组上调用toString所得到的。您将得到类名(对于byte[],它是[B),后跟十六进制的哈希码。它与数组中的实际数据无关。

因此您实际上并没有发送任何密文。不要在数组上使用toString

答案 1 :(得分:1)

那里有很多问题。

  • 在使用密码术时不要使用字符串,也不建议在套接字中使用byte []
  • RC4 is not recommended, use AES instead
  • 您不需要其他数据(共享密钥+消息)。
  • 如果您想要额外的安全性,则可以添加Double Ratchet算法
  • 如果您使用break,请使用while(true)
  • ,而while循环则不需要布尔值。
  • 由于@immibis指向您,所以array.toString不是密文字符串,如果您希望将密文作为字符串,请使用new String(ciphertext)
  • 不要使用这种奇怪的变量名