Выпуск Java Secure Chat Gibberish - PullRequest
       2

Выпуск Java Secure Chat Gibberish

0 голосов
/ 04 апреля 2019

Итак, я создал программу для сокетов, написанную на 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Ö

Предложения? Ура!

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

У вас там много проблем.

  • Не используйте строки при использовании криптографии, также не рекомендуется использовать сокеты вместо использования байта []
  • RC4 не рекомендуется, вместо этого используйте AES
  • Вам не нужны дополнительные данные (общий ключ + сообщение).
  • Если вам нужна дополнительная безопасность, вы можете добавить алгоритм Double Ratchet
  • Вам не нужно логическое значение для цикла while, если вы используете break, используйте while(true)
  • Как указано @immibis, array.toString не является строкой зашифрованного текста, если вы хотите использовать зашифрованный текст в виде строки new String(ciphertext)
  • Не используйте такие странные имена переменных
1 голос
/ 04 апреля 2019

[B@224aed64 не является зашифрованным текстом.Это именно то, что вы получаете от вызова toString для массива.Вы получаете имя класса (которое для byte[] равно [B), за которым следует шестнадцатеричный хеш-код.Он не имеет никакого отношения к фактическим данным в массиве.

Таким образом, вы фактически не отправляете ни один зашифрованный текст.Не используйте toString для массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...