因此,我完成了一个用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Ö
建议?干杯!
答案 0 :(得分:1)
[B@224aed64
不是密文。这就是在数组上调用toString
所得到的。您将得到类名(对于byte[]
,它是[B
),后跟十六进制的哈希码。它与数组中的实际数据无关。
因此您实际上并没有发送任何密文。不要在数组上使用toString
。
答案 1 :(得分:1)
那里有很多问题。
break
,请使用while(true)
new String(ciphertext)