Java安全聊天乱码问题

Java安全聊天乱码问题,java,sockets,cryptography,Java,Sockets,Cryptography,因此,我用Java编写了一个套接字程序,在开始聊天之前,基本上必须建立会话密钥 建立会话密钥后,服务器和客户端就可以开始聊天了 当主机和客户端发送消息时,消息将首先被散列,然后在发送之前被加密。当接收方收到密文时,他们应该对其进行解密,并查看散列是否匹配 发送方加密和解密他们自己的消息没有任何问题 如何让接收者理解服务器发送的内容 对于接收方,所有消息都以字符串格式接收。然后我使用byte[]将它们转换成字节,以便对其进行解密(它在RC4中,我从其他地方获得它。SHA1函数也是如此) 首先,我尝

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

建立会话密钥后,服务器和客户端就可以开始聊天了

当主机和客户端发送消息时,消息将首先被散列,然后在发送之前被加密。当接收方收到密文时,他们应该对其进行解密,并查看散列是否匹配

发送方加密和解密他们自己的消息没有任何问题

如何让接收者理解服务器发送的内容

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

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

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

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

假设我想向接收者发送“你好,鲍勃”。字节和字符串格式的加密密文将[B@224aed64.

预期发送方和接收方都具有相同的解密文本:Hello Bob52F1F8DAB56A1C980236176ECE1FCB576905D6

但是只有发送方显示正确的字符串,接收方显示胡言乱语

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

密文:[B@224aed64 字符串形式的密文:[B@224aed64 解密密文:你好Bob52f1f8Dab56a1c98022c6176ece1fcb576905d6

预期接收器将显示:

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

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

解密信息:你好,Bob52f1f8dab56a1c980223c6176ece1fcb576905d6

但接收器实际上显示了:

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

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

破译信息:Åtā–bx&193; zÖ


建议?干杯!

[B@224aed64
不是密文。这正是在数组上调用
到字符串所得到的。您得到的类名(对于
字节[]
[B
),后跟十六进制的哈希代码。它与数组中的实际数据没有关系


所以你实际上没有发送任何密文。不要在数组上使用
字符串。

你有很多问题

  • 使用加密时不要使用字符串,也不建议使用套接字而使用字节[]
  • 您不需要额外的数据(共享密钥+消息)
  • 如果您想要额外的安全性,您可能需要添加双棘轮算法
  • 如果使用
    break
    use
    while(true)
  • As@immibis As指向您的数组。toString不是密文字符串,如果您希望密文作为字符串,请使用
    新字符串(密文)
  • 不要使用这种奇怪的变量名

@pc9845如果我说“flibbertigibbit不是打开我门的密码”,那么我说的是字符串版本还是字节版本的“flibbertigibbit”有关系吗?字符串不是二进制数据的容器。请使用字节数组。查看请将答案放在答案块中。稍后,您可以接受自己的答案。另请参阅
            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;
        }
    }