0 / 0 / 0
Регистрация: 19.02.2020
Сообщений: 1
1

Не работает программа для шифрования сообщений

20.02.2020, 09:11. Показов 243. Ответов 3

Решил я взяться за изучение ЯП JAVA. Сел и доучился до модулей (прошел массивы, типы данных, логические операторы, циклы, условные операторы, операторы сравнения). И как то услышал о такой штуке как XOR, после этого в голову пришла идея написать небольшой тренировочный проект под названием Day Coder.

Day Coder - это консольная программа для шифрования и расшифровки сообщений. Принцип работы: Программа берет ключ пользователя; Далее вытаскивает с ПК сегодняшнее число; Шифрует введенное пользователем сообщение сначала ключём пользователя, потом сегодняшним числом. Таким образом сообщение зашифрованное 11 числа можно расшифровать только 11 числа любого месяца.

Т.к являюсь новичком в Java естественно возникли сложности и проблемы. Далее приведу код и в комментариях опишу ошибки.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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);
    }
 
}
P.S Просьба помидорами не кидать)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2020, 09:11
Ответы с готовыми решениями:

Неправильно работает программа шифрования-дешифрования
Program P_026_CRYPT; Var inF , outF :text; s :string; k :integer; const key = 2; ...

Программа шифрования слова периодически не работает
Используется шифр Чейза: - Таблица (ключ) Q W E R T Y U I O P A S D F G H J K L Z X C V B N M...

Как работает эта программа шифрования данных?
Привет. Я нащел программу но немогу разабраться как она работает. Пожалуйста помогите разобраться с...

Некорректно работает программа шифрования и дешифрования (ГОСТ 28147-89)
Прошу помочь с обнаружением и устранением ошибки(ошибок) в коде программы, реализующей шифрование и...

3
2164 / 1703 / 428
Регистрация: 17.02.2014
Сообщений: 8,387
20.02.2020, 09:21 2
A_chlen_soveta, что конкретно ты хочешь (читать твой код лень)?
0
Эксперт Java
3280 / 2733 / 831
Регистрация: 05.07.2013
Сообщений: 13,076
20.02.2020, 09:39 3
A_chlen_soveta, до этого используешь next, который не читает символ перевода строки, который и уходить в next line поищи по форуму - частая проблема
0
2 / 2 / 5
Регистрация: 27.11.2015
Сообщений: 23
20.02.2020, 13:56 4
Aviz__, спасибо за разъяснения.

Как вариант, заменить все next на nextLine с преобразованием к нужному типу.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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);
    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.nextLine(); // todo
            if (txtCommand.equals("start")) {
                int command = 3;
                PersonalKeyGiver();
                while (command != 0) {
                    System.out.println("Введите команду: ");
                    System.out.println("1 - Зашифровать сообщение\n2 - Расшифровать сообщение\n0 - Выход");
                    command = Integer.parseInt(input.nextLine()); // todo
                    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.nextLine(); // todo
            i = personalKey.length();
        }
        personalKeyInt = Integer.parseInt(personalKey);     
        while (personalKeyInt > 906) {          
            personalKeyInt = personalKeyInt - 906;     
        }      
    }
    public static void Coder () {
        System.out.println("Введите ваше сообщение: ");
        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);
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2020, 13:56

Почему не полностью работает программа шифрования? шифрует ок, а дешифрирует плохо, теряет последние 2 символа
вот так. Помогите с проблемой. #include &lt;vcl&gt; #include &lt;conio&gt; #include &lt;iostream&gt; #include...

Программа для шифрования
Я сис-админ, не уверен что правильно будет писать на Си, но это единственный язык, который еле еле...

Программа для шифрования
Я сис-админ, не сильно разбираюсь в дельфи, но посоветовали писать не нем Задача вроде проста до...

Вылетает программа для шифрования
мне нужно было написать не большую программу шифратор. я выбрал язык программирования Java и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.