From 726c8416bea120a2f1555fae7981269da5dcb66f Mon Sep 17 00:00:00 2001 From: orlov Date: Tue, 26 Aug 2025 22:02:03 +0300 Subject: [PATCH 01/13] Start --- src/main/java/com/javarush/orlov/CaesarCipher.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/javarush/orlov/CaesarCipher.java diff --git a/src/main/java/com/javarush/orlov/CaesarCipher.java b/src/main/java/com/javarush/orlov/CaesarCipher.java new file mode 100644 index 0000000..057b7d4 --- /dev/null +++ b/src/main/java/com/javarush/orlov/CaesarCipher.java @@ -0,0 +1,7 @@ +package com.javarush.orlov; + +public class CaesarCipher { + public static void main(String[] args) { + + } +} From e7e9ccbadd5a1251af2745f83a93162145f57839 Mon Sep 17 00:00:00 2001 From: orlov Date: Tue, 26 Aug 2025 22:17:35 +0300 Subject: [PATCH 02/13] Create class --- .../orlov/{CaesarCipher.java => CaesarCipherApp.java} | 2 +- src/main/java/com/javarush/orlov/Cipher.java | 5 +++++ src/main/java/com/javarush/orlov/FileService.java | 5 +++++ src/main/java/com/javarush/orlov/Validator.java | 5 +++++ 4 files changed, 16 insertions(+), 1 deletion(-) rename src/main/java/com/javarush/orlov/{CaesarCipher.java => CaesarCipherApp.java} (72%) create mode 100644 src/main/java/com/javarush/orlov/Cipher.java create mode 100644 src/main/java/com/javarush/orlov/FileService.java create mode 100644 src/main/java/com/javarush/orlov/Validator.java diff --git a/src/main/java/com/javarush/orlov/CaesarCipher.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java similarity index 72% rename from src/main/java/com/javarush/orlov/CaesarCipher.java rename to src/main/java/com/javarush/orlov/CaesarCipherApp.java index 057b7d4..a1464a7 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipher.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -1,6 +1,6 @@ package com.javarush.orlov; -public class CaesarCipher { +public class CaesarCipherApp { public static void main(String[] args) { } diff --git a/src/main/java/com/javarush/orlov/Cipher.java b/src/main/java/com/javarush/orlov/Cipher.java new file mode 100644 index 0000000..b52e4c7 --- /dev/null +++ b/src/main/java/com/javarush/orlov/Cipher.java @@ -0,0 +1,5 @@ +package com.javarush.orlov; + +public class Cipher { + // шифрование и дешифрование с помощью ключа +} diff --git a/src/main/java/com/javarush/orlov/FileService.java b/src/main/java/com/javarush/orlov/FileService.java new file mode 100644 index 0000000..ecefe30 --- /dev/null +++ b/src/main/java/com/javarush/orlov/FileService.java @@ -0,0 +1,5 @@ +package com.javarush.orlov; + +public class FileService { + // работа с файлами +} diff --git a/src/main/java/com/javarush/orlov/Validator.java b/src/main/java/com/javarush/orlov/Validator.java new file mode 100644 index 0000000..9c7ba48 --- /dev/null +++ b/src/main/java/com/javarush/orlov/Validator.java @@ -0,0 +1,5 @@ +package com.javarush.orlov; + +public class Validator { + //проверка входных данных +} From bc6307ac3bed6068a052a1531363c18bdce54ec9 Mon Sep 17 00:00:00 2001 From: orlov Date: Tue, 26 Aug 2025 23:31:07 +0300 Subject: [PATCH 03/13] Add fileServise method --- .../com/javarush/orlov/CaesarCipherApp.java | 6 +++++- src/main/java/com/javarush/orlov/Cipher.java | 14 +++++++++++++ .../java/com/javarush/orlov/FileService.java | 21 +++++++++++++++++++ .../java/com/javarush/orlov/Validator.java | 3 +++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index a1464a7..4194d5f 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -1,7 +1,11 @@ package com.javarush.orlov; +import java.io.IOException; + public class CaesarCipherApp { - public static void main(String[] args) { + public static void main(String[] args) throws IOException { + String text = new String(FileService.readFile("C:\\Users\\s_m_o\\IdeaProjects\\CryptoAnalyzerPantera\\text\\text.txt")); + FileService.createNewFile("C:\\Users\\s_m_o\\IdeaProjects\\CryptoAnalyzerPantera\\text\\"); } } diff --git a/src/main/java/com/javarush/orlov/Cipher.java b/src/main/java/com/javarush/orlov/Cipher.java index b52e4c7..094d085 100644 --- a/src/main/java/com/javarush/orlov/Cipher.java +++ b/src/main/java/com/javarush/orlov/Cipher.java @@ -2,4 +2,18 @@ public class Cipher { // шифрование и дешифрование с помощью ключа + private static final char[] ALPHABET = {'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', + 'и','к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', + 'ъ', 'ы', 'ь', 'э', 'я', '.', ',', '«', '»', '"', '\'', ':', '!', '?', ' '}; + + public String encrypt(String text, int key){ + + return null; + } + + public String decrypt(String text, int key){ + + return null; + } + } diff --git a/src/main/java/com/javarush/orlov/FileService.java b/src/main/java/com/javarush/orlov/FileService.java index ecefe30..8a1ecb2 100644 --- a/src/main/java/com/javarush/orlov/FileService.java +++ b/src/main/java/com/javarush/orlov/FileService.java @@ -1,5 +1,26 @@ package com.javarush.orlov; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.charset.StandardCharsets; public class FileService { // работа с файлами + public static String readFile(String filePath) throws IOException { + Path path = Paths.get(filePath); + byte[] bytes = Files.readAllBytes(path); + return new String(bytes, StandardCharsets.UTF_8); + + } + public static void createNewFile(String filePath) throws IOException { + + Path path = Path.of(filePath + "encrypted.txt"); // путь к файлу, где будет храниться зашифрованный текст + if (Files.exists(path)){ // проверка на существование файла + Files.delete(path); //если существует, то удалаем и создаём новый + Files.createFile(path); + } + else Files.createFile(path); + + } } diff --git a/src/main/java/com/javarush/orlov/Validator.java b/src/main/java/com/javarush/orlov/Validator.java index 9c7ba48..17e46d0 100644 --- a/src/main/java/com/javarush/orlov/Validator.java +++ b/src/main/java/com/javarush/orlov/Validator.java @@ -1,5 +1,8 @@ package com.javarush.orlov; + + public class Validator { //проверка входных данных + } From 949592e590b72ddae8e64f13ec8c21b0cc825e53 Mon Sep 17 00:00:00 2001 From: orlov Date: Wed, 27 Aug 2025 14:55:27 +0300 Subject: [PATCH 04/13] Encrypt bad ver. --- .../com/javarush/orlov/CaesarCipherApp.java | 9 +++-- src/main/java/com/javarush/orlov/Cipher.java | 19 ----------- src/main/java/com/javarush/orlov/Decrypt.java | 9 +++++ src/main/java/com/javarush/orlov/Encrypt.java | 34 +++++++++++++++++++ .../java/com/javarush/orlov/FileService.java | 11 ++++++ 5 files changed, 61 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/com/javarush/orlov/Cipher.java create mode 100644 src/main/java/com/javarush/orlov/Decrypt.java create mode 100644 src/main/java/com/javarush/orlov/Encrypt.java diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index 4194d5f..92f667f 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -3,9 +3,14 @@ import java.io.IOException; public class CaesarCipherApp { + + public static void main(String[] args) throws IOException { - String text = new String(FileService.readFile("C:\\Users\\s_m_o\\IdeaProjects\\CryptoAnalyzerPantera\\text\\text.txt")); - FileService.createNewFile("C:\\Users\\s_m_o\\IdeaProjects\\CryptoAnalyzerPantera\\text\\"); + String text = new String(FileService.readFile("text\\text.txt")); + FileService.createNewFile("text\\"); + Encrypt cipher = new Encrypt(); + //; + FileService.writeFile("text\\encrypted.txt",cipher.encrypt(text, 3)); } } diff --git a/src/main/java/com/javarush/orlov/Cipher.java b/src/main/java/com/javarush/orlov/Cipher.java deleted file mode 100644 index 094d085..0000000 --- a/src/main/java/com/javarush/orlov/Cipher.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.javarush.orlov; - -public class Cipher { - // шифрование и дешифрование с помощью ключа - private static final char[] ALPHABET = {'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', - 'и','к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', - 'ъ', 'ы', 'ь', 'э', 'я', '.', ',', '«', '»', '"', '\'', ':', '!', '?', ' '}; - - public String encrypt(String text, int key){ - - return null; - } - - public String decrypt(String text, int key){ - - return null; - } - -} diff --git a/src/main/java/com/javarush/orlov/Decrypt.java b/src/main/java/com/javarush/orlov/Decrypt.java new file mode 100644 index 0000000..78effb7 --- /dev/null +++ b/src/main/java/com/javarush/orlov/Decrypt.java @@ -0,0 +1,9 @@ +package com.javarush.orlov; + +public class Decrypt { + + public String decrypt(String text, int key){ + //пока не сделал + return null; + } +} diff --git a/src/main/java/com/javarush/orlov/Encrypt.java b/src/main/java/com/javarush/orlov/Encrypt.java new file mode 100644 index 0000000..37430ba --- /dev/null +++ b/src/main/java/com/javarush/orlov/Encrypt.java @@ -0,0 +1,34 @@ +package com.javarush.orlov; + +public class Encrypt { + // шифрование и дешифрование с помощью ключа + public static final char[] ALPHABET = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', + 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', + 'ъ', 'ы', 'ь', 'э', 'ю', 'я', '.', ',', '«', '»', '"', '\'', ':', '!', '?', ' ', 'А', 'Б', 'В', 'Г', 'Д', + 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н' , 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', + 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'}; + + + public String encrypt(String text, int key){ + + StringBuilder builder = new StringBuilder(); + + for (int i = 0; i < text.length(); i++) { + boolean found = false; + for (int j = 0; j < ALPHABET.length; j++) { + if (text.charAt(i) == ALPHABET[j]){ + builder.append(ALPHABET[(j + key) % ALPHABET.length]); + found = true; + break; + } + + } + if (!found) builder.append(text.charAt(i)); + } + String result = builder.toString(); + return result; + } + + + +} diff --git a/src/main/java/com/javarush/orlov/FileService.java b/src/main/java/com/javarush/orlov/FileService.java index 8a1ecb2..5b399e1 100644 --- a/src/main/java/com/javarush/orlov/FileService.java +++ b/src/main/java/com/javarush/orlov/FileService.java @@ -23,4 +23,15 @@ public static void createNewFile(String filePath) throws IOException { else Files.createFile(path); } + + public static void writeFile(String filePath, String str) { + Path path = Paths.get(filePath); + try { + Files.writeString(path, str); + }catch (IOException e){ + System.out.println("Ошибка записи файла: " + e.getMessage()); + } + + + } } From e5c379188d8813360620d5cc0d660561a0c44889 Mon Sep 17 00:00:00 2001 From: orlov Date: Wed, 27 Aug 2025 19:06:52 +0300 Subject: [PATCH 05/13] Encrypt good ver.0 --- .../com/javarush/orlov/CaesarCipherApp.java | 10 ++++- src/main/java/com/javarush/orlov/Encrypt.java | 45 ++++++++++++++----- .../java/com/javarush/orlov/FileService.java | 9 +++- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index 92f667f..f5aab3e 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -1,16 +1,22 @@ package com.javarush.orlov; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; public class CaesarCipherApp { public static void main(String[] args) throws IOException { - String text = new String(FileService.readFile("text\\text.txt")); + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt"))); + + FileService.createNewFile("text\\"); Encrypt cipher = new Encrypt(); - //; + FileService.writeFile("text\\encrypted.txt",cipher.encrypt(text, 3)); } } diff --git a/src/main/java/com/javarush/orlov/Encrypt.java b/src/main/java/com/javarush/orlov/Encrypt.java index 37430ba..a6785fb 100644 --- a/src/main/java/com/javarush/orlov/Encrypt.java +++ b/src/main/java/com/javarush/orlov/Encrypt.java @@ -1,5 +1,8 @@ package com.javarush.orlov; +import java.util.ArrayList; +import java.util.List; + public class Encrypt { // шифрование и дешифрование с помощью ключа public static final char[] ALPHABET = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', @@ -9,26 +12,44 @@ public class Encrypt { 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'}; - public String encrypt(String text, int key){ + + public ArrayList encrypt(ArrayList text, int key){ + + ArrayList result = new ArrayList<>(); + + for (int i = 0; i < text.size(); i++) { + result.add(checkAlphabet(text.get(i), key)); + } + + return result; + } + + private String checkAlphabet(String text, int key){ StringBuilder builder = new StringBuilder(); - for (int i = 0; i < text.length(); i++) { + for (int k = 0; k < text.length(); k++) { // перебор символов строки + char current = text.charAt(k); boolean found = false; - for (int j = 0; j < ALPHABET.length; j++) { - if (text.charAt(i) == ALPHABET[j]){ - builder.append(ALPHABET[(j + key) % ALPHABET.length]); - found = true; - break; - } + found = isFound(key, current, builder); + + if (!found) { // если символа нет в алфавите — оставляем как есть + builder.append(current); } - if (!found) builder.append(text.charAt(i)); } - String result = builder.toString(); - return result; - } + return builder.toString(); + } + private boolean isFound(int key, char current, StringBuilder builder) { + for (int j = 0; j < ALPHABET.length; j++) { // перебор алфавита + if (current == ALPHABET[j]) { + builder.append(ALPHABET[(j + key + ALPHABET.length) % ALPHABET.length]); + return true; + } + } + return false; + } } diff --git a/src/main/java/com/javarush/orlov/FileService.java b/src/main/java/com/javarush/orlov/FileService.java index 5b399e1..5fe238b 100644 --- a/src/main/java/com/javarush/orlov/FileService.java +++ b/src/main/java/com/javarush/orlov/FileService.java @@ -4,6 +4,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; public class FileService { // работа с файлами @@ -24,10 +25,14 @@ public static void createNewFile(String filePath) throws IOException { } - public static void writeFile(String filePath, String str) { + public static void writeFile(String filePath, ArrayList str) { Path path = Paths.get(filePath); try { - Files.writeString(path, str); + StringBuilder builder = new StringBuilder(); + for (String line : str){ + builder.append(line).append(System.lineSeparator()); + } + Files.writeString(path, builder.toString()); }catch (IOException e){ System.out.println("Ошибка записи файла: " + e.getMessage()); } From 8fc8b7f8b400215b01c575c27384babbc9b90fd5 Mon Sep 17 00:00:00 2001 From: orlov Date: Wed, 27 Aug 2025 19:19:30 +0300 Subject: [PATCH 06/13] Encrypt good ver.1 (not warning) --- src/main/java/com/javarush/orlov/CaesarCipherApp.java | 6 +++--- src/main/java/com/javarush/orlov/Encrypt.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index f5aab3e..9bb8d0e 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -4,7 +4,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.List; + public class CaesarCipherApp { @@ -15,8 +15,8 @@ public static void main(String[] args) throws IOException { FileService.createNewFile("text\\"); - Encrypt cipher = new Encrypt(); + Encrypt encrypt = new Encrypt(); - FileService.writeFile("text\\encrypted.txt",cipher.encrypt(text, 3)); + FileService.writeFile("text\\encrypted.txt",encrypt.encrypt(text, 3)); } } diff --git a/src/main/java/com/javarush/orlov/Encrypt.java b/src/main/java/com/javarush/orlov/Encrypt.java index a6785fb..dbb0530 100644 --- a/src/main/java/com/javarush/orlov/Encrypt.java +++ b/src/main/java/com/javarush/orlov/Encrypt.java @@ -1,7 +1,7 @@ package com.javarush.orlov; import java.util.ArrayList; -import java.util.List; + public class Encrypt { // шифрование и дешифрование с помощью ключа @@ -18,8 +18,8 @@ public ArrayList encrypt(ArrayList text, int key){ ArrayList result = new ArrayList<>(); - for (int i = 0; i < text.size(); i++) { - result.add(checkAlphabet(text.get(i), key)); + for (String s : text) { + result.add(checkAlphabet(s, key)); } return result; @@ -30,7 +30,7 @@ private String checkAlphabet(String text, int key){ for (int k = 0; k < text.length(); k++) { // перебор символов строки char current = text.charAt(k); - boolean found = false; + boolean found; found = isFound(key, current, builder); From c3bcf3cdd02468371b98880e6d1ed7853a2dc110 Mon Sep 17 00:00:00 2001 From: orlov Date: Wed, 27 Aug 2025 21:20:00 +0300 Subject: [PATCH 07/13] Interface bad ver. 0 --- .../com/javarush/orlov/CaesarCipherApp.java | 78 ++++++++++++++++++- src/main/java/com/javarush/orlov/Decrypt.java | 10 ++- src/main/java/com/javarush/orlov/Encrypt.java | 2 +- .../java/com/javarush/orlov/FileService.java | 2 +- 4 files changed, 82 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index 9bb8d0e..b0b592a 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -4,6 +4,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.InputMismatchException; +import java.util.Scanner; public class CaesarCipherApp { @@ -11,12 +13,80 @@ public class CaesarCipherApp { public static void main(String[] args) throws IOException { - ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt"))); + Scanner scanner = new Scanner(System.in); + System.out.println("Привет! Это программа для работы с шифром Цезаря \n"); + while (true) { + System.out.println("********************************************************** \n " + + " Выберите: \n " + + "1. Зашифровать файл \n " + + "2. Расшифровать файл \n " + + "3. Взлом (Brute Force) \n " + + "4. Взлом (Статистический анализ) \n " + + "0. Выход "); + short num; + int key; - FileService.createNewFile("text\\"); - Encrypt encrypt = new Encrypt(); + while (true) { + try { - FileService.writeFile("text\\encrypted.txt",encrypt.encrypt(text, 3)); + num = scanner.nextShort(); + if (num >= 0 && num <= 4) break; + else { + System.out.println("Некорректный ввод"); + + System.out.println(" Выберите: \n " + + "1. Зашифровать файл \n " + + "2. Расшифровать файл \n " + + "3. Взлом (Brute Force) \n " + + "4. Взлом (Статистический анализ) \n " + + "0. Выход "); + } + } catch (InputMismatchException e) { + System.out.println("Нужно ввести цифру от 1 до 4!!"); + scanner.next(); + System.out.println(" Выберите: \n " + + "1. Зашифровать файл \n " + + "2. Расшифровать файл \n " + + "3. Взлом (Brute Force) \n " + + "4. Взлом (Статистический анализ) \n " + + "0. Выход"); + + } + } + + if (num == 0){ + System.out.println("Выход из программы. Пока!"); + break; + } + else if (num == 1) { + System.out.println("Введите ключ"); + key = scanner.nextInt(); + + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt"))); + + + FileService.createNewFile("text\\encrypted.txt"); + Encrypt encrypt = new Encrypt(); + ArrayList result = new ArrayList<>(encrypt.encrypt(text, key)); + FileService.writeFile("text\\encrypted.txt", result); + System.out.println("Готово!"); + + } else if (num == 2) { + System.out.println("Введите ключ"); + key = scanner.nextInt(); + + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); + FileService.createNewFile("text\\decrypt.txt"); + + Decrypt decrypt = new Decrypt(); + + FileService.writeFile("text\\decrypt.txt", decrypt.decrypt(text, key)); + System.out.println("Готово! "); + + } + + + } } } diff --git a/src/main/java/com/javarush/orlov/Decrypt.java b/src/main/java/com/javarush/orlov/Decrypt.java index 78effb7..8b4da6b 100644 --- a/src/main/java/com/javarush/orlov/Decrypt.java +++ b/src/main/java/com/javarush/orlov/Decrypt.java @@ -1,9 +1,11 @@ package com.javarush.orlov; -public class Decrypt { +import java.util.ArrayList; - public String decrypt(String text, int key){ - //пока не сделал - return null; +public class Decrypt extends Encrypt{ + + public ArrayList decrypt(ArrayList text, int key){ + + return super.encrypt(text, -key); } } diff --git a/src/main/java/com/javarush/orlov/Encrypt.java b/src/main/java/com/javarush/orlov/Encrypt.java index dbb0530..1ee363b 100644 --- a/src/main/java/com/javarush/orlov/Encrypt.java +++ b/src/main/java/com/javarush/orlov/Encrypt.java @@ -45,7 +45,7 @@ private String checkAlphabet(String text, int key){ private boolean isFound(int key, char current, StringBuilder builder) { for (int j = 0; j < ALPHABET.length; j++) { // перебор алфавита if (current == ALPHABET[j]) { - builder.append(ALPHABET[(j + key + ALPHABET.length) % ALPHABET.length]); + builder.append(ALPHABET[(j + key%ALPHABET.length + ALPHABET.length) % ALPHABET.length]); return true; } } diff --git a/src/main/java/com/javarush/orlov/FileService.java b/src/main/java/com/javarush/orlov/FileService.java index 5fe238b..09048cd 100644 --- a/src/main/java/com/javarush/orlov/FileService.java +++ b/src/main/java/com/javarush/orlov/FileService.java @@ -16,7 +16,7 @@ public static String readFile(String filePath) throws IOException { } public static void createNewFile(String filePath) throws IOException { - Path path = Path.of(filePath + "encrypted.txt"); // путь к файлу, где будет храниться зашифрованный текст + Path path = Path.of(filePath); // путь к файлу, где будет храниться зашифрованный текст if (Files.exists(path)){ // проверка на существование файла Files.delete(path); //если существует, то удалаем и создаём новый Files.createFile(path); From ccd2e3f21a73ba00bb29623d7e13d97ce9581f5e Mon Sep 17 00:00:00 2001 From: orlov Date: Wed, 27 Aug 2025 23:08:58 +0300 Subject: [PATCH 08/13] Interface good ver. 1 --- .../com/javarush/orlov/CaesarCipherApp.java | 65 +++++-------------- .../java/com/javarush/orlov/Validator.java | 59 +++++++++++++++++ 2 files changed, 74 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index b0b592a..05ceb28 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -4,8 +4,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.InputMismatchException; -import java.util.Scanner; + public class CaesarCipherApp { @@ -13,58 +12,23 @@ public class CaesarCipherApp { public static void main(String[] args) throws IOException { - Scanner scanner = new Scanner(System.in); - System.out.println("Привет! Это программа для работы с шифром Цезаря \n"); + + + while (true) { - System.out.println("********************************************************** \n " + - " Выберите: \n " + - "1. Зашифровать файл \n " + - "2. Расшифровать файл \n " + - "3. Взлом (Brute Force) \n " + - "4. Взлом (Статистический анализ) \n " + - "0. Выход "); - - short num; + int num = Validator.begin(); int key; - while (true) { - try { - - num = scanner.nextShort(); - if (num >= 0 && num <= 4) break; - else { - System.out.println("Некорректный ввод"); - - System.out.println(" Выберите: \n " + - "1. Зашифровать файл \n " + - "2. Расшифровать файл \n " + - "3. Взлом (Brute Force) \n " + - "4. Взлом (Статистический анализ) \n " + - "0. Выход "); - } - } catch (InputMismatchException e) { - System.out.println("Нужно ввести цифру от 1 до 4!!"); - scanner.next(); - System.out.println(" Выберите: \n " + - "1. Зашифровать файл \n " + - "2. Расшифровать файл \n " + - "3. Взлом (Brute Force) \n " + - "4. Взлом (Статистический анализ) \n " + - "0. Выход"); - - } - } - - if (num == 0){ + if (num == 0) { System.out.println("Выход из программы. Пока!"); break; - } - else if (num == 1) { - System.out.println("Введите ключ"); - key = scanner.nextInt(); - ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt"))); + } else if (num == 1) { + + key = Validator.scanKey(); + + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt"))); FileService.createNewFile("text\\encrypted.txt"); Encrypt encrypt = new Encrypt(); @@ -73,8 +37,8 @@ else if (num == 1) { System.out.println("Готово!"); } else if (num == 2) { - System.out.println("Введите ключ"); - key = scanner.nextInt(); + + key = Validator.scanKey(); ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); FileService.createNewFile("text\\decrypt.txt"); @@ -86,7 +50,8 @@ else if (num == 1) { } + } } } -} + diff --git a/src/main/java/com/javarush/orlov/Validator.java b/src/main/java/com/javarush/orlov/Validator.java index 17e46d0..fe00020 100644 --- a/src/main/java/com/javarush/orlov/Validator.java +++ b/src/main/java/com/javarush/orlov/Validator.java @@ -1,8 +1,67 @@ package com.javarush.orlov; +import java.util.InputMismatchException; +import java.util.Scanner; public class Validator { //проверка входных данных + public static int begin (){ + Scanner scanner = new Scanner(System.in); + System.out.println("Привет! Это программа для работы с шифром Цезаря \n"); + while (true) { + System.out.println("********************************************************** \n " + + " Выберите: \n " + + "1. Зашифровать файл \n " + + "2. Расшифровать файл \n " + + "3. Взлом (Brute Force) \n " + + "4. Взлом (Статистический анализ) \n " + + "0. Выход "); + short num; + + + while (true) { + try { + + num = scanner.nextShort(); + if (num >= 0 && num <= 4) return num; + else { + System.out.println("Некорректный ввод"); + + System.out.println(" Выберите: \n " + + "1. Зашифровать файл \n " + + "2. Расшифровать файл \n " + + "3. Взлом (Brute Force) \n " + + "4. Взлом (Статистический анализ) \n " + + "0. Выход "); + } + } catch (InputMismatchException e) { + System.out.println("Нужно ввести цифру от 1 до 4!!"); + scanner.next(); + System.out.println(" Выберите: \n " + + "1. Зашифровать файл \n " + + "2. Расшифровать файл \n " + + "3. Взлом (Brute Force) \n " + + "4. Взлом (Статистический анализ) \n " + + "0. Выход"); + + } + } + } + +} + + public static int scanKey (){ + Scanner scanner = new Scanner(System.in); + while (true) { + try { + System.out.println("Введите ключ"); + return scanner.nextInt(); + } catch (InputMismatchException e) { + System.out.println("Нужно ввести цифру!!"); + scanner.next(); + } + } + } } From 1ed623d9cb2bf6321bcbe8aa09fd1c923600fe2c Mon Sep 17 00:00:00 2001 From: orlov Date: Wed, 27 Aug 2025 23:22:29 +0300 Subject: [PATCH 09/13] Interface good ver. 2 --- .../com/javarush/orlov/CaesarCipherApp.java | 60 ++++++++++--------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index 05ceb28..dee22fa 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -6,52 +6,54 @@ import java.util.ArrayList; - public class CaesarCipherApp { - public static void main(String[] args) throws IOException { - - - while (true) { int num = Validator.begin(); - int key; - - if (num == 0) { - System.out.println("Выход из программы. Пока!"); - break; - - } else if (num == 1) { - - key = Validator.scanKey(); + switch (num){ + case 0: + System.out.println("Выход из программы. Пока!"); + return; - ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt"))); + case 1: + encryptFile(); + System.out.println("Готово!"); + break; - FileService.createNewFile("text\\encrypted.txt"); - Encrypt encrypt = new Encrypt(); - ArrayList result = new ArrayList<>(encrypt.encrypt(text, key)); - FileService.writeFile("text\\encrypted.txt", result); - System.out.println("Готово!"); + case 2: + decryptFile(); + System.out.println("Готово! "); + break; - } else if (num == 2) { + default: + System.out.println("Некорректный выбор, попробуйте снова."); + } + } + } - key = Validator.scanKey(); + private static void encryptFile () throws IOException { + int key = Validator.scanKey(); - ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); - FileService.createNewFile("text\\decrypt.txt"); + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt"))); - Decrypt decrypt = new Decrypt(); + FileService.createNewFile("text\\encrypted.txt"); + Encrypt encrypt = new Encrypt(); + ArrayList result = new ArrayList<>(encrypt.encrypt(text, key)); + FileService.writeFile("text\\encrypted.txt", result); + } - FileService.writeFile("text\\decrypt.txt", decrypt.decrypt(text, key)); - System.out.println("Готово! "); + private static void decryptFile () throws IOException { + int key = Validator.scanKey(); - } + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); + FileService.createNewFile("text\\decrypt.txt"); - } + Decrypt decrypt = new Decrypt(); + FileService.writeFile("text\\decrypt.txt", decrypt.decrypt(text, key)); } } From 9a7980c78c0e210f9afd0966fd3fdb553cbda794 Mon Sep 17 00:00:00 2001 From: orlov Date: Thu, 28 Aug 2025 12:52:56 +0300 Subject: [PATCH 10/13] BruteForce working --- .../java/com/javarush/orlov/BruteForce.java | 49 +++++++++++++++++++ .../com/javarush/orlov/CaesarCipherApp.java | 21 ++++++-- .../java/com/javarush/orlov/Validator.java | 34 +++++++------ 3 files changed, 84 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/javarush/orlov/BruteForce.java diff --git a/src/main/java/com/javarush/orlov/BruteForce.java b/src/main/java/com/javarush/orlov/BruteForce.java new file mode 100644 index 0000000..467f6e3 --- /dev/null +++ b/src/main/java/com/javarush/orlov/BruteForce.java @@ -0,0 +1,49 @@ +package com.javarush.orlov; + +import java.util.ArrayList; + +public class BruteForce extends Encrypt{ + private static final String[] DICTIONARY= {"и", "в", "на", "что", "как", "это", "он", "она", "они"}; + + public ArrayList bruteForce (ArrayList text){ + ArrayList result; + int key = 0; + int count = 0; + + for (int i = 0; i < ALPHABET.length; i++) { + result = super.encrypt(text, i); + int temp = extracted(result); + if (temp > count){ + key = i; + count = temp; + } + } + return super.encrypt(text, key); + } + + private static int extracted(ArrayList result) { + int count = 0; + for (int j = 0; j < result.size(); j++) { + count += checkWord(result.get(j)); + } + return count; + } + + + private static int checkWord(String str){ + int count = 0; + String[] word = str.split(" "); + + for (int i = 0; i < word.length; i++) { + word[i] = word[i].replaceAll("[^а-яА-Я]",""); + for (int j = 0; j < DICTIONARY.length; j++) { + if (word[i].equalsIgnoreCase(DICTIONARY[j])){ + count++; + } + } + + } + + return count; + } +} diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index dee22fa..e7f51b7 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -1,5 +1,4 @@ package com.javarush.orlov; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -24,9 +23,14 @@ public static void main(String[] args) throws IOException { break; case 2: - decryptFile(); - System.out.println("Готово! "); - break; + decryptFile(); + System.out.println("Готово! "); + break; + + case 3: + bruteForceFile(); + System.out.println("Готово! "); + break; default: System.out.println("Некорректный выбор, попробуйте снова."); @@ -55,5 +59,14 @@ private static void decryptFile () throws IOException { FileService.writeFile("text\\decrypt.txt", decrypt.decrypt(text, key)); } + + private static void bruteForceFile() throws IOException { + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); + FileService.createNewFile("text\\bruteForce.txt"); + + BruteForce bruteForce = new BruteForce(); + + FileService.writeFile("text\\bruteForce.txt", bruteForce.bruteForce(text)); + } } diff --git a/src/main/java/com/javarush/orlov/Validator.java b/src/main/java/com/javarush/orlov/Validator.java index fe00020..83795a5 100644 --- a/src/main/java/com/javarush/orlov/Validator.java +++ b/src/main/java/com/javarush/orlov/Validator.java @@ -6,16 +6,18 @@ public class Validator { //проверка входных данных + private static final String asterisk = "*".repeat(60); + public static int begin (){ Scanner scanner = new Scanner(System.in); System.out.println("Привет! Это программа для работы с шифром Цезаря \n"); while (true) { - System.out.println("********************************************************** \n " + - " Выберите: \n " + - "1. Зашифровать файл \n " + - "2. Расшифровать файл \n " + - "3. Взлом (Brute Force) \n " + - "4. Взлом (Статистический анализ) \n " + + System.out.println( asterisk + + " Выберите: \n" + + "1. Зашифровать файл \n" + + "2. Расшифровать файл \n" + + "3. Взлом (Brute Force) \n" + + "4. Взлом (Статистический анализ) \n" + "0. Выход "); short num; @@ -29,21 +31,21 @@ public static int begin (){ else { System.out.println("Некорректный ввод"); - System.out.println(" Выберите: \n " + - "1. Зашифровать файл \n " + - "2. Расшифровать файл \n " + - "3. Взлом (Brute Force) \n " + - "4. Взлом (Статистический анализ) \n " + + System.out.println(" Выберите:\n" + + "1. Зашифровать файл \n" + + "2. Расшифровать файл \n" + + "3. Взлом (Brute Force) \n" + + "4. Взлом (Статистический анализ) \n" + "0. Выход "); } } catch (InputMismatchException e) { System.out.println("Нужно ввести цифру от 1 до 4!!"); scanner.next(); - System.out.println(" Выберите: \n " + - "1. Зашифровать файл \n " + - "2. Расшифровать файл \n " + - "3. Взлом (Brute Force) \n " + - "4. Взлом (Статистический анализ) \n " + + System.out.println(" Выберите: \n" + + "1. Зашифровать файл \n" + + "2. Расшифровать файл \n" + + "3. Взлом (Brute Force) \n" + + "4. Взлом (Статистический анализ) \n" + "0. Выход"); } From bb6813e7ede04c54a5060722d58d08ee20abcbf8 Mon Sep 17 00:00:00 2001 From: orlov Date: Mon, 1 Sep 2025 20:56:26 +0300 Subject: [PATCH 11/13] StatisticalAnalysis working bad ver --- .../com/javarush/orlov/CaesarCipherApp.java | 14 ++++ .../java/com/javarush/orlov/FileService.java | 8 +-- .../javarush/orlov/StatisticalAnalysis.java | 66 +++++++++++++++++++ 3 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/javarush/orlov/StatisticalAnalysis.java diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index e7f51b7..c2b7b75 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -32,6 +32,11 @@ public static void main(String[] args) throws IOException { System.out.println("Готово! "); break; + case 4: + statisticalFile(); + System.out.println("Готово! "); + break; + default: System.out.println("Некорректный выбор, попробуйте снова."); } @@ -68,5 +73,14 @@ private static void bruteForceFile() throws IOException { FileService.writeFile("text\\bruteForce.txt", bruteForce.bruteForce(text)); } + + private static void statisticalFile() throws IOException { + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); + FileService.createNewFile("text\\statisticalAnalysis.txt"); + + StatisticalAnalysis statisticalAnalysis = new StatisticalAnalysis(); + + FileService.writeFile("text\\statisticalAnalysis.txt", statisticalAnalysis.statisticalAnalysis(text)); + } } diff --git a/src/main/java/com/javarush/orlov/FileService.java b/src/main/java/com/javarush/orlov/FileService.java index 09048cd..c32dc3b 100644 --- a/src/main/java/com/javarush/orlov/FileService.java +++ b/src/main/java/com/javarush/orlov/FileService.java @@ -32,11 +32,11 @@ public static void writeFile(String filePath, ArrayList str) { for (String line : str){ builder.append(line).append(System.lineSeparator()); } - Files.writeString(path, builder.toString()); - }catch (IOException e){ + // Запись с явным указанием кодировки UTF-8 + Files.writeString(path, builder.toString(), StandardCharsets.UTF_8); + } catch (IOException e){ System.out.println("Ошибка записи файла: " + e.getMessage()); } - - } + } diff --git a/src/main/java/com/javarush/orlov/StatisticalAnalysis.java b/src/main/java/com/javarush/orlov/StatisticalAnalysis.java new file mode 100644 index 0000000..d5990b5 --- /dev/null +++ b/src/main/java/com/javarush/orlov/StatisticalAnalysis.java @@ -0,0 +1,66 @@ +package com.javarush.orlov; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class StatisticalAnalysis { + + public ArrayList statisticalAnalysis(ArrayList text){ + ArrayList result = new ArrayList<>(); + char top = ' '; + + for (int i = 0; i < text.size(); i++) { + top = word(text.get(i)); + } + + int key = differenceWithSpace(top); + Decrypt decrypt = new Decrypt(); + result= decrypt.decrypt(text, key); + + + return result; + } + + private char word (String line){ + HashMap count = new HashMap<>(); + + for (int j = 0; j < line.length(); j++) { + char c = line.charAt(j); + count.put(c, count.getOrDefault(c, 0) + 1); + } + + char mostFrequent = ' '; + int maxCount = 0; + + for (Map.Entry entry : count.entrySet()) { + if (entry.getValue() > maxCount) { + maxCount = entry.getValue(); + mostFrequent = entry.getKey(); + } + } + + return mostFrequent; + } + + public static int differenceWithSpace(char mostFrequent) { + int indexMostFrequent = -1; + int indexSpace = -1; + + for (int i = 0; i < Encrypt.ALPHABET.length; i++) { + if (Encrypt.ALPHABET[i] == mostFrequent) { + indexMostFrequent = i; + } + if (Encrypt.ALPHABET[i] == ' ') { + indexSpace = i; + } + } + + if (indexMostFrequent == -1 || indexSpace == -1) { + throw new IllegalArgumentException("Символ не найден в алфавите"); + } + + return indexMostFrequent - indexSpace; // разница позиций + } + +} \ No newline at end of file From 85c28d1d7c0a9cce5aaa4d190bfbdf6efbdce2c9 Mon Sep 17 00:00:00 2001 From: orlov Date: Mon, 1 Sep 2025 21:11:29 +0300 Subject: [PATCH 12/13] comments --- .../java/com/javarush/orlov/BruteForce.java | 41 +++++--- .../com/javarush/orlov/CaesarCipherApp.java | 95 +++++++++++-------- src/main/java/com/javarush/orlov/Decrypt.java | 11 ++- src/main/java/com/javarush/orlov/Encrypt.java | 35 ++++--- .../java/com/javarush/orlov/FileService.java | 35 ++++--- .../javarush/orlov/StatisticalAnalysis.java | 35 +++++-- .../java/com/javarush/orlov/Validator.java | 71 +++++++------- 7 files changed, 199 insertions(+), 124 deletions(-) diff --git a/src/main/java/com/javarush/orlov/BruteForce.java b/src/main/java/com/javarush/orlov/BruteForce.java index 467f6e3..246fbf5 100644 --- a/src/main/java/com/javarush/orlov/BruteForce.java +++ b/src/main/java/com/javarush/orlov/BruteForce.java @@ -2,46 +2,61 @@ import java.util.ArrayList; -public class BruteForce extends Encrypt{ - private static final String[] DICTIONARY= {"и", "в", "на", "что", "как", "это", "он", "она", "они"}; +public class BruteForce extends Encrypt { - public ArrayList bruteForce (ArrayList text){ + // Мини-словарь частых слов для проверки корректности расшифровки + private static final String[] DICTIONARY = {"и", "в", "на", "что", "как", "это", "он", "она", "они"}; + + // Метод перебирает все возможные ключи шифра Цезаря и выбирает лучший + // Лучший ключ определяется по количеству слов из словаря, найденных в тексте + public ArrayList bruteForce(ArrayList text){ ArrayList result; - int key = 0; - int count = 0; + int key = 0; // ключ с наибольшим количеством совпадений + int count = 0; // максимальное количество совпадений слов из словаря + // Перебираем все возможные ключи (все позиции алфавита) for (int i = 0; i < ALPHABET.length; i++) { - result = super.encrypt(text, i); - int temp = extracted(result); + result = super.encrypt(text, i); // "расшифровываем" текст с текущим ключом + int temp = extracted(result); // подсчитываем совпадения слов из словаря if (temp > count){ - key = i; + key = i; // если найдено больше совпадений, сохраняем ключ count = temp; } } + + // Возвращаем текст, расшифрованный с лучшим ключом return super.encrypt(text, key); } + // Метод подсчитывает количество слов из словаря в списке строк private static int extracted(ArrayList result) { int count = 0; + + // Перебираем все строки текста for (int j = 0; j < result.size(); j++) { - count += checkWord(result.get(j)); + count += checkWord(result.get(j)); // считаем совпадения слов из словаря в каждой строке } + return count; } - + // Метод проверяет строку на наличие слов из словаря private static int checkWord(String str){ int count = 0; + + // Разбиваем строку на слова по пробелам String[] word = str.split(" "); for (int i = 0; i < word.length; i++) { - word[i] = word[i].replaceAll("[^а-яА-Я]",""); + // Убираем все символы кроме букв + word[i] = word[i].replaceAll("[^а-яА-Я]", ""); + + // Сравниваем слово с каждым словом из словаря (игнорируя регистр) for (int j = 0; j < DICTIONARY.length; j++) { if (word[i].equalsIgnoreCase(DICTIONARY[j])){ - count++; + count++; // если совпадение найдено, увеличиваем счетчик } } - } return count; diff --git a/src/main/java/com/javarush/orlov/CaesarCipherApp.java b/src/main/java/com/javarush/orlov/CaesarCipherApp.java index c2b7b75..7db02f9 100644 --- a/src/main/java/com/javarush/orlov/CaesarCipherApp.java +++ b/src/main/java/com/javarush/orlov/CaesarCipherApp.java @@ -1,86 +1,105 @@ package com.javarush.orlov; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; - public class CaesarCipherApp { public static void main(String[] args) throws IOException { + // Главный цикл программы, пока пользователь не выберет выход while (true) { - int num = Validator.begin(); + int num = Validator.begin(); // Получаем выбор пользователя - switch (num){ - case 0: + switch (num) { + case 0: System.out.println("Выход из программы. Пока!"); return; - case 1: - encryptFile(); + case 1: + encryptFile(); // Шифруем файл System.out.println("Готово!"); break; - case 2: - decryptFile(); - System.out.println("Готово! "); + case 2: + decryptFile(); // Расшифровываем файл по ключу + System.out.println("Готово!"); break; case 3: - bruteForceFile(); - System.out.println("Готово! "); + bruteForceFile(); // Расшифровка методом полного перебора + System.out.println("Готово!"); break; case 4: - statisticalFile(); - System.out.println("Готово! "); + statisticalFile(); // Расшифровка статистическим анализом + System.out.println("Готово!"); break; default: System.out.println("Некорректный выбор, попробуйте снова."); } - } } + } - private static void encryptFile () throws IOException { - int key = Validator.scanKey(); + // Метод для шифрования текста из файла + private static void encryptFile() throws IOException { + int key = Validator.scanKey(); // Считываем ключ от пользователя - ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt"))); + // Читаем текст из файла + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt"))); - FileService.createNewFile("text\\encrypted.txt"); - Encrypt encrypt = new Encrypt(); - ArrayList result = new ArrayList<>(encrypt.encrypt(text, key)); - FileService.writeFile("text\\encrypted.txt", result); - } + // Создаём новый файл для зашифрованного текста + FileService.createNewFile("text\\encrypted.txt"); - private static void decryptFile () throws IOException { - int key = Validator.scanKey(); + // Шифруем текст с указанным ключом + Encrypt encrypt = new Encrypt(); + ArrayList result = new ArrayList<>(encrypt.encrypt(text, key)); - ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); - FileService.createNewFile("text\\decrypt.txt"); + // Записываем результат в файл + FileService.writeFile("text\\encrypted.txt", result); + } - Decrypt decrypt = new Decrypt(); + // Метод для расшифровки текста по ключу + private static void decryptFile() throws IOException { + int key = Validator.scanKey(); // Считываем ключ от пользователя - FileService.writeFile("text\\decrypt.txt", decrypt.decrypt(text, key)); - } + // Читаем зашифрованный текст + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); - private static void bruteForceFile() throws IOException { - ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); - FileService.createNewFile("text\\bruteForce.txt"); + // Создаём файл для расшифрованного текста + FileService.createNewFile("text\\decrypt.txt"); - BruteForce bruteForce = new BruteForce(); + // Расшифровываем текст + Decrypt decrypt = new Decrypt(); + FileService.writeFile("text\\decrypt.txt", decrypt.decrypt(text, key)); + } - FileService.writeFile("text\\bruteForce.txt", bruteForce.bruteForce(text)); - } + // Метод для расшифровки текста методом полного перебора (Brute Force) + private static void bruteForceFile() throws IOException { + ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); + + // Создаём файл для результата + FileService.createNewFile("text\\bruteForce.txt"); + + BruteForce bruteForce = new BruteForce(); - private static void statisticalFile() throws IOException { + // Записываем расшифрованный текст с найденным ключом + FileService.writeFile("text\\bruteForce.txt", bruteForce.bruteForce(text)); + } + + // Метод для расшифровки текста статистическим анализом + private static void statisticalFile() throws IOException { ArrayList text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt"))); + + // Создаём файл для результата FileService.createNewFile("text\\statisticalAnalysis.txt"); StatisticalAnalysis statisticalAnalysis = new StatisticalAnalysis(); + // Записываем расшифрованный текст FileService.writeFile("text\\statisticalAnalysis.txt", statisticalAnalysis.statisticalAnalysis(text)); } - } - +} diff --git a/src/main/java/com/javarush/orlov/Decrypt.java b/src/main/java/com/javarush/orlov/Decrypt.java index 8b4da6b..d2b9a3b 100644 --- a/src/main/java/com/javarush/orlov/Decrypt.java +++ b/src/main/java/com/javarush/orlov/Decrypt.java @@ -2,10 +2,17 @@ import java.util.ArrayList; -public class Decrypt extends Encrypt{ +public class Decrypt { + // Метод расшифровывает текст, используя ключ шифра Цезаря + // Для расшифровки используется метод шифрования с отрицательным ключом public ArrayList decrypt(ArrayList text, int key){ - return super.encrypt(text, -key); + // Создаём объект класса Encrypt для работы с шифром Цезаря + Encrypt encrypt = new Encrypt(); + + // Возвращаем результат шифрования с отрицательным ключом, + // что фактически выполняет расшифровку + return encrypt.encrypt(text, -key); } } diff --git a/src/main/java/com/javarush/orlov/Encrypt.java b/src/main/java/com/javarush/orlov/Encrypt.java index 1ee363b..3787c09 100644 --- a/src/main/java/com/javarush/orlov/Encrypt.java +++ b/src/main/java/com/javarush/orlov/Encrypt.java @@ -2,22 +2,23 @@ import java.util.ArrayList; - public class Encrypt { - // шифрование и дешифрование с помощью ключа + + // Алфавит, используемый для шифрования и дешифрования + // Содержит русские буквы в нижнем и верхнем регистре, знаки препинания и пробел public static final char[] ALPHABET = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', - 'ъ', 'ы', 'ь', 'э', 'ю', 'я', '.', ',', '«', '»', '"', '\'', ':', '!', '?', ' ', 'А', 'Б', 'В', 'Г', 'Д', - 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н' , 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', - 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'}; - - - + 'ъ', 'ы', 'ь', 'э', 'ю', 'я', '.', ',', '«', '»', '"', '\'', ':', '!', '?', ' ', + 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н' , 'О', 'П', + 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'}; + // Шифрует или расшифровывает текст с помощью ключа + // Если ключ положительный — шифрование, если отрицательный — расшифровка public ArrayList encrypt(ArrayList text, int key){ ArrayList result = new ArrayList<>(); + // Обрабатываем каждую строку текста for (String s : text) { result.add(checkAlphabet(s, key)); } @@ -25,16 +26,19 @@ public ArrayList encrypt(ArrayList text, int key){ return result; } + // Проверяет каждый символ строки и сдвигает его по алфавиту private String checkAlphabet(String text, int key){ StringBuilder builder = new StringBuilder(); - for (int k = 0; k < text.length(); k++) { // перебор символов строки + // Перебираем символы строки + for (int k = 0; k < text.length(); k++) { char current = text.charAt(k); - boolean found; - found = isFound(key, current, builder); + // Проверяем, есть ли символ в алфавите + boolean found = isFound(key, current, builder); - if (!found) { // если символа нет в алфавите — оставляем как есть + // Если символа нет в алфавите — оставляем его без изменений + if (!found) { builder.append(current); } } @@ -42,10 +46,13 @@ private String checkAlphabet(String text, int key){ return builder.toString(); } + // Сдвигает символ по алфавиту на заданное количество позиций + // Возвращает true, если символ найден в алфавите, иначе false private boolean isFound(int key, char current, StringBuilder builder) { - for (int j = 0; j < ALPHABET.length; j++) { // перебор алфавита + for (int j = 0; j < ALPHABET.length; j++) { // перебор всех символов алфавита if (current == ALPHABET[j]) { - builder.append(ALPHABET[(j + key%ALPHABET.length + ALPHABET.length) % ALPHABET.length]); + // Сдвиг с учетом длины алфавита и обработки отрицательного ключа + builder.append(ALPHABET[(j + key % ALPHABET.length + ALPHABET.length) % ALPHABET.length]); return true; } } diff --git a/src/main/java/com/javarush/orlov/FileService.java b/src/main/java/com/javarush/orlov/FileService.java index c32dc3b..74f82da 100644 --- a/src/main/java/com/javarush/orlov/FileService.java +++ b/src/main/java/com/javarush/orlov/FileService.java @@ -1,4 +1,5 @@ package com.javarush.orlov; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -7,36 +8,42 @@ import java.util.ArrayList; public class FileService { - // работа с файлами - public static String readFile(String filePath) throws IOException { - Path path = Paths.get(filePath); - byte[] bytes = Files.readAllBytes(path); - return new String(bytes, StandardCharsets.UTF_8); + // Метод для чтения содержимого файла в виде строки + public static String readFile(String filePath) throws IOException { + Path path = Paths.get(filePath); // получаем путь к файлу + byte[] bytes = Files.readAllBytes(path); // читаем все байты из файла + return new String(bytes, StandardCharsets.UTF_8); // преобразуем байты в строку с кодировкой UTF-8 } + + // Метод для создания нового файла + // Если файл уже существует — удаляет его и создаёт новый public static void createNewFile(String filePath) throws IOException { + Path path = Path.of(filePath); // путь к файлу - Path path = Path.of(filePath); // путь к файлу, где будет храниться зашифрованный текст - if (Files.exists(path)){ // проверка на существование файла - Files.delete(path); //если существует, то удалаем и создаём новый - Files.createFile(path); + if (Files.exists(path)) { // проверяем, существует ли файл + Files.delete(path); // если да — удаляем } - else Files.createFile(path); - + Files.createFile(path); // создаём новый файл } + // Метод для записи текста в файл public static void writeFile(String filePath, ArrayList str) { - Path path = Paths.get(filePath); + Path path = Paths.get(filePath); // путь к файлу try { StringBuilder builder = new StringBuilder(); + + // Объединяем все строки с переносами for (String line : str){ builder.append(line).append(System.lineSeparator()); } - // Запись с явным указанием кодировки UTF-8 + + // Запись в файл с явным указанием кодировки UTF-8 Files.writeString(path, builder.toString(), StandardCharsets.UTF_8); + } catch (IOException e){ + // Вывод ошибки, если запись не удалась System.out.println("Ошибка записи файла: " + e.getMessage()); } } - } diff --git a/src/main/java/com/javarush/orlov/StatisticalAnalysis.java b/src/main/java/com/javarush/orlov/StatisticalAnalysis.java index d5990b5..482feef 100644 --- a/src/main/java/com/javarush/orlov/StatisticalAnalysis.java +++ b/src/main/java/com/javarush/orlov/StatisticalAnalysis.java @@ -6,25 +6,35 @@ public class StatisticalAnalysis { + // Выполняет статистический анализ текста для взлома шифра Цезаря + // Объединяет весь текст в одну строку, находит самый частый символ и расшифровывает текст public ArrayList statisticalAnalysis(ArrayList text){ ArrayList result = new ArrayList<>(); - char top = ' '; - for (int i = 0; i < text.size(); i++) { - top = word(text.get(i)); + // Объединяем все строки текста в одну для анализа частоты символов + StringBuilder allText = new StringBuilder(); + for (String line : text) { + allText.append(line); } + // Находим самый часто встречающийся символ во всём тексте + char top = word(allText.toString()); + + // Вычисляем ключ шифра, предполагая, что самый частый символ — пробел int key = differenceWithSpace(top); - Decrypt decrypt = new Decrypt(); - result= decrypt.decrypt(text, key); + // Расшифровываем текст с найденным ключом + Decrypt decrypt = new Decrypt(); + result = decrypt.decrypt(text, key); return result; } - private char word (String line){ + // Находит символ, который встречается чаще всего в строке + private char word(String line){ HashMap count = new HashMap<>(); + // Подсчитываем количество каждого символа for (int j = 0; j < line.length(); j++) { char c = line.charAt(j); count.put(c, count.getOrDefault(c, 0) + 1); @@ -33,6 +43,7 @@ private char word (String line){ char mostFrequent = ' '; int maxCount = 0; + // Определяем символ с максимальной частотой for (Map.Entry entry : count.entrySet()) { if (entry.getValue() > maxCount) { maxCount = entry.getValue(); @@ -43,10 +54,13 @@ private char word (String line){ return mostFrequent; } + // Вычисляет ключ шифра Цезаря как разницу позиции самого частого символа и пробела + // Если ключ отрицательный, корректирует его, добавляя длину алфавита public static int differenceWithSpace(char mostFrequent) { int indexMostFrequent = -1; int indexSpace = -1; + // Находим позиции символов в алфавите for (int i = 0; i < Encrypt.ALPHABET.length; i++) { if (Encrypt.ALPHABET[i] == mostFrequent) { indexMostFrequent = i; @@ -56,11 +70,16 @@ public static int differenceWithSpace(char mostFrequent) { } } + // Если символы не найдены, выбрасываем исключение if (indexMostFrequent == -1 || indexSpace == -1) { throw new IllegalArgumentException("Символ не найден в алфавите"); } - return indexMostFrequent - indexSpace; // разница позиций + // Вычисляем ключ + int key = indexMostFrequent - indexSpace; + if (key < 0) key += Encrypt.ALPHABET.length; // корректировка отрицательного ключа + + return key; } -} \ No newline at end of file +} diff --git a/src/main/java/com/javarush/orlov/Validator.java b/src/main/java/com/javarush/orlov/Validator.java index 83795a5..45d352b 100644 --- a/src/main/java/com/javarush/orlov/Validator.java +++ b/src/main/java/com/javarush/orlov/Validator.java @@ -1,18 +1,21 @@ package com.javarush.orlov; - import java.util.InputMismatchException; import java.util.Scanner; public class Validator { - //проверка входных данных + + // Разделитель для визуального оформления меню private static final String asterisk = "*".repeat(60); - public static int begin (){ + // Метод отображает главное меню программы и возвращает выбор пользователя + public static int begin() { Scanner scanner = new Scanner(System.in); System.out.println("Привет! Это программа для работы с шифром Цезаря \n"); + while (true) { - System.out.println( asterisk + + // Вывод меню + System.out.println(asterisk + " Выберите: \n" + "1. Зашифровать файл \n" + "2. Расшифровать файл \n" + @@ -22,48 +25,46 @@ public static int begin (){ short num; - while (true) { try { + num = scanner.nextShort(); // считываем выбор пользователя - num = scanner.nextShort(); + // Проверяем корректность ввода if (num >= 0 && num <= 4) return num; else { - System.out.println("Некорректный ввод"); - - System.out.println(" Выберите:\n" + - "1. Зашифровать файл \n" + - "2. Расшифровать файл \n" + - "3. Взлом (Brute Force) \n" + - "4. Взлом (Статистический анализ) \n" + - "0. Выход "); + System.out.println("Некорректный ввод. Нужно выбрать число от 0 до 4."); } - } catch (InputMismatchException e) { - System.out.println("Нужно ввести цифру от 1 до 4!!"); - scanner.next(); - System.out.println(" Выберите: \n" + - "1. Зашифровать файл \n" + - "2. Расшифровать файл \n" + - "3. Взлом (Brute Force) \n" + - "4. Взлом (Статистический анализ) \n" + - "0. Выход"); + } catch (InputMismatchException e) { + // Если введено не число, выводим сообщение и очищаем ввод + System.out.println("Нужно ввести цифру от 0 до 4!"); + scanner.next(); // очищаем некорректный ввод } + + // Повторный вывод меню + System.out.println("Выберите: \n" + + "1. Зашифровать файл \n" + + "2. Расшифровать файл \n" + + "3. Взлом (Brute Force) \n" + + "4. Взлом (Статистический анализ) \n" + + "0. Выход"); } + } } -} - - public static int scanKey (){ + // Метод запрашивает у пользователя ключ для шифра Цезаря + public static int scanKey() { Scanner scanner = new Scanner(System.in); - while (true) { - try { - System.out.println("Введите ключ"); - return scanner.nextInt(); - } catch (InputMismatchException e) { - System.out.println("Нужно ввести цифру!!"); - scanner.next(); - } - } + + while (true) { + try { + System.out.println("Введите ключ:"); + return scanner.nextInt(); // возвращаем введённый ключ + } catch (InputMismatchException e) { + // Если введено не число, выводим сообщение и очищаем ввод + System.out.println("Нужно ввести цифру!!"); + scanner.next(); // очищаем некорректный ввод + } + } } } From ed8b75bebe47ab3b39f9a022c660f04a2bc31944 Mon Sep 17 00:00:00 2001 From: orlov Date: Wed, 3 Sep 2025 20:10:28 +0300 Subject: [PATCH 13/13] comments v2 --- src/main/java/com/javarush/orlov/BruteForce.java | 8 ++++---- src/main/java/com/javarush/orlov/Decrypt.java | 2 +- src/main/java/com/javarush/orlov/Encrypt.java | 6 +++--- src/main/java/com/javarush/orlov/FileService.java | 4 ++-- .../com/javarush/orlov/StatisticalAnalysis.java | 4 ++-- src/main/java/com/javarush/orlov/Validator.java | 15 ++------------- 6 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/javarush/orlov/BruteForce.java b/src/main/java/com/javarush/orlov/BruteForce.java index 246fbf5..954c88e 100644 --- a/src/main/java/com/javarush/orlov/BruteForce.java +++ b/src/main/java/com/javarush/orlov/BruteForce.java @@ -9,7 +9,7 @@ public class BruteForce extends Encrypt { // Метод перебирает все возможные ключи шифра Цезаря и выбирает лучший // Лучший ключ определяется по количеству слов из словаря, найденных в тексте - public ArrayList bruteForce(ArrayList text){ + public ArrayList bruteForce(ArrayList text) { ArrayList result; int key = 0; // ключ с наибольшим количеством совпадений int count = 0; // максимальное количество совпадений слов из словаря @@ -18,7 +18,7 @@ public ArrayList bruteForce(ArrayList text){ for (int i = 0; i < ALPHABET.length; i++) { result = super.encrypt(text, i); // "расшифровываем" текст с текущим ключом int temp = extracted(result); // подсчитываем совпадения слов из словаря - if (temp > count){ + if (temp > count) { key = i; // если найдено больше совпадений, сохраняем ключ count = temp; } @@ -41,7 +41,7 @@ private static int extracted(ArrayList result) { } // Метод проверяет строку на наличие слов из словаря - private static int checkWord(String str){ + private static int checkWord(String str) { int count = 0; // Разбиваем строку на слова по пробелам @@ -53,7 +53,7 @@ private static int checkWord(String str){ // Сравниваем слово с каждым словом из словаря (игнорируя регистр) for (int j = 0; j < DICTIONARY.length; j++) { - if (word[i].equalsIgnoreCase(DICTIONARY[j])){ + if (word[i].equalsIgnoreCase(DICTIONARY[j])) { count++; // если совпадение найдено, увеличиваем счетчик } } diff --git a/src/main/java/com/javarush/orlov/Decrypt.java b/src/main/java/com/javarush/orlov/Decrypt.java index d2b9a3b..97514ef 100644 --- a/src/main/java/com/javarush/orlov/Decrypt.java +++ b/src/main/java/com/javarush/orlov/Decrypt.java @@ -6,7 +6,7 @@ public class Decrypt { // Метод расшифровывает текст, используя ключ шифра Цезаря // Для расшифровки используется метод шифрования с отрицательным ключом - public ArrayList decrypt(ArrayList text, int key){ + public ArrayList decrypt(ArrayList text, int key) { // Создаём объект класса Encrypt для работы с шифром Цезаря Encrypt encrypt = new Encrypt(); diff --git a/src/main/java/com/javarush/orlov/Encrypt.java b/src/main/java/com/javarush/orlov/Encrypt.java index 3787c09..1eac8da 100644 --- a/src/main/java/com/javarush/orlov/Encrypt.java +++ b/src/main/java/com/javarush/orlov/Encrypt.java @@ -9,12 +9,12 @@ public class Encrypt { public static final char[] ALPHABET = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', '.', ',', '«', '»', '"', '\'', ':', '!', '?', ' ', - 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н' , 'О', 'П', + 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'}; // Шифрует или расшифровывает текст с помощью ключа // Если ключ положительный — шифрование, если отрицательный — расшифровка - public ArrayList encrypt(ArrayList text, int key){ + public ArrayList encrypt(ArrayList text, int key) { ArrayList result = new ArrayList<>(); @@ -27,7 +27,7 @@ public ArrayList encrypt(ArrayList text, int key){ } // Проверяет каждый символ строки и сдвигает его по алфавиту - private String checkAlphabet(String text, int key){ + private String checkAlphabet(String text, int key) { StringBuilder builder = new StringBuilder(); // Перебираем символы строки diff --git a/src/main/java/com/javarush/orlov/FileService.java b/src/main/java/com/javarush/orlov/FileService.java index 74f82da..06d3076 100644 --- a/src/main/java/com/javarush/orlov/FileService.java +++ b/src/main/java/com/javarush/orlov/FileService.java @@ -34,14 +34,14 @@ public static void writeFile(String filePath, ArrayList str) { StringBuilder builder = new StringBuilder(); // Объединяем все строки с переносами - for (String line : str){ + for (String line : str) { builder.append(line).append(System.lineSeparator()); } // Запись в файл с явным указанием кодировки UTF-8 Files.writeString(path, builder.toString(), StandardCharsets.UTF_8); - } catch (IOException e){ + } catch (IOException e) { // Вывод ошибки, если запись не удалась System.out.println("Ошибка записи файла: " + e.getMessage()); } diff --git a/src/main/java/com/javarush/orlov/StatisticalAnalysis.java b/src/main/java/com/javarush/orlov/StatisticalAnalysis.java index 482feef..4507c5c 100644 --- a/src/main/java/com/javarush/orlov/StatisticalAnalysis.java +++ b/src/main/java/com/javarush/orlov/StatisticalAnalysis.java @@ -8,7 +8,7 @@ public class StatisticalAnalysis { // Выполняет статистический анализ текста для взлома шифра Цезаря // Объединяет весь текст в одну строку, находит самый частый символ и расшифровывает текст - public ArrayList statisticalAnalysis(ArrayList text){ + public ArrayList statisticalAnalysis(ArrayList text) { ArrayList result = new ArrayList<>(); // Объединяем все строки текста в одну для анализа частоты символов @@ -31,7 +31,7 @@ public ArrayList statisticalAnalysis(ArrayList text){ } // Находит символ, который встречается чаще всего в строке - private char word(String line){ + private char word(String line) { HashMap count = new HashMap<>(); // Подсчитываем количество каждого символа diff --git a/src/main/java/com/javarush/orlov/Validator.java b/src/main/java/com/javarush/orlov/Validator.java index 45d352b..b4da170 100644 --- a/src/main/java/com/javarush/orlov/Validator.java +++ b/src/main/java/com/javarush/orlov/Validator.java @@ -15,13 +15,7 @@ public static int begin() { while (true) { // Вывод меню - System.out.println(asterisk + - " Выберите: \n" + - "1. Зашифровать файл \n" + - "2. Расшифровать файл \n" + - "3. Взлом (Brute Force) \n" + - "4. Взлом (Статистический анализ) \n" + - "0. Выход "); + System.out.println(asterisk + " Выберите: \n" + "1. Зашифровать файл \n" + "2. Расшифровать файл \n" + "3. Взлом (Brute Force) \n" + "4. Взлом (Статистический анализ) \n" + "0. Выход "); short num; @@ -42,12 +36,7 @@ public static int begin() { } // Повторный вывод меню - System.out.println("Выберите: \n" + - "1. Зашифровать файл \n" + - "2. Расшифровать файл \n" + - "3. Взлом (Brute Force) \n" + - "4. Взлом (Статистический анализ) \n" + - "0. Выход"); + System.out.println("Выберите: \n" + "1. Зашифровать файл \n" + "2. Расшифровать файл \n" + "3. Взлом (Brute Force) \n" + "4. Взлом (Статистический анализ) \n" + "0. Выход"); } } }