Итак, я создал программу для сокетов, написанную на Java, где вам, в основном, нужно настроить установление ключа сеанса перед началом чата.
Когда настроено установление сеансового ключа, сервер и клиент могут начать чат.
Когда хост и клиент отправляют сообщения, сообщения сначала хешируются, а затем шифруются перед отправкой. Когда принимающая сторона получает зашифрованный текст, она должна расшифровать его и посмотреть, совпадает ли хэш или нет.
Отправляющая сторона без проблем шифрует и дешифрует свои собственные сообщения.
Как я могу заставить получателя понять, что отправляет сервер?
Для принимающей стороны все сообщения принимаются в виде строкового формата. Затем я использую 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;
}
}
Предположим, я хочу отправить "Привет, Боб" получателю. Зашифрованный зашифрованный текст в байтовом и строковом формате будет иметь вид [B@224aed64.
Ожидается, что отправитель и получатель будут иметь одинаковый расшифрованный текст: Hello Bob52f1f8dab56a1c980223c6176ece1fcb576905d6.
Но только отправитель показывает правильную строку, а получатель - бред!
Вот что высветил отправитель:
зашифрованный текст: [B @ 224aed64
Зашифрованный текст в строке: [B @ 224aed64
Расшифрованный зашифрованный текст: Hello Bob52f1f8dab56a1c980223c6176ece1fcb576905d6
Ожидается, что получатель покажет:
Зашифрованный текст сервера (строка): [B @ 224aed64
Зашифрованный текст сервера (байт): [B @ 224aed64
Расшифрованное сообщение: Hello Bob52f1f8dab56a1c980223c6176ece1fcb576905d6
НО получатель фактически отображал это:
Зашифрованный текст сервера (строка): [B @ 224aed64
Зашифрованный текст сервера (байт): [B @ 224aed64
Расшифрованное сообщение: Åtû – bx¬ & ÁzÖ
Предложения? Ура!