From 341121cd541a10c7be3cf280fdd12d00d7daa674 Mon Sep 17 00:00:00 2001 From: DmitriyPopkov Date: Fri, 5 Sep 2025 14:55:30 +0300 Subject: [PATCH 1/2] add App for Git --- .../javarush/popkovdmitriy/ConsoleRunner.java | 31 +++++ .../popkovdmitriy/command/BruteForce.java | 74 ++++++++++++ .../popkovdmitriy/command/Decode.java | 9 ++ .../popkovdmitriy/command/Encode.java | 66 +++++++++++ .../javarush/popkovdmitriy/command/Exit.java | 11 ++ .../popkovdmitriy/console/ConsoleApp.java | 67 +++++++++++ .../javarush/popkovdmitriy/console/Menu.java | 51 +++++++++ .../popkovdmitriy/console/Messages.java | 10 ++ .../popkovdmitriy/constant/Alphabet.java | 13 +++ .../popkovdmitriy/constant/Const.java | 17 +++ .../controller/MainController.java | 107 ++++++++++++++++++ .../popkovdmitriy/exeption/AppExeption.java | 7 ++ .../popkovdmitriy/util/FileValidator.java | 75 ++++++++++++ .../popkovdmitriy/util/PathBuilder.java | 38 +++++++ 14 files changed, 576 insertions(+) create mode 100644 src/main/java/com/javarush/popkovdmitriy/ConsoleRunner.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/command/BruteForce.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/command/Decode.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/command/Encode.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/command/Exit.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/console/ConsoleApp.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/console/Menu.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/console/Messages.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/constant/Alphabet.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/constant/Const.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/controller/MainController.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/exeption/AppExeption.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/util/FileValidator.java create mode 100644 src/main/java/com/javarush/popkovdmitriy/util/PathBuilder.java diff --git a/src/main/java/com/javarush/popkovdmitriy/ConsoleRunner.java b/src/main/java/com/javarush/popkovdmitriy/ConsoleRunner.java new file mode 100644 index 0000000..a2dca42 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/ConsoleRunner.java @@ -0,0 +1,31 @@ +package com.javarush.popkovdmitriy; + +import com.javarush.popkovdmitriy.console.ConsoleApp; +import com.javarush.popkovdmitriy.console.Menu; +import com.javarush.popkovdmitriy.controller.MainController; +import com.javarush.popkovdmitriy.util.PathBuilder; + +import java.util.Scanner; + +public class ConsoleRunner { + + public static void main(String[] args) { + //build console app + Scanner input = new Scanner(System.in); + Menu inputmenu = new Menu(input); + ConsoleApp application = new ConsoleApp(inputmenu, input); + PathBuilder readFILE = new PathBuilder(application); + + + MainController mainController = new MainController(readFILE.inputFilePath, application.shift, inputmenu.inputmenu); + while (mainController.pick_upShift == 1) { + + MainController mainController_pickup = new MainController(readFILE.inputFilePath, MainController.shift, inputmenu.inputmenu); + } + } + + + +} + + diff --git a/src/main/java/com/javarush/popkovdmitriy/command/BruteForce.java b/src/main/java/com/javarush/popkovdmitriy/command/BruteForce.java new file mode 100644 index 0000000..1d34104 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/command/BruteForce.java @@ -0,0 +1,74 @@ +package com.javarush.popkovdmitriy.command; + +import com.javarush.popkovdmitriy.constant.Const; +import com.javarush.popkovdmitriy.exeption.AppExeption; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +public class BruteForce { + public static boolean commonEmtyWords; + + + public static String bruteforce(String text, int shift) { + + return Encode.encrypt(text, (-1 * shift)); + + } + + + public static Set findCommonWords() { + Set wordsInFile1_buff = BruteForce.findCommonWords1(); + Set commonWords_buff = BruteForce.findCommonWords2(wordsInFile1_buff); + BruteForce.commonEmtyWords = commonWords_buff.isEmpty(); + return commonWords_buff; + } + + public static Set findCommonWords1() { + Set wordsInFile1 = new HashSet<>(); + + try (BufferedReader reader1 = new BufferedReader(new FileReader(Const.METRIKA_PATH))) { + String line; + while ((line = reader1.readLine()) != null) { + + String[] words = line.split("\\s+"); + for (String word : words) { + wordsInFile1.add(word.toLowerCase()); + } + } + } catch (IOException e) { + throw new AppExeption(e.getMessage()); + } + return wordsInFile1; + } + + public static Set findCommonWords2(Set wordsInFile1) { + Set commonWords = new HashSet<>(); + + try (BufferedReader reader2 = new BufferedReader(new FileReader(Const.BRUTFORCE_PATH))) { + String line; + while ((line = reader2.readLine()) != null) { + String[] words = line.split("\\s+"); + for (String word : words) { + if (wordsInFile1.contains(word.toLowerCase())) { + commonWords.add(word.toLowerCase()); + } + } + } + + } catch (IOException e) { + throw new AppExeption(e.getMessage()); + } + + return commonWords; + } + + public static int bruteforceShift(int shift) { + ++shift; + return shift; + } + +} \ No newline at end of file diff --git a/src/main/java/com/javarush/popkovdmitriy/command/Decode.java b/src/main/java/com/javarush/popkovdmitriy/command/Decode.java new file mode 100644 index 0000000..9286614 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/command/Decode.java @@ -0,0 +1,9 @@ +package com.javarush.popkovdmitriy.command; + +public class Decode { + + public static String decrypt(String text, int shift) { + + return Encode.encrypt(text, (-1*shift)); + } +} diff --git a/src/main/java/com/javarush/popkovdmitriy/command/Encode.java b/src/main/java/com/javarush/popkovdmitriy/command/Encode.java new file mode 100644 index 0000000..ac05ce3 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/command/Encode.java @@ -0,0 +1,66 @@ +package com.javarush.popkovdmitriy.command; + + + + +import static com.javarush.popkovdmitriy.constant.Alphabet.*; + +public class Encode { + + + public static String encrypt(String text, int shift) { + StringBuilder encryptedText = new StringBuilder(); + + for (char character : text.toCharArray()) { + encryptedText.append(encryptCharacter(character, shift)); + } + + return encryptedText.toString(); + } + + private static char encryptCharacter(char character, int shift) { + + if (( character >='a' && character <='z')||( character >='A' && character <='Z')) { + + if (Character.isLowerCase(character)) { + + return encryptInAlphabet(character, LATIN_ALPHABET, shift); + } else if (Character.isUpperCase(character)) { + + return encryptInAlphabet(Character.toLowerCase(character), LATIN_ALPHABET, shift); + } + } + + if ( character >='а' && character <='я') + + { + + return encryptInAlphabet(character, RUSSIAN_ALPHABET, shift); + } else + if ( character >='А' && character <='Я'){ + return encryptInAlphabet(character, RUSSIAN_ALPHABET_UPPER, shift); + } + + return encryptInAlphabet(character, SYMBOLS, shift); + } + + private static char encryptInAlphabet(char character, char[] alphabet, int shift) { + int index = -1; + + + for (int i = 0; i< alphabet.length ;i++){ + if (alphabet[i] == character) { + index = i; + break; + } + } + if (index != -1) { + int newIndex = (index + shift) % alphabet.length; + return alphabet[(newIndex + alphabet.length) % alphabet.length]; + } + + + return character; + } + +} diff --git a/src/main/java/com/javarush/popkovdmitriy/command/Exit.java b/src/main/java/com/javarush/popkovdmitriy/command/Exit.java new file mode 100644 index 0000000..bdd79bc --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/command/Exit.java @@ -0,0 +1,11 @@ +package com.javarush.popkovdmitriy.command; + + +public class Exit { + public static void exit(){ + System.exit(0); + } + + } + + diff --git a/src/main/java/com/javarush/popkovdmitriy/console/ConsoleApp.java b/src/main/java/com/javarush/popkovdmitriy/console/ConsoleApp.java new file mode 100644 index 0000000..169bda2 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/console/ConsoleApp.java @@ -0,0 +1,67 @@ +package com.javarush.popkovdmitriy.console; + +import com.javarush.popkovdmitriy.command.Exit; +import com.javarush.popkovdmitriy.exeption.AppExeption; + +import java.util.Scanner; + +import static com.javarush.popkovdmitriy.console.Messages.outMode; + +public class ConsoleApp { + public String filename; + private final Scanner scanner; + public Menu inputmenu_Console; + public int shift; + + public ConsoleApp(Menu inputmenu,Scanner scanner) { +this.scanner=scanner; + this.inputmenu_Console=inputmenu; + if (inputmenu.inputmenu==3) { + Exit.exit(); + } + inputShift(inputmenu); + + + + + + } + + + + private String getinputPath() { + + this.filename=getScanner().nextLine(); + + + return this.filename; + } + + + public Scanner getScanner() { + return scanner; + } + + public void inputShift(Menu inputmenu){ + System.out.print("Введите имя файла для режима "+ outMode[inputmenu.inputmenu]+" " ); + this.filename =getinputPath(); + if (inputmenu.inputmenu!=2){ + String shift1; + + System.out.print("Введите ключ "); + shift1=getScanner().nextLine(); + try { + + this.shift=Integer.parseInt(shift1); + } catch (NumberFormatException e) { + throw new AppExeption(e.getMessage()); + } + }else { + this.shift=1; + + } + + } + +} + diff --git a/src/main/java/com/javarush/popkovdmitriy/console/Menu.java b/src/main/java/com/javarush/popkovdmitriy/console/Menu.java new file mode 100644 index 0000000..e49f734 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/console/Menu.java @@ -0,0 +1,51 @@ +package com.javarush.popkovdmitriy.console; +import java.util.Scanner; + +import static com.javarush.popkovdmitriy.console.Messages.*; + +public class Menu { + + public Scanner scanner; + public int inputmenu; + + + + + public Menu(Scanner input) { + int mode; + this.scanner=input; + String inputmode; + + System.out.println(EncodeMenu + " 1"); + System.out.println(DecodeMenu + " 2"); + System.out.println( BruteForce+ " 3"); + System.out.println(ExitMenu + " 4"); + System.out.print("Выбран режим "); +do{ + inputmode = input.nextLine(); + + + mode = switch (inputmode) { + case "1" -> 0; + case "2" -> 1; + case "3" -> 2; + case "4" -> 3; + // case "5" -> 4; + default -> { + + System.out.println("INCORRECT_SELECTION"); + + yield -1; + + } + }; + + + } while (mode < 0) ; + + System.out.println(outMode[mode]); +this.inputmenu=mode; + } + + +} diff --git a/src/main/java/com/javarush/popkovdmitriy/console/Messages.java b/src/main/java/com/javarush/popkovdmitriy/console/Messages.java new file mode 100644 index 0000000..4587f89 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/console/Messages.java @@ -0,0 +1,10 @@ +package com.javarush.popkovdmitriy.console; + +public interface Messages { + String EncodeMenu="Кодирование текста"; + String DecodeMenu="Декодирование текста"; + String BruteForce="Взлом приложения"; + String ExitMenu="Выход из приложения"; +String[] outMode=new String[]{EncodeMenu,DecodeMenu,BruteForce,ExitMenu}; + +} diff --git a/src/main/java/com/javarush/popkovdmitriy/constant/Alphabet.java b/src/main/java/com/javarush/popkovdmitriy/constant/Alphabet.java new file mode 100644 index 0000000..2077fa0 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/constant/Alphabet.java @@ -0,0 +1,13 @@ +package com.javarush.popkovdmitriy.constant; + + + +public class Alphabet { + + + public static final char[] LATIN_ALPHABET ="abcdefghijklmnopqrstuvwxyz".toCharArray(); + public static final char[] RUSSIAN_ALPHABET = "абвгдежзийклмнопрстуфхцчшщъыьэюя".toCharArray(); + public static final char[] RUSSIAN_ALPHABET_UPPER ="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ".toCharArray(); + public static final char[] SYMBOLS = "☮.,”’:-!? ".toCharArray(); + +} diff --git a/src/main/java/com/javarush/popkovdmitriy/constant/Const.java b/src/main/java/com/javarush/popkovdmitriy/constant/Const.java new file mode 100644 index 0000000..08415a2 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/constant/Const.java @@ -0,0 +1,17 @@ +package com.javarush.popkovdmitriy.constant; + +import java.io.File; + +import static java.lang.System.getProperty; + +public interface Const { + String TXT_FOLDER = getProperty("user.dir") + + File.separator + + "text" + + File.separator; + +String ENCRYPTED_PATH=TXT_FOLDER+"encryptedText.txt"; + String DECRYPTED_PATH=TXT_FOLDER+"decryptedText.txt"; + String METRIKA_PATH=TXT_FOLDER+"dict.txt"; + String BRUTFORCE_PATH=TXT_FOLDER+"brutforsText.txt"; +} diff --git a/src/main/java/com/javarush/popkovdmitriy/controller/MainController.java b/src/main/java/com/javarush/popkovdmitriy/controller/MainController.java new file mode 100644 index 0000000..5640a3f --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/controller/MainController.java @@ -0,0 +1,107 @@ +package com.javarush.popkovdmitriy.controller; + +import com.javarush.popkovdmitriy.command.BruteForce; +import com.javarush.popkovdmitriy.command.Decode; +import com.javarush.popkovdmitriy.command.Encode; +import com.javarush.popkovdmitriy.command.Exit; +import com.javarush.popkovdmitriy.exeption.AppExeption; +import com.javarush.popkovdmitriy.util.FileValidator; + +import javax.imageio.IIOException; +import java.io.*; +import java.nio.file.Path; +import java.util.Set; + +import static com.javarush.popkovdmitriy.constant.Const.*; +import static java.nio.file.Path.of; + +public class MainController { +public int pick_upShift=0; +public int inputmenu_Main; + public static int shift; +public Path readFILE; + public Path outputFilePath; + + public MainController(Path inputFilePath, int shift, int inputmenu ) { + + String outputFilePath=""; +this.inputmenu_Main=inputmenu; + + + + + if (inputmenu==0) { + outputFilePath = ENCRYPTED_PATH; + + } + if ((inputmenu==1)) { + outputFilePath = DECRYPTED_PATH; + + } + if ((inputmenu==2)) { + outputFilePath = BRUTFORCE_PATH; + + } + + this.readFILE=inputFilePath; + MainController.shift=shift; + this.outputFilePath= of(outputFilePath); + FileValidator.validateForWriting(outputFilePath); + + try (BufferedReader reader = new BufferedReader(new FileReader(this.readFILE.toFile())); + BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilePath))) { + + String line; + while ((line = reader.readLine()) != null) { + if ((inputmenu == 0)) { + String encryptedLine = Encode.encrypt(line, shift); + writer.write(encryptedLine); + } + if ((inputmenu == 1)) { + String decryptedLine = Decode.decrypt(line, shift); + writer.write(decryptedLine); + } + if ((inputmenu == 2)) { + String brutforcedLine = BruteForce.bruteforce(line, shift); + writer.write(brutforcedLine); + } + writer.newLine(); + + + } + if ((inputmenu != 2)) { + System.out.println("Шифрование завершено, результат сохранен в файле: " + outputFilePath); + + } + + + } catch (IOException ex) { + throw new AppExeption(ex.getMessage()); + } + + if ((inputmenu == 2)) { + try { + gotoAnaliz(); + } catch (IIOException e) { + throw new AppExeption(e.getMessage()); + } + } + + } + + public void gotoAnaliz() throws IIOException { + Set commonWordsBrutforce=BruteForce.findCommonWords(); + int commonEmtyWords=commonWordsBrutforce.size(); + if (commonEmtyWords>35) { + System.out.println("Взлом завершен, ключ: " + shift); + System.out.println("Результат сохранен в файле: " + outputFilePath); + this.pick_upShift=0; + Exit.exit(); + }else { + MainController.shift=BruteForce.bruteforceShift(shift); + this.pick_upShift=1; + } + } + + +} diff --git a/src/main/java/com/javarush/popkovdmitriy/exeption/AppExeption.java b/src/main/java/com/javarush/popkovdmitriy/exeption/AppExeption.java new file mode 100644 index 0000000..6446564 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/exeption/AppExeption.java @@ -0,0 +1,7 @@ +package com.javarush.popkovdmitriy.exeption; + +public class AppExeption extends RuntimeException { + public AppExeption(String message) { + super(message); + } +} diff --git a/src/main/java/com/javarush/popkovdmitriy/util/FileValidator.java b/src/main/java/com/javarush/popkovdmitriy/util/FileValidator.java new file mode 100644 index 0000000..cefc2e8 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/util/FileValidator.java @@ -0,0 +1,75 @@ +package com.javarush.popkovdmitriy.util; + +import com.javarush.popkovdmitriy.exeption.AppExeption; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.InvalidPathException; +import java.nio.file.Path; +import java.util.List; + + + + +public class FileValidator { + private static final List FORBIDDEN_DIRS_FILES = + List.of(".bash_history", ".bash_profile", "etc", "proc"); + + + public static void validateForWriting(String filename) { + + Path path = validatePath(filename); + if (Files.exists(path)) { + if (Files.isDirectory(path)) { + throw new AppExeption("Файл является каталогом"); + } + if (!Files.isWritable(path)) { + throw new AppExeption("Файл не доступен для записи"); + } + } + } + + public static void validateForReading(String filename) { + + Path path = validatePath(filename); + if (Files.notExists(path)) { + + throw new AppExeption("Файла не существует"); + } + if (Files.isDirectory(path)) { + throw new AppExeption("Файл является каталогом"); + } + if (!Files.isReadable(path)) { + throw new AppExeption("Файл не доступен для чтения"); + } + + } + + private static Path validatePath(String filename) { + File fileName = new File(filename); + String fileName1 = fileName.getName(); + Path fileName2; + String fileName3; + int lastIndexOfDot = fileName1.lastIndexOf("."); + if (lastIndexOfDot > 0 && lastIndexOfDot < fileName.length() - 1) { + fileName2 = Path.of(fileName1.substring(lastIndexOfDot + 1)); + fileName3 = fileName2.toString(); + if (FORBIDDEN_DIRS_FILES.contains(fileName3)) { + throw new AppExeption("Имя содержит запрещенную часть : " + filename); + } + } + + + + try { + + return Path.of(filename); + } catch (InvalidPathException ex) { + throw new AppExeption("Некорректный путь" + ex.getMessage()); + } + + + } + + +} \ No newline at end of file diff --git a/src/main/java/com/javarush/popkovdmitriy/util/PathBuilder.java b/src/main/java/com/javarush/popkovdmitriy/util/PathBuilder.java new file mode 100644 index 0000000..573df54 --- /dev/null +++ b/src/main/java/com/javarush/popkovdmitriy/util/PathBuilder.java @@ -0,0 +1,38 @@ +package com.javarush.popkovdmitriy.util; + + +import com.javarush.popkovdmitriy.console.ConsoleApp; +import com.javarush.popkovdmitriy.constant.Const; + +import java.nio.file.Path; + + + +public class PathBuilder { + + public String filename; + public Path inputFilePath; + public PathBuilder(ConsoleApp application) { + this.filename =application.filename; + + +this.inputFilePath=buildPath(application.filename); + + + } + + + public Path buildPath(String filename) { + +this.filename=filename; + Path filePath = Path.of(Const.TXT_FOLDER + this.filename); + + + System.out.println("Полный путь к файлу:" + filePath); + + FileValidator.validateForReading(filePath.toString()); + return filePath; + } + + +} From 5c315406225337bb59fd2d898e9f877b7eb75596 Mon Sep 17 00:00:00 2001 From: DmitriyPopkov Date: Fri, 5 Sep 2025 15:00:33 +0300 Subject: [PATCH 2/2] latest version --- src/main/java/com/javarush/popkovdmitriy/ConsoleRunner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/javarush/popkovdmitriy/ConsoleRunner.java b/src/main/java/com/javarush/popkovdmitriy/ConsoleRunner.java index a2dca42..c9ae659 100644 --- a/src/main/java/com/javarush/popkovdmitriy/ConsoleRunner.java +++ b/src/main/java/com/javarush/popkovdmitriy/ConsoleRunner.java @@ -20,7 +20,7 @@ public static void main(String[] args) { MainController mainController = new MainController(readFILE.inputFilePath, application.shift, inputmenu.inputmenu); while (mainController.pick_upShift == 1) { - MainController mainController_pickup = new MainController(readFILE.inputFilePath, MainController.shift, inputmenu.inputmenu); + new MainController(readFILE.inputFilePath, MainController.shift, inputmenu.inputmenu); } }