From 7a7f32fbc45a93e78fbf8e0844cf0ab6751e587e Mon Sep 17 00:00:00 2001 From: DevEvge Date: Sat, 24 Aug 2024 20:43:26 +0300 Subject: [PATCH 01/14] Improve alphabet --- .../com/javarush/gnew/language/Language.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/ua/com/javarush/gnew/language/Language.java b/src/main/java/ua/com/javarush/gnew/language/Language.java index 067dd2f..9b77f3f 100644 --- a/src/main/java/ua/com/javarush/gnew/language/Language.java +++ b/src/main/java/ua/com/javarush/gnew/language/Language.java @@ -1,12 +1,27 @@ package ua.com.javarush.gnew.language; import java.util.ArrayList; +import java.util.Arrays; + +public class Language { + public static final ArrayList ALPHABET_ENG = new ArrayList<>(Arrays.asList( + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')); + + public static final ArrayList ALPHABET_UA = new ArrayList<>(Arrays.asList( + 'а', 'б', 'в', 'г', 'ґ', 'д', 'е', 'є', 'ж', 'з', 'и', 'і', 'ї', 'й', 'к', 'л', 'м', + 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ю', 'я')); + + public static final ArrayList ALPHABET_ENG_UPPER = new ArrayList<>(Arrays.asList( + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z')); + + public static final ArrayList ALPHABET_UA_UPPER = new ArrayList<>(Arrays.asList( + 'А', 'Б', 'В', 'Г', 'Ґ', 'Д', 'Е', 'Є', 'Ж', 'З', 'И', 'І', 'Ї', 'Й', 'К', 'Л', 'М', + 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ю', 'Я')); + + -public abstract class Language { - private final ArrayList alphabet; - public Language(ArrayList alphabet) { - this.alphabet = alphabet; - } } From 67c54954be79c78e82a57f2bf2eb5c10eb26931e Mon Sep 17 00:00:00 2001 From: DevEvge Date: Sun, 25 Aug 2024 02:28:16 +0300 Subject: [PATCH 02/14] Create and implementation alphabetDetector in Cypher --- .../ua/com/javarush/gnew/crypto/Cypher.java | 60 +++++++++++++++---- .../gnew/language/LanguageDetector.java | 32 ++++++++++ .../java/ua/com/javarush/gnew/MainTest.java | 6 +- 3 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java diff --git a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java index 2b01247..77868fa 100644 --- a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java +++ b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java @@ -1,33 +1,67 @@ package ua.com.javarush.gnew.crypto; +import ua.com.javarush.gnew.language.LanguageDetector; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; public class Cypher { - private final ArrayList originalAlphabet = new ArrayList<>(Arrays.asList('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')); public String encrypt(String input, int key) { key = Math.negateExact(key); - - ArrayList rotatedAlphabet = new ArrayList<>(originalAlphabet); - Collections.rotate(rotatedAlphabet, key); - char[] charArray = input.toCharArray(); + char[] chars = input.toCharArray(); StringBuilder builder = new StringBuilder(); - for (char symbol : charArray) { - builder.append(processSymbol(symbol, rotatedAlphabet)); + + for (char currentChar : chars) { + builder.append(processSymbol(currentChar, key)); } return builder.toString(); } - private Character processSymbol(char symbol, ArrayList rotatedAlphabet) { - if (!originalAlphabet.contains(symbol)) { - return symbol; - } - int index = originalAlphabet.indexOf(symbol); + private Character processSymbol(char currentChar, int key) { + ArrayList originalAlphabet = LanguageDetector.detector(currentChar); + if (originalAlphabet == null){ + return currentChar; + } + ArrayList rotatedAlphabet = new ArrayList<>(originalAlphabet); + Collections.rotate(rotatedAlphabet, key); + int index = originalAlphabet.indexOf(currentChar); return rotatedAlphabet.get(index); } } + + + + +// if (!originalAlphabet.contains(currentChar)) { +// return currentChar; +// } + + + +// public String encrypt(String input, int key) { +// key = Math.negateExact(key); +// +// originalAlphabet = LanguageDetector.detector(input); +// ArrayList rotatedAlphabet = new ArrayList<>(originalAlphabet); +// Collections.rotate(rotatedAlphabet, key); +// +// char[] charArray = input.toCharArray(); +// +// StringBuilder builder = new StringBuilder(); +// for (char symbol : charArray) { +// builder.append(processSymbol(symbol, rotatedAlphabet)); +// } +// return builder.toString(); +// } +// +// private Character processSymbol(char symbol, ArrayList rotatedAlphabet) { +// if (!originalAlphabet.contains(symbol)) { +// return symbol; +// } +// int index = originalAlphabet.indexOf(symbol); +// +// return rotatedAlphabet.get(index); +// } \ No newline at end of file diff --git a/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java b/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java new file mode 100644 index 0000000..b285a80 --- /dev/null +++ b/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java @@ -0,0 +1,32 @@ +package ua.com.javarush.gnew.language; + +import java.util.ArrayList; + +public class LanguageDetector { + + + public static ArrayList detector(char content){ + +// for (int i = 0; i < content.length(); i++) { +// currentChar = content.charAt(i); +// if (Character.isLetter(currentChar)){ +// break; +// } +// } + + if (Language.ALPHABET_ENG.contains(content)) { + return Language.ALPHABET_ENG; + } else if (Language.ALPHABET_ENG_UPPER.contains(content)){ + return Language.ALPHABET_ENG_UPPER; + } else if (Language.ALPHABET_UA.contains(content)){ + return Language.ALPHABET_UA; + } else if (Language.ALPHABET_UA_UPPER.contains(content)){ + return Language.ALPHABET_UA_UPPER; + } + +// TO DO: new return + return null; + } + + +} diff --git a/src/test/java/ua/com/javarush/gnew/MainTest.java b/src/test/java/ua/com/javarush/gnew/MainTest.java index b7f6356..5a99514 100644 --- a/src/test/java/ua/com/javarush/gnew/MainTest.java +++ b/src/test/java/ua/com/javarush/gnew/MainTest.java @@ -8,14 +8,18 @@ import java.io.IOException; import java.nio.file.Files; +import java.nio.file.InvalidPathException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; class MainTest { - private static final boolean UKRAINIAN_LANGUAGE_TEST = false; + + private static final boolean UKRAINIAN_LANGUAGE_TEST = true; private static final String ENCRYPT_COMMAND = "-e"; private static final String DECRYPT_COMMAND = "-d"; private static final String BF_COMMAND = "-bf"; From 4ba7e5ec093769bbc535eabf47cf69ee9d197c58 Mon Sep 17 00:00:00 2001 From: DevEvge Date: Sun, 25 Aug 2024 02:42:51 +0300 Subject: [PATCH 03/14] Create Decrypt method. Bug with ukr language --- src/main/java/ua/com/javarush/gnew/Main.java | 10 ++++++++++ .../ua/com/javarush/gnew/crypto/Cypher.java | 17 ++++++++--------- .../javarush/gnew/crypto/ProcessSymbol.java | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 src/main/java/ua/com/javarush/gnew/crypto/ProcessSymbol.java diff --git a/src/main/java/ua/com/javarush/gnew/Main.java b/src/main/java/ua/com/javarush/gnew/Main.java index 5906828..6e74d0a 100644 --- a/src/main/java/ua/com/javarush/gnew/Main.java +++ b/src/main/java/ua/com/javarush/gnew/Main.java @@ -24,7 +24,17 @@ public static void main(String[] args) { Path newFilePath = runOptions.getFilePath().resolveSibling(newFileName); fileManager.write(newFilePath, encryptedContent); + } else if (runOptions.getCommand() == Command.DECRYPT) { + + String content = fileManager.read(runOptions.getFilePath()); + String decryptedContent = cypher.decrypt(content, runOptions.getKey()); + String fileName = runOptions.getFilePath().getFileName().toString(); + String newFileName = fileName.substring(0, fileName.length() - 4) + " [DECRYPTED].txt"; + + Path newFilePath = runOptions.getFilePath().resolveSibling(newFileName); + fileManager.write(newFilePath, decryptedContent); } + } catch (Exception e) { System.out.println(e.getMessage()); } diff --git a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java index 77868fa..ee74a93 100644 --- a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java +++ b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java @@ -14,21 +14,20 @@ public String encrypt(String input, int key) { StringBuilder builder = new StringBuilder(); for (char currentChar : chars) { - builder.append(processSymbol(currentChar, key)); + builder.append(ProcessSymbol.processSymbol(currentChar, key)); } return builder.toString(); } + public String decrypt(String input, int key) { + char[] chars = input.toCharArray(); + + StringBuilder builder = new StringBuilder(); - private Character processSymbol(char currentChar, int key) { - ArrayList originalAlphabet = LanguageDetector.detector(currentChar); - if (originalAlphabet == null){ - return currentChar; + for (char currentChar : chars) { + builder.append(ProcessSymbol.processSymbol(currentChar, key)); } - ArrayList rotatedAlphabet = new ArrayList<>(originalAlphabet); - Collections.rotate(rotatedAlphabet, key); - int index = originalAlphabet.indexOf(currentChar); - return rotatedAlphabet.get(index); + return builder.toString(); } } diff --git a/src/main/java/ua/com/javarush/gnew/crypto/ProcessSymbol.java b/src/main/java/ua/com/javarush/gnew/crypto/ProcessSymbol.java new file mode 100644 index 0000000..f14e130 --- /dev/null +++ b/src/main/java/ua/com/javarush/gnew/crypto/ProcessSymbol.java @@ -0,0 +1,19 @@ +package ua.com.javarush.gnew.crypto; + +import ua.com.javarush.gnew.language.LanguageDetector; + +import java.util.ArrayList; +import java.util.Collections; + +public class ProcessSymbol { + protected static Character processSymbol(char currentChar, int key) { + ArrayList originalAlphabet = LanguageDetector.detector(currentChar); + if (originalAlphabet == null){ + return currentChar; + } + ArrayList rotatedAlphabet = new ArrayList<>(originalAlphabet); + Collections.rotate(rotatedAlphabet, key); + int index = originalAlphabet.indexOf(currentChar); + return rotatedAlphabet.get(index); + } +} From 3ea3d944bd1cda99779ab3f53a5d9660533211cd Mon Sep 17 00:00:00 2001 From: DevEvge Date: Mon, 26 Aug 2024 02:46:38 +0300 Subject: [PATCH 04/14] Created method BruteForce. --- src/main/java/ua/com/javarush/gnew/Main.java | 12 +++ .../gnew/crypto/BruteForceResult.java | 19 +++++ .../ua/com/javarush/gnew/crypto/Cypher.java | 74 ++++++++----------- .../com/javarush/gnew/language/Language.java | 6 +- .../gnew/language/LanguageDetector.java | 28 ++++--- .../javarush/gnew/runner/ArgumentsParser.java | 6 +- 6 files changed, 84 insertions(+), 61 deletions(-) create mode 100644 src/main/java/ua/com/javarush/gnew/crypto/BruteForceResult.java diff --git a/src/main/java/ua/com/javarush/gnew/Main.java b/src/main/java/ua/com/javarush/gnew/Main.java index 6e74d0a..332a539 100644 --- a/src/main/java/ua/com/javarush/gnew/Main.java +++ b/src/main/java/ua/com/javarush/gnew/Main.java @@ -1,5 +1,6 @@ package ua.com.javarush.gnew; +import ua.com.javarush.gnew.crypto.BruteForceResult; import ua.com.javarush.gnew.crypto.Cypher; import ua.com.javarush.gnew.file.FileManager; import ua.com.javarush.gnew.runner.ArgumentsParser; @@ -31,6 +32,17 @@ public static void main(String[] args) { String fileName = runOptions.getFilePath().getFileName().toString(); String newFileName = fileName.substring(0, fileName.length() - 4) + " [DECRYPTED].txt"; + Path newFilePath = runOptions.getFilePath().resolveSibling(newFileName); + fileManager.write(newFilePath, decryptedContent); + } else if (runOptions.getCommand() == Command.BRUTEFORCE) { + + String content = fileManager.read(runOptions.getFilePath()); + BruteForceResult result = cypher.bruteforce(content); + String key = result.getKey(); + String decryptedContent = result.getDecryptedContent(); + String fileName = runOptions.getFilePath().getFileName().toString(); + String newFileName = fileName.substring(0, fileName.length() -4) + " [DECRYPRED] " + "Key " + key; + Path newFilePath = runOptions.getFilePath().resolveSibling(newFileName); fileManager.write(newFilePath, decryptedContent); } diff --git a/src/main/java/ua/com/javarush/gnew/crypto/BruteForceResult.java b/src/main/java/ua/com/javarush/gnew/crypto/BruteForceResult.java new file mode 100644 index 0000000..843cd80 --- /dev/null +++ b/src/main/java/ua/com/javarush/gnew/crypto/BruteForceResult.java @@ -0,0 +1,19 @@ +package ua.com.javarush.gnew.crypto; + +public class BruteForceResult { + private String key; + private String decryptedContent; + + public BruteForceResult(String decryptedContent, String key) { + this.decryptedContent = decryptedContent; + this.key = key; + } + + public String getDecryptedContent() { + return decryptedContent; + } + + public String getKey() { + return key; + } +} diff --git a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java index ee74a93..b5a6c72 100644 --- a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java +++ b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java @@ -2,65 +2,51 @@ import ua.com.javarush.gnew.language.LanguageDetector; import java.util.ArrayList; -import java.util.Collections; public class Cypher { + private StringBuilder builder = new StringBuilder(); - - public String encrypt(String input, int key) { + public String encrypt(String content, int key) { key = Math.negateExact(key); - char[] chars = input.toCharArray(); - - StringBuilder builder = new StringBuilder(); - - for (char currentChar : chars) { + char[] contentCharArray = content.toCharArray(); + for (char currentChar : contentCharArray) { builder.append(ProcessSymbol.processSymbol(currentChar, key)); } return builder.toString(); } - public String decrypt(String input, int key) { - char[] chars = input.toCharArray(); - - StringBuilder builder = new StringBuilder(); - - for (char currentChar : chars) { + public String decrypt(String content, int key) { + char[] contentCharArray = content.toCharArray(); + for (char currentChar : contentCharArray) { builder.append(ProcessSymbol.processSymbol(currentChar, key)); } return builder.toString(); } -} - - + public BruteForceResult bruteforce(String content){ + ArrayList wordsForBruteForce = LanguageDetector.detector(content); + int initKey = 1; + + while (true) { + builder.setLength(0); + + char[] contentCharArray = content.toCharArray(); + for (char currentChar : contentCharArray) { + builder.append(ProcessSymbol.processSymbol(currentChar, initKey)); + } + String decryptedText = builder.toString(); + + for (int i = 0; i < wordsForBruteForce.size(); i++) { + if (decryptedText.contains(wordsForBruteForce.get(i))) { + String key = String.valueOf(initKey); + return new BruteForceResult(decryptedText, key); + } + } + initKey++; + } + } +} -// if (!originalAlphabet.contains(currentChar)) { -// return currentChar; -// } -// public String encrypt(String input, int key) { -// key = Math.negateExact(key); -// -// originalAlphabet = LanguageDetector.detector(input); -// ArrayList rotatedAlphabet = new ArrayList<>(originalAlphabet); -// Collections.rotate(rotatedAlphabet, key); -// -// char[] charArray = input.toCharArray(); -// -// StringBuilder builder = new StringBuilder(); -// for (char symbol : charArray) { -// builder.append(processSymbol(symbol, rotatedAlphabet)); -// } -// return builder.toString(); -// } -// -// private Character processSymbol(char symbol, ArrayList rotatedAlphabet) { -// if (!originalAlphabet.contains(symbol)) { -// return symbol; -// } -// int index = originalAlphabet.indexOf(symbol); -// -// return rotatedAlphabet.get(index); -// } \ No newline at end of file diff --git a/src/main/java/ua/com/javarush/gnew/language/Language.java b/src/main/java/ua/com/javarush/gnew/language/Language.java index 9b77f3f..90140a3 100644 --- a/src/main/java/ua/com/javarush/gnew/language/Language.java +++ b/src/main/java/ua/com/javarush/gnew/language/Language.java @@ -20,8 +20,10 @@ public class Language { 'А', 'Б', 'В', 'Г', 'Ґ', 'Д', 'Е', 'Є', 'Ж', 'З', 'И', 'І', 'Ї', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ю', 'Я')); + public static final ArrayList ENG_WORDS_FOR_BRUTEFORCE = new ArrayList<>(Arrays.asList( + "the", "and", "you", "that", "was", "for", "are", "with", "his", "they", "this")); - - + public static final ArrayList UKR_WORDS_FOR_BRUTEFORCE = new ArrayList<>(Arrays.asList( + "щоб", "але", "він", "від", "вони", "бути", "його")); } diff --git a/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java b/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java index b285a80..8b8e194 100644 --- a/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java +++ b/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java @@ -4,16 +4,7 @@ public class LanguageDetector { - public static ArrayList detector(char content){ - -// for (int i = 0; i < content.length(); i++) { -// currentChar = content.charAt(i); -// if (Character.isLetter(currentChar)){ -// break; -// } -// } - if (Language.ALPHABET_ENG.contains(content)) { return Language.ALPHABET_ENG; } else if (Language.ALPHABET_ENG_UPPER.contains(content)){ @@ -23,10 +14,23 @@ public static ArrayList detector(char content){ } else if (Language.ALPHABET_UA_UPPER.contains(content)){ return Language.ALPHABET_UA_UPPER; } - -// TO DO: new return return null; } + public static ArrayList detector(String content){ + + char[] contentCharArray = content.toCharArray(); -} + for (int i = 0; i < contentCharArray.length; i++) { + + char currentChar = Character.toLowerCase(contentCharArray[i]); + + if (Language.ALPHABET_ENG.contains(currentChar)) { + return Language.ENG_WORDS_FOR_BRUTEFORCE; + } else if (Language.ALPHABET_UA.contains(currentChar)) { + return Language.UKR_WORDS_FOR_BRUTEFORCE; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java b/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java index eb42462..ce8fcd5 100644 --- a/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java +++ b/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java @@ -48,9 +48,9 @@ public RunOptions parse(String[] args) { throw new IllegalArgumentException("Command (-e, -d, or -bf) is required"); } - if (key == null) { - throw new IllegalArgumentException("Key is required for encrypt or decrypt mode"); - } +// if (key == null) { +// throw new IllegalArgumentException("Key is required for encrypt or decrypt mode"); +// } if (filePath == null) { throw new IllegalArgumentException("File path is required"); From efc830b7f47206f8d15e195ce0357749ebba5045 Mon Sep 17 00:00:00 2001 From: DevEvge Date: Wed, 28 Aug 2024 12:49:24 +0300 Subject: [PATCH 05/14] Improved ArgumentParser and some other fixes --- .../ua/com/javarush/gnew/crypto/Cypher.java | 6 +- .../gnew/language/LanguageDetector.java | 6 +- .../javarush/gnew/runner/ArgumentsParser.java | 65 ++++++++----------- .../com/javarush/gnew/runner/RunOptions.java | 30 +-------- 4 files changed, 31 insertions(+), 76 deletions(-) diff --git a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java index b5a6c72..58d8aa5 100644 --- a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java +++ b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java @@ -24,7 +24,7 @@ public String decrypt(String content, int key) { } public BruteForceResult bruteforce(String content){ - ArrayList wordsForBruteForce = LanguageDetector.detector(content); + ArrayList wordsForBruteForce = LanguageDetector.detectorBF(content); int initKey = 1; while (true) { @@ -36,8 +36,8 @@ public BruteForceResult bruteforce(String content){ } String decryptedText = builder.toString(); - for (int i = 0; i < wordsForBruteForce.size(); i++) { - if (decryptedText.contains(wordsForBruteForce.get(i))) { + for (String s : wordsForBruteForce) { + if (decryptedText.contains(s)) { String key = String.valueOf(initKey); return new BruteForceResult(decryptedText, key); } diff --git a/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java b/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java index 8b8e194..29d6fa3 100644 --- a/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java +++ b/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java @@ -17,14 +17,10 @@ public static ArrayList detector(char content){ return null; } - public static ArrayList detector(String content){ - + public static ArrayList detectorBF(String content){ char[] contentCharArray = content.toCharArray(); - for (int i = 0; i < contentCharArray.length; i++) { - char currentChar = Character.toLowerCase(contentCharArray[i]); - if (Language.ALPHABET_ENG.contains(currentChar)) { return Language.ENG_WORDS_FOR_BRUTEFORCE; } else if (Language.ALPHABET_UA.contains(currentChar)) { diff --git a/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java b/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java index ce8fcd5..147d983 100644 --- a/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java +++ b/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java @@ -1,62 +1,49 @@ package ua.com.javarush.gnew.runner; - import java.nio.file.Path; +import java.util.HashMap; + public class ArgumentsParser { public RunOptions parse(String[] args) { Command command = null; Integer key = null; Path filePath = null; + HashMap commandHashMap = new HashMap<>(); + commandHashMap.put("-e", Command.ENCRYPT); + commandHashMap.put("-d", Command.DECRYPT); + commandHashMap.put("-bf", Command.BRUTEFORCE); for (int i = 0; i < args.length; i++) { String arg = args[i]; - - switch (arg) { - case "-e": - command = Command.ENCRYPT; - break; - - case "-d": - command = Command.DECRYPT; - break; - - case "-bf": - command = Command.BRUTEFORCE; - break; - case "-k": - if (i + 1 < args.length) { - key = Integer.parseInt(args[++i]); - } else { - throw new IllegalArgumentException("Missing value for key"); - } - break; - - case "-f": - if (i + 1 < args.length) { - filePath = Path.of(args[++i]); - } else { - throw new IllegalArgumentException("Missing value for file"); - } - break; - - default: - throw new IllegalArgumentException("Unknown argument: " + arg); + if (commandHashMap.containsKey(arg)){ + command = commandHashMap.get(arg); + } else if ("-f".equals(arg)){ + if (i + 1 < args.length) { + filePath = Path.of(args[++i]); + } else { + throw new IllegalArgumentException("Missing value for file"); + } + } else if ("-k".equals(arg) && i + 1 Date: Thu, 29 Aug 2024 14:44:52 +0300 Subject: [PATCH 07/14] Improve detector --- .../javarush/gnew/file/ChangeFileName.java | 6 ++-- .../gnew/language/LanguageDetector.java | 29 +++++++++++-------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/ua/com/javarush/gnew/file/ChangeFileName.java b/src/main/java/ua/com/javarush/gnew/file/ChangeFileName.java index 8951399..0a0698c 100644 --- a/src/main/java/ua/com/javarush/gnew/file/ChangeFileName.java +++ b/src/main/java/ua/com/javarush/gnew/file/ChangeFileName.java @@ -9,14 +9,12 @@ public class ChangeFileName { public Path newFileName (RunOptions runOptions, String fileNameEnds){ String fileName = runOptions.getFilePath().getFileName().toString(); String newFileName = fileName.substring(0, fileName.length() - 4) + " ["+ fileNameEnds +"].txt"; - Path newFilePath = runOptions.getFilePath().resolveSibling(newFileName); - return newFilePath; + return runOptions.getFilePath().resolveSibling(newFileName); } public Path newFileNameWithKey (RunOptions runOptions, String fileNameEnds, String key ){ String fileName = runOptions.getFilePath().getFileName().toString(); String newFileName = fileName.substring(0, fileName.length() - 4) + " ["+ fileNameEnds +"] Key " + key +".txt"; - Path newFilePath = runOptions.getFilePath().resolveSibling(newFileName); - return newFilePath; + return runOptions.getFilePath().resolveSibling(newFileName); } } diff --git a/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java b/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java index 29d6fa3..43f6e41 100644 --- a/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java +++ b/src/main/java/ua/com/javarush/gnew/language/LanguageDetector.java @@ -4,23 +4,28 @@ public class LanguageDetector { - public static ArrayList detector(char content){ - if (Language.ALPHABET_ENG.contains(content)) { - return Language.ALPHABET_ENG; - } else if (Language.ALPHABET_ENG_UPPER.contains(content)){ - return Language.ALPHABET_ENG_UPPER; - } else if (Language.ALPHABET_UA.contains(content)){ - return Language.ALPHABET_UA; - } else if (Language.ALPHABET_UA_UPPER.contains(content)){ - return Language.ALPHABET_UA_UPPER; + public static ArrayList detector (char content) { + + if (Character.isLowerCase(content)){ + if (Language.ALPHABET_ENG.contains(content)) { + return Language.ALPHABET_ENG; + } else if (Language.ALPHABET_UA.contains(content)) { + return Language.ALPHABET_UA; + } + } else { + if (Language.ALPHABET_ENG_UPPER.contains(content)) { + return Language.ALPHABET_ENG_UPPER; + } else if (Language.ALPHABET_UA_UPPER.contains(content)) { + return Language.ALPHABET_UA_UPPER; + } } - return null; + return null; } public static ArrayList detectorBF(String content){ char[] contentCharArray = content.toCharArray(); - for (int i = 0; i < contentCharArray.length; i++) { - char currentChar = Character.toLowerCase(contentCharArray[i]); + for (char c : contentCharArray) { + char currentChar = Character.toLowerCase(c); if (Language.ALPHABET_ENG.contains(currentChar)) { return Language.ENG_WORDS_FOR_BRUTEFORCE; } else if (Language.ALPHABET_UA.contains(currentChar)) { From 851d5231a97aa5127685e918795c901536f9c2ef Mon Sep 17 00:00:00 2001 From: DevEvge Date: Mon, 2 Sep 2024 23:56:24 +0300 Subject: [PATCH 08/14] StringBuilder bugFixed --- src/main/java/ua/com/javarush/gnew/crypto/Cypher.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java index 58d8aa5..e228912 100644 --- a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java +++ b/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java @@ -4,9 +4,9 @@ import java.util.ArrayList; public class Cypher { - private StringBuilder builder = new StringBuilder(); public String encrypt(String content, int key) { + StringBuilder builder = new StringBuilder(); key = Math.negateExact(key); char[] contentCharArray = content.toCharArray(); for (char currentChar : contentCharArray) { @@ -16,6 +16,7 @@ public String encrypt(String content, int key) { } public String decrypt(String content, int key) { + StringBuilder builder = new StringBuilder(); char[] contentCharArray = content.toCharArray(); for (char currentChar : contentCharArray) { builder.append(ProcessSymbol.processSymbol(currentChar, key)); @@ -24,6 +25,7 @@ public String decrypt(String content, int key) { } public BruteForceResult bruteforce(String content){ + StringBuilder builder = new StringBuilder(); ArrayList wordsForBruteForce = LanguageDetector.detectorBF(content); int initKey = 1; From db388864f693d3c94213e940fa9a6d2acca8a161 Mon Sep 17 00:00:00 2001 From: DevEvge Date: Mon, 2 Sep 2024 23:57:17 +0300 Subject: [PATCH 09/14] Add GUI without disable fields --- pom.xml | 30 ++++ src/main/java/ua/com/javarush/gnew/Main.java | 79 ++++++--- .../javarush/gnew/controller/Controller.java | 156 ++++++++++++++++++ src/main/resources/UI.fxml | 20 +++ 4 files changed, 263 insertions(+), 22 deletions(-) create mode 100644 src/main/java/ua/com/javarush/gnew/controller/Controller.java create mode 100644 src/main/resources/UI.fxml diff --git a/pom.xml b/pom.xml index d0d9295..50f290f 100644 --- a/pom.xml +++ b/pom.xml @@ -12,9 +12,22 @@ 17 17 UTF-8 + 22 + + + org.openjfx + javafx-controls + ${javafx.version} + + + org.openjfx + javafx-fxml + ${javafx.version} + + org.junit.jupiter junit-jupiter @@ -25,11 +38,28 @@ + + org.openjfx + javafx-maven-plugin + 0.0.8 + + ua.com.javarush.gnew.Main + + + + + run + + + + + org.apache.maven.plugins maven-surefire-plugin 3.4.0 + org.apache.maven.plugins maven-surefire-report-plugin diff --git a/src/main/java/ua/com/javarush/gnew/Main.java b/src/main/java/ua/com/javarush/gnew/Main.java index 72a5062..1faee97 100644 --- a/src/main/java/ua/com/javarush/gnew/Main.java +++ b/src/main/java/ua/com/javarush/gnew/Main.java @@ -1,5 +1,10 @@ package ua.com.javarush.gnew; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; import ua.com.javarush.gnew.crypto.BruteForceResult; import ua.com.javarush.gnew.crypto.Cypher; import ua.com.javarush.gnew.file.ChangeFileName; @@ -8,36 +13,66 @@ import ua.com.javarush.gnew.runner.Command; import ua.com.javarush.gnew.runner.RunOptions; +import java.io.IOException; import java.nio.file.Path; -public class Main { +public class Main extends Application { - public static Cypher cypher = new Cypher(); - public static FileManager fileManager = new FileManager(); - public static ArgumentsParser argumentsParser = new ArgumentsParser(); - public static ChangeFileName changeFileName = new ChangeFileName(); - public static void main(String[] args) { - RunOptions runOptions = argumentsParser.parse(args); - String content = fileManager.read(runOptions.getFilePath()); + @Override + public void start(Stage primaryStage) throws IOException { + Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("UI.fxml")); + primaryStage.setTitle("Hello"); + primaryStage.setScene(new Scene(root)); + primaryStage.show(); + } + + public static Cypher cypher = new Cypher(); + public static FileManager fileManager = new FileManager(); + public static ArgumentsParser argumentsParser = new ArgumentsParser(); + public static ChangeFileName changeFileName = new ChangeFileName(); + + public static void main (String[]args){ + + if (args.length == 0) { + launch(); + } - try { - if (runOptions.getCommand() == Command.ENCRYPT) { + RunOptions runOptions = argumentsParser.parse(args); + String content = fileManager.read(runOptions.getFilePath()); - Path newFilePath = changeFileName.newFileName(runOptions, "ENCRYPTED"); - fileManager.write(newFilePath, cypher.encrypt(content, runOptions.getKey())); - } else if (runOptions.getCommand() == Command.DECRYPT) { + try { + if (runOptions.getCommand() == Command.ENCRYPT) { - Path newFilePath = changeFileName.newFileName(runOptions, "DECRYPTED"); - fileManager.write(newFilePath, cypher.decrypt(content, runOptions.getKey())); - } else if (runOptions.getCommand() == Command.BRUTEFORCE) { + Path newFilePath = changeFileName.newFileName(runOptions, "ENCRYPTED"); + fileManager.write(newFilePath, cypher.encrypt(content, runOptions.getKey())); + } else if (runOptions.getCommand() == Command.DECRYPT) { - BruteForceResult result = cypher.bruteforce(content); - Path newFilePath = changeFileName.newFileNameWithKey(runOptions, "DECRYPTED", result.getKey()); - fileManager.write(newFilePath, result.getDecryptedContent()); + Path newFilePath = changeFileName.newFileName(runOptions, "DECRYPTED"); + fileManager.write(newFilePath, cypher.decrypt(content, runOptions.getKey())); + } else if (runOptions.getCommand() == Command.BRUTEFORCE) { + + BruteForceResult result = cypher.bruteforce(content); + Path newFilePath = changeFileName.newFileNameWithKey(runOptions, "DECRYPTED", result.getKey()); + fileManager.write(newFilePath, result.getDecryptedContent()); + } + } catch (Exception e) { + System.out.println(e.getMessage()); } - } catch (Exception e) { - System.out.println(e.getMessage()); } } -} \ No newline at end of file +// launch(); + + + + + + + + + + + + + + diff --git a/src/main/java/ua/com/javarush/gnew/controller/Controller.java b/src/main/java/ua/com/javarush/gnew/controller/Controller.java new file mode 100644 index 0000000..5491962 --- /dev/null +++ b/src/main/java/ua/com/javarush/gnew/controller/Controller.java @@ -0,0 +1,156 @@ +package ua.com.javarush.gnew.controller; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Button; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.AnchorPane; +import javafx.stage.FileChooser; +import javafx.stage.Stage; +import ua.com.javarush.gnew.crypto.BruteForceResult; +import ua.com.javarush.gnew.crypto.Cypher; +import ua.com.javarush.gnew.file.ChangeFileName; +import ua.com.javarush.gnew.file.FileManager; +import ua.com.javarush.gnew.runner.Command; +import ua.com.javarush.gnew.runner.RunOptions; + +import java.awt.*; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Path; +import java.util.ResourceBundle; + +public class Controller implements Initializable { + + private FileChooser fileChooser = new FileChooser(); + private ChangeFileName changeFileName = new ChangeFileName(); + private FileManager fileManager = new FileManager(); + private Cypher cypher = new Cypher(); + + + private String selectedPath; + + @FXML + private Label actualPathLabel; + + @FXML + private AnchorPane pane; + + @FXML + private ComboBox dropdown; + + @FXML + private Button openNewFileDir; + + @FXML + private Button choesePathButton; + + @FXML + private TextField inputKey; + + @FXML + private Button doCypherButton; + + @FXML + private Label newFilePath; + + @FXML + private Label status; + + @FXML + void choeseButtonCliced(ActionEvent event) { + File selectedFile = fileChooser.showOpenDialog(new Stage()); + actualPathLabel.setText(selectedFile.toString()); + } + + @FXML + void keyInputSelected(KeyEvent event) { + } + + @FXML + void doCypher(ActionEvent event) { + boolean actualPathEmpty = actualPathLabel.getText().isEmpty(); + boolean dropdownEmpty = dropdown.getSelectionModel().isEmpty(); + + if (!actualPathEmpty && !dropdownEmpty) { + if (dropdown.getValue().equals("Encrypt")) { + Command command = Command.ENCRYPT; + Integer key = Integer.parseInt(inputKey.getText()); + Path filePath = Path.of(actualPathLabel.getText()); + selectedPath = actualPathLabel.getText(); + RunOptions runOptions = new RunOptions(command, key, filePath); + String content = fileManager.read(runOptions.getFilePath()); + Path newFilePath = changeFileName.newFileName(runOptions, "ENCRYPTED"); + fileManager.write(newFilePath, cypher.encrypt(content, runOptions.getKey())); + + } else if (dropdown.getValue().equals("Decrypt")) { + Command command = Command.DECRYPT; + Integer key = Integer.parseInt(inputKey.getText()); + Path filePath = Path.of(actualPathLabel.getText()); + selectedPath = actualPathLabel.getText(); + RunOptions runOptions = new RunOptions(command, key, filePath); + String content = fileManager.read(runOptions.getFilePath()); + Path newFilePath = changeFileName.newFileName(runOptions, "DECRYPTED"); + fileManager.write(newFilePath, cypher.decrypt(content, runOptions.getKey())); + + } else if (dropdown.getValue().equals("Bruteforce")) { + Command command = Command.BRUTEFORCE; + Integer key = Integer.parseInt(inputKey.getText()); + Path filePath = Path.of(actualPathLabel.getText()); + selectedPath = actualPathLabel.getText(); + RunOptions runOptions = new RunOptions(command, key, filePath); + String content = fileManager.read(runOptions.getFilePath()); + BruteForceResult result = cypher.bruteforce(content); + Path newFilePath = changeFileName.newFileNameWithKey(runOptions, "DECRYPTED", result.getKey()); + fileManager.write(newFilePath, result.getDecryptedContent()); + } + } else { + status.setText("Поля не заполнены"); + } + actualPathLabel.setText(""); + status.setText("Done"); + + } + + @FXML + void methodChoesed(ActionEvent event) { +// Выключение отображение поля "Key" если выбран брутфорс + if (dropdown.getSelectionModel().getSelectedItem().equals("Bruteforce")) { + inputKey.setVisible(false); + } else { + inputKey.setVisible(true); + } + } + + @FXML + void newFileOpenPath(ActionEvent event) { + File file = new File(selectedPath); + try { + Desktop.getDesktop().open(file.getParentFile()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @FXML + void paneMouseClicked(MouseEvent event) { + if (inputKey.isFocused()) { + pane.requestFocus(); + } + } + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + String[] items = {"Encrypt", "Decrypt", "Bruteforce"}; + dropdown.getItems().addAll(items); + + fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Текстовые файлы", "*.txt")); + fileChooser.setInitialDirectory(new File("C:\\Users\\evgen\\Desktop")); + } +} diff --git a/src/main/resources/UI.fxml b/src/main/resources/UI.fxml new file mode 100644 index 0000000..4c606c6 --- /dev/null +++ b/src/main/resources/UI.fxml @@ -0,0 +1,20 @@ + + + + + + + + + + + +