A
A
Alex2020-02-19 23:00:33
Java
Alex, 2020-02-19 23:00:33

The program for encrypting messages does not work. Why?

Hello dear members of the forum,

I decided to take up the study of JAP JAVA. I sat down and studied up to the modules (passed through arrays, data types, logical operators, loops, conditional operators, comparison operators). And once I heard about such a thing as XOR, after that I got the idea to write a small training project called Day Coder.

Day Coder is a console program for encrypting and decrypting messages.
How it works:
The program takes the user's key;
Next, he pulls out today's number from the PC;
Encrypts the message entered by the user, first with the user's key, then with today's date.
Thus, a message encrypted on the 11th can only be decrypted on the 11th of any month.

Since I am a beginner in Java, difficulties and problems naturally arose. Next, I will give the code and describe the errors in the comments. Thanks in advance for your help and your ideas to improve the program.

1438090013_1072571484.jpg

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class MainClass {

    private static String personalKey = "";
    private static int personalKeyInt = 0;
    private static String massage = "";
    private static Scanner input = new Scanner(System.in);
/*Вот эти вот пре образования с датой тут ниже из за того что метод .getDay не работал у меня корректно */
    private static Date date = new Date();           
    private static SimpleDateFormat NowaDay = new SimpleDateFormat("dd");     
    private static String dayKeySt = NowaDay.format(date);          
    private static int dayKey = Integer.parseInt(dayKeySt);

    public static void main(String[] args) {
        String txtCommand = "";
        int n = 0;
        System.out.println("Добро пожаловать в программу Day Criptor!\nЭта программа предназначена для шифрования и дешиврования сообщений.");
        while (n != 1) {
            System.out.println("Введите нужную вам команду:\nstart - начать работу\nhelp - справка\nexit - выход");
            txtCommand = input.next();
            if (txtCommand.equals("start")) {
                int command = 3;
                PersonalKeyGiver();
                while (command != 0) {
                    System.out.println("Введите команду: ");
                    System.out.println("1 - Зашифровать сообщение\n2 - Расшифровать сообщение\n0 - Выход");
                    command = input.nextInt();
                    switch (command) {
                        case 0:
                            break;

                        case 1:
                            Coder();break;

                        case 2:
                            UnCoder();break;
                    }
                }
            }
            if (txtCommand.equals("help")) {
                FaQ();
            }
            if (txtCommand.equals("exit")) n++;
        }
    }


    public static void FaQ () {

        System.out.println("Добро пожаловать в программу Day Criptor!\nЭта программа предназначена для шифрования и дешифрования сообщений.\nВ программе используется уникальный метод шифрования, позволяющий расшифровать сообщение\nтолько в день его шифровки");
        System.out.println("Например: Вы защифровали сообщение 22 мая, чтобы расшифровать его нужно дождаться 22 числа любого месяца,\nесли попытаетесь расшифровать его 23 или 24 числа у вас это не выйдет.");
        System.out.println();
        System.out.println("ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ ПРОГРАММЫ\nЗапустите программу, введите 'start' чтобы начать шифрование или дешифровку сообщения\nДалее вам предложат ввести 4-х значный ключ.");
        System.out.println("Если вы шифруете сообщение то придумайте надежный ключ(Пункт 1). \nЕсли дешифруете введите ключ которым сообщение было зашифровано(Пункт 2).\nПосле нам непосредственно предложат вариант шифровать или расшифровывать\n\nПункт 1:");
        System.out.println("ВНИМАНИЕ ДАЛЬНЕЙШАЯ ИНСТРУКЦИЯ ДЛЯ ТЕХ КТО ХОЧЕТ ЗАШИФРОВАТЬ СООБЩЕНИЕ!");
        System.out.println("После того как вы выбрали вариант с шифровкой вам предложат ввести ваше сообщение. Введите сообщение в одну строку в конце нажмите 'Enter'.\nНа выходе вы получите свой ключ, день использовавшийся для шифровки и само сообщение в зашифрованном виде");
        System.out.println();
        System.out.println("Пункт 2:\nВНИМАНИЕ ДАЛЬНЕЙШАЯ ИНСТРУКЦИЯ ДЛЯ ТЕХ КТО ХОЧЕТ ДЕШИФРОВАТЬ СООБЩЕНИЕ!");
        System.out.println("После того как вы выбрали вариант с дешифровкой вам предложат ввести ваше сообщение. Введите сообщение в одну строку в конце нажмите 'Enter'.\nНа выходе вы получите свой ключ, день использовавшийся для дешифровки и само сообщение в дешифрованном виде");
        System.out.println();
    }


    public static void PersonalKeyGiver () {

        for ( int i = 0;(i != 4); ) {
            System.out.print("Введите свой 4-х значный ключ(Запомните его это key1): ");
            personalKey = input.next();
            i = personalKey.length();

        }
/*эти преобразования тут из-за того что на моем ПК не отображались корректно символы Юникода после 906 символа. Если есть какие-то иные методы решения данной проблемы пожалуйста подскажите*/
        personalKeyInt = Integer.parseInt(personalKey);     
        while (personalKeyInt > 906) {          
            personalKeyInt = personalKeyInt - 906;     
        }      
    }
    public static void Coder () {
        System.out.println("Введите ваше сообщение: ");
/*Вот тут и вся проблема. nextLine просто перескакивает на след.команду как будто я нажал 'Enter'*/
        massage = input.nextLine();    
        int msgL = massage.length();     
        char[] newMassage = new char[msgL];
        for (int x = 0; x < msgL; x++) {
            newMassage[x] = (char)(massage.charAt(x) ^ personalKeyInt);
            newMassage[x] = (char)(newMassage[x] ^ dayKey);
        }
        System.out.print("Ваш ключ (key1) : ");
        System.out.println(personalKey);
        System.out.print("Ключевой день (key2) : ");
        System.out.println(dayKey);
        System.out.println("Ваше зашифрованное сообщение:");
        System.out.println(newMassage);
    }
    public static void UnCoder() {
        System.out.println("Введите сообщение для дешифровки: ");
        massage = input.nextLine();
        int msgLen = massage.length();
        char[] uncriptMassage = new char[msgLen];
        for (int x = 0; x < msgLen; x++) {
            uncriptMassage[x] = (char)(massage.charAt(x) ^ dayKey);
            uncriptMassage[x] = (char)(uncriptMassage[x] ^ personalKeyInt);
        }
        System.out.print("Ваш ключ (key1) : ");
        System.out.println(personalKeyInt);
        System.out.print("Ключевой день (key2) : ");
        System.out.println(dayKey);
        System.out.println("Ваше расшифрованное сообщение сообщение:");
        System.out.println(uncriptMassage);
    }

}

PS Please do not throw tomatoes

Answer the question

In order to leave comments, you need to log in

3 answer(s)
M
Mikhail Simonishvili, 2020-02-20
@A_member_soveta

If without going into details, then in fact, it reads the line from the first input, as far as I understand, the problem is that by pressing enter in the first input, in your case it is a number input, you automatically create an empty line, in In the case of next or nextInt, the scanner does not see the data that it can scan and offers to enter new ones, but for nextLine, it does not matter what you enter. In short, either create a new scanner in the Code method, or accept input.nextLine twice, you can think of something else with input.hasNext

M
mayton2019, 2020-02-20
@mayton2019

Catch the first tomato!
It makes no sense to do XOR operations on the char data type.
newMassage[x] = (char)(newMassage[x] ^ dayKey);
In cryptography, if you decide to play seriously, then you need to convert all plain text into a byte array
(this is where the concept of a code page appears) and then apply XOR to this byte array.
For printing on the screen, the byte array is converted to either binhex or base64.
For decryption - resp. you have to reverse the cycle. From binhex to byte array. Then from it XOR and then - the national code page.

X
xmoonlight, 2020-02-20
@xmoonlight

Thus, a message encrypted on the 11th can only be decrypted on the 11th of any month.
But the men don’t even know!))
Do the opposite : first, masking by the date of the month along with the key, and then encrypt the resulting set only with the key: protection will be much better!

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question