From d06592b9815afe41dab34b894e9983e3c68cb2d6 Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Wed, 4 Sep 2024 21:52:21 +0200 Subject: [PATCH 01/13] encrypt and decrypt ready --- src/main/java/ua/com/javarush/gnew/Main.java | 37 +++++++++++++------ .../ua/com/javarush/gnew/crypto/Cypher.java | 33 ----------------- .../ua/com/javarush/gnew/cypher/Cypher.java | 36 ++++++++++++++++++ .../com/javarush/gnew/file/FileManager.java | 15 -------- .../gnew/fileManager/FileManager.java | 31 ++++++++++++++++ .../com/javarush/gnew/language/Alphabet.java | 24 ++++++++++++ .../com/javarush/gnew/language/Language.java | 12 ------ .../javarush/gnew/runner/ArgumentsParser.java | 3 +- .../com/javarush/gnew/runner/RunOptions.java | 2 +- 9 files changed, 119 insertions(+), 74 deletions(-) delete mode 100644 src/main/java/ua/com/javarush/gnew/crypto/Cypher.java create mode 100644 src/main/java/ua/com/javarush/gnew/cypher/Cypher.java delete mode 100644 src/main/java/ua/com/javarush/gnew/file/FileManager.java create mode 100644 src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java create mode 100644 src/main/java/ua/com/javarush/gnew/language/Alphabet.java delete mode 100644 src/main/java/ua/com/javarush/gnew/language/Language.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..67f79ae 100644 --- a/src/main/java/ua/com/javarush/gnew/Main.java +++ b/src/main/java/ua/com/javarush/gnew/Main.java @@ -1,12 +1,14 @@ package ua.com.javarush.gnew; -import ua.com.javarush.gnew.crypto.Cypher; -import ua.com.javarush.gnew.file.FileManager; +import ua.com.javarush.gnew.cypher.Cypher; +import ua.com.javarush.gnew.fileManager.FileManager; import ua.com.javarush.gnew.runner.ArgumentsParser; -import ua.com.javarush.gnew.runner.Command; import ua.com.javarush.gnew.runner.RunOptions; +import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; public class Main { public static void main(String[] args) { @@ -15,16 +17,29 @@ public static void main(String[] args) { ArgumentsParser argumentsParser = new ArgumentsParser(); RunOptions runOptions = argumentsParser.parse(args); - try { - if (runOptions.getCommand() == Command.ENCRYPT) { - String content = fileManager.read(runOptions.getFilePath()); - String encryptedContent = cypher.encrypt(content, runOptions.getKey()); - String fileName = runOptions.getFilePath().getFileName().toString(); - String newFileName = fileName.substring(0, fileName.length() - 4) + " [ENCRYPTED].txt"; + List linesRead; + List linesWritten = new ArrayList<>(); - Path newFilePath = runOptions.getFilePath().resolveSibling(newFileName); - fileManager.write(newFilePath, encryptedContent); + try { + linesRead = fileManager.read(runOptions.getFilePath()); + switch (runOptions.getCommand()) { + case ENCRYPT: + for (String lineRead : linesRead) { + linesWritten.add(cypher.encrypt(lineRead, runOptions.getKey())); + } + break; + case DECRYPT: + for (String lineRead : linesRead) { + linesWritten.add(cypher.decrypt(lineRead, runOptions.getKey())); + } + break; } + Path resultFile = Path.of(fileManager.getNewPath(runOptions.getFilePath().toString(), runOptions.getCommand())); + if (Files.notExists(resultFile)) { + Files.createFile(resultFile); + } + fileManager.write(resultFile, linesWritten); + } 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 deleted file mode 100644 index 2b01247..0000000 --- a/src/main/java/ua/com/javarush/gnew/crypto/Cypher.java +++ /dev/null @@ -1,33 +0,0 @@ -package ua.com.javarush.gnew.crypto; - -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(); - - 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); - } -} diff --git a/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java new file mode 100644 index 0000000..b692368 --- /dev/null +++ b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java @@ -0,0 +1,36 @@ +package ua.com.javarush.gnew.cypher; + +import ua.com.javarush.gnew.language.Alphabet; + +import java.util.ArrayList; + +public class Cypher { + + public String encrypt(String text, int key) { + + ArrayList rotatedUppercase = Alphabet.rotateAlphabet(Alphabet.ENGLISH_UPPERCASE, key); + ArrayList rotatedLowercase = Alphabet.rotateAlphabet(Alphabet.ENGLISH_LOWERCASE, key); + StringBuilder result = new StringBuilder(); + + for (int i = 0; i < text.length(); i++) { + char oneChar = text.charAt(i); // беремо символ з тексту + int index = Alphabet.ENGLISH_LOWERCASE.indexOf(oneChar); // шукаємо його в алфавіті lowercase + if (index != -1) { // якщо знайшли + result.append(rotatedLowercase.get(index)); // шифруємо і додаємо до результату + } else { // якщо немає + index = Alphabet.ENGLISH_UPPERCASE.indexOf(oneChar); // шукаємо його в алфавіті uppercase + if (index != -1) { // якщо знайшли + result.append(rotatedUppercase.get(index)); // шифруємо і додаємо до результату + } else { // якщо не знайшли в жодному з двох алфавітів, це спеціальний символ + result.append(text.charAt(i)); // НЕ шифруємо і просто додаємо + } + } + } + return result.toString(); + } + + public String decrypt(String text, int key) { + // decrypt робить те саме, що й encrypt, тільки з протилежним значенням ключа + return encrypt(text, -key); + } +} \ No newline at end of file diff --git a/src/main/java/ua/com/javarush/gnew/file/FileManager.java b/src/main/java/ua/com/javarush/gnew/file/FileManager.java deleted file mode 100644 index d60744c..0000000 --- a/src/main/java/ua/com/javarush/gnew/file/FileManager.java +++ /dev/null @@ -1,15 +0,0 @@ -package ua.com.javarush.gnew.file; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -public class FileManager { - public String read(Path filePath) throws IOException { - return Files.readString(filePath); - } - - public void write(Path filePath, String content) throws IOException { - Files.writeString(filePath, content); - } -} diff --git a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java new file mode 100644 index 0000000..3a4e6b5 --- /dev/null +++ b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java @@ -0,0 +1,31 @@ +package ua.com.javarush.gnew.fileManager; + +import ua.com.javarush.gnew.runner.Command; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +public class FileManager { + + public List read(Path path) throws IOException { + return Files.readAllLines(path); + } + + public void write (Path path, List lines) throws IOException { + Files.write(path, lines); + } + + public String getNewPath(String path, Command command) { + String markerOfAction = switch (command) { + case DECRYPT: + yield " [DECRYPTED].txt"; + case ENCRYPT: + yield " [ENCRYPTED].txt"; + default: + yield ".txt"; + }; + return path.substring(0, path.length() - 4) + markerOfAction; + } +} \ No newline at end of file diff --git a/src/main/java/ua/com/javarush/gnew/language/Alphabet.java b/src/main/java/ua/com/javarush/gnew/language/Alphabet.java new file mode 100644 index 0000000..b6eae21 --- /dev/null +++ b/src/main/java/ua/com/javarush/gnew/language/Alphabet.java @@ -0,0 +1,24 @@ +package ua.com.javarush.gnew.language; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + +public abstract class Alphabet { + + public static final ArrayList ENGLISH_UPPERCASE = 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 ENGLISH_LOWERCASE = 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 ArrayList rotateAlphabet(ArrayList originalAlphabet, int key) { + + ArrayList rotatedAlphabet = new ArrayList<>(originalAlphabet); + + Collections.rotate(rotatedAlphabet, -key); + + return rotatedAlphabet; + } +} \ 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 deleted file mode 100644 index 067dd2f..0000000 --- a/src/main/java/ua/com/javarush/gnew/language/Language.java +++ /dev/null @@ -1,12 +0,0 @@ -package ua.com.javarush.gnew.language; - -import java.util.ArrayList; - -public abstract class Language { - - private final ArrayList alphabet; - - public Language(ArrayList alphabet) { - this.alphabet = alphabet; - } -} 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..f0563b2 100644 --- a/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java +++ b/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java @@ -58,5 +58,4 @@ public RunOptions parse(String[] args) { return new RunOptions(command, key, filePath); } - -} +} \ No newline at end of file diff --git a/src/main/java/ua/com/javarush/gnew/runner/RunOptions.java b/src/main/java/ua/com/javarush/gnew/runner/RunOptions.java index 45e700b..1a730b3 100644 --- a/src/main/java/ua/com/javarush/gnew/runner/RunOptions.java +++ b/src/main/java/ua/com/javarush/gnew/runner/RunOptions.java @@ -51,4 +51,4 @@ public String toString() { ", filePath=" + filePath + '}'; } -} +} \ No newline at end of file From 6f773d21f76180f0cbc04c375364d2e85a762939 Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Wed, 4 Sep 2024 22:21:29 +0200 Subject: [PATCH 02/13] changed getNewPath method in fileManager --- src/main/java/ua/com/javarush/gnew/Main.java | 3 ++- .../ua/com/javarush/gnew/fileManager/FileManager.java | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/ua/com/javarush/gnew/Main.java b/src/main/java/ua/com/javarush/gnew/Main.java index 67f79ae..c8fd794 100644 --- a/src/main/java/ua/com/javarush/gnew/Main.java +++ b/src/main/java/ua/com/javarush/gnew/Main.java @@ -34,7 +34,8 @@ public static void main(String[] args) { } break; } - Path resultFile = Path.of(fileManager.getNewPath(runOptions.getFilePath().toString(), runOptions.getCommand())); + + Path resultFile = fileManager.getNewPath(runOptions.getFilePath(), runOptions.getCommand()); if (Files.notExists(resultFile)) { Files.createFile(resultFile); } diff --git a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java index 3a4e6b5..9121863 100644 --- a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java +++ b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java @@ -13,11 +13,12 @@ public List read(Path path) throws IOException { return Files.readAllLines(path); } - public void write (Path path, List lines) throws IOException { + public void write(Path path, List lines) throws IOException { Files.write(path, lines); } - public String getNewPath(String path, Command command) { + public Path getNewPath(Path path, Command command) { + String markerOfAction = switch (command) { case DECRYPT: yield " [DECRYPTED].txt"; @@ -26,6 +27,10 @@ public String getNewPath(String path, Command command) { default: yield ".txt"; }; - return path.substring(0, path.length() - 4) + markerOfAction; + + String originalPath = path.toString(); + String newPath = originalPath.substring(0, originalPath.length() - 4) + markerOfAction; + + return Path.of(newPath); } } \ No newline at end of file From 30d53690868cf965a279bea36d45460923563078 Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Thu, 5 Sep 2024 01:14:01 +0200 Subject: [PATCH 03/13] added common words to Alphabet and private methods to Cypher (getWords and checkForCommonWords) --- .../ua/com/javarush/gnew/cypher/Cypher.java | 32 +++++++++++++++++++ .../com/javarush/gnew/language/Alphabet.java | 7 ++++ 2 files changed, 39 insertions(+) diff --git a/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java index b692368..6244a19 100644 --- a/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java +++ b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java @@ -33,4 +33,36 @@ public String decrypt(String text, int key) { // decrypt робить те саме, що й encrypt, тільки з протилежним значенням ключа return encrypt(text, -key); } + + public String bruteForce(String text) { + // TO DO : brute force in a while loop + boolean decrypted = checkForCommonWords(text); + return null; + } + + private boolean checkForCommonWords(String text) { + boolean containsCommonWords = false; + ArrayList words = getWords(text); + + for (String word : words) { + if (Alphabet.ENGLISH_COMMON_WORDS.contains(word.toLowerCase())) { + containsCommonWords = true; + } + } + + return containsCommonWords; + } + + private static ArrayList getWords(String text) { + String[] words = text.replaceAll("[^a-zA-Z ]", "").split("\\s+"); + + ArrayList wordList = new ArrayList<>(); + for (String word : words) { + if (!word.isEmpty()) { + wordList.add(word); + } + } + + return wordList; + } } \ No newline at end of file diff --git a/src/main/java/ua/com/javarush/gnew/language/Alphabet.java b/src/main/java/ua/com/javarush/gnew/language/Alphabet.java index b6eae21..b634d71 100644 --- a/src/main/java/ua/com/javarush/gnew/language/Alphabet.java +++ b/src/main/java/ua/com/javarush/gnew/language/Alphabet.java @@ -12,6 +12,13 @@ public abstract class Alphabet { public static final ArrayList ENGLISH_LOWERCASE = 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 ENGLISH_COMMON_WORDS = new ArrayList<>(Arrays.asList( + "the", "and", "for", "you", "that", "not", "with", "but", "his", "they", + "are", "this", "have", "from", "were", "will", "all", "one", "said", "who", + "out", "what", "when", "can", "your", "there", "about", "them", "some", "her", + "make", "like", "time", "know", "take", "come", "than", "more", "could", "into", + "just", "over", "only", "also", "very", "after", "most", "even", "back", "good", "hello" + )); public static ArrayList rotateAlphabet(ArrayList originalAlphabet, int key) { From 8c0bb9faaee39cb3b5a0b7a7c16bf045a37c1798 Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Thu, 5 Sep 2024 01:36:25 +0200 Subject: [PATCH 04/13] fixed Main, FileManager and ArgumentsParser for working with bruteforce mode, edited common words in Alphabet, bruteforce works partially --- src/main/java/ua/com/javarush/gnew/Main.java | 5 +++++ .../java/ua/com/javarush/gnew/cypher/Cypher.java | 14 ++++++++++---- .../com/javarush/gnew/fileManager/FileManager.java | 4 ++-- .../ua/com/javarush/gnew/language/Alphabet.java | 10 +++++----- .../com/javarush/gnew/runner/ArgumentsParser.java | 1 + 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/ua/com/javarush/gnew/Main.java b/src/main/java/ua/com/javarush/gnew/Main.java index c8fd794..d0bab35 100644 --- a/src/main/java/ua/com/javarush/gnew/Main.java +++ b/src/main/java/ua/com/javarush/gnew/Main.java @@ -33,6 +33,11 @@ public static void main(String[] args) { linesWritten.add(cypher.decrypt(lineRead, runOptions.getKey())); } break; + case BRUTEFORCE: + for (String lineRead : linesRead) { + linesWritten.add(cypher.bruteForce(lineRead)); + } + break; } Path resultFile = fileManager.getNewPath(runOptions.getFilePath(), runOptions.getCommand()); diff --git a/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java index 6244a19..bb9ad86 100644 --- a/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java +++ b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java @@ -35,18 +35,24 @@ public String decrypt(String text, int key) { } public String bruteForce(String text) { - // TO DO : brute force in a while loop - boolean decrypted = checkForCommonWords(text); - return null; + String result; + for (int i = 1; i < 26; i++) { + result = encrypt(text, i); + if (checkForCommonWords(result)) { + return result; + } + } + return text; } private boolean checkForCommonWords(String text) { - boolean containsCommonWords = false; ArrayList words = getWords(text); + boolean containsCommonWords = false; for (String word : words) { if (Alphabet.ENGLISH_COMMON_WORDS.contains(word.toLowerCase())) { containsCommonWords = true; + break; } } diff --git a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java index 9121863..448db02 100644 --- a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java +++ b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java @@ -24,8 +24,8 @@ public Path getNewPath(Path path, Command command) { yield " [DECRYPTED].txt"; case ENCRYPT: yield " [ENCRYPTED].txt"; - default: - yield ".txt"; + case BRUTEFORCE: + yield " [BRUTE_FORCE].txt"; }; String originalPath = path.toString(); diff --git a/src/main/java/ua/com/javarush/gnew/language/Alphabet.java b/src/main/java/ua/com/javarush/gnew/language/Alphabet.java index b634d71..b2d001a 100644 --- a/src/main/java/ua/com/javarush/gnew/language/Alphabet.java +++ b/src/main/java/ua/com/javarush/gnew/language/Alphabet.java @@ -13,11 +13,11 @@ public abstract class Alphabet { '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 ENGLISH_COMMON_WORDS = new ArrayList<>(Arrays.asList( - "the", "and", "for", "you", "that", "not", "with", "but", "his", "they", - "are", "this", "have", "from", "were", "will", "all", "one", "said", "who", - "out", "what", "when", "can", "your", "there", "about", "them", "some", "her", - "make", "like", "time", "know", "take", "come", "than", "more", "could", "into", - "just", "over", "only", "also", "very", "after", "most", "even", "back", "good", "hello" + "the", "be", "to", "of", "and", "in", "that", "have", "for", "not", + "with", "he", "as", "you", "do", "this", "but", "his", "by", "from", + "they", "we", "say", "her", "she", "or", "will", "my", "one", "all", + "would", "there", "their", "what", "so", "up", "out", "if", "about", + "who", "get", "which", "go", "me", "it", "can", "has", "had", "are", "hello" )); public static ArrayList rotateAlphabet(ArrayList originalAlphabet, int key) { 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 f0563b2..fab53d4 100644 --- a/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java +++ b/src/main/java/ua/com/javarush/gnew/runner/ArgumentsParser.java @@ -22,6 +22,7 @@ public RunOptions parse(String[] args) { case "-bf": command = Command.BRUTEFORCE; + key = 0; break; case "-k": if (i + 1 < args.length) { From 62adeac937eb7a0013dad462f581b7e3f4865812 Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Thu, 5 Sep 2024 04:17:09 +0200 Subject: [PATCH 05/13] brute force works. TO DO: add key value to the name of bf-encrypted file --- src/main/java/ua/com/javarush/gnew/Main.java | 6 ++-- .../ua/com/javarush/gnew/cypher/Cypher.java | 35 +++++++++++++++---- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/main/java/ua/com/javarush/gnew/Main.java b/src/main/java/ua/com/javarush/gnew/Main.java index d0bab35..859937a 100644 --- a/src/main/java/ua/com/javarush/gnew/Main.java +++ b/src/main/java/ua/com/javarush/gnew/Main.java @@ -7,8 +7,7 @@ import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class Main { public static void main(String[] args) { @@ -34,8 +33,9 @@ public static void main(String[] args) { } break; case BRUTEFORCE: + int key = cypher.calculateKey(linesRead); for (String lineRead : linesRead) { - linesWritten.add(cypher.bruteForce(lineRead)); + linesWritten.add(cypher.decrypt(lineRead, key)); } break; } diff --git a/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java index bb9ad86..fb601b2 100644 --- a/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java +++ b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java @@ -3,6 +3,7 @@ import ua.com.javarush.gnew.language.Alphabet; import java.util.ArrayList; +import java.util.List; public class Cypher { @@ -34,15 +35,35 @@ public String decrypt(String text, int key) { return encrypt(text, -key); } - public String bruteForce(String text) { - String result; - for (int i = 1; i < 26; i++) { - result = encrypt(text, i); - if (checkForCommonWords(result)) { - return result; + public int calculateKey(List text) { + String encrypted = ""; + String decrypted = ""; + + for (String line : text) { + encrypted = line; + for (int i = 1; i < 26; i++) { + decrypted = decrypt(line, i); + if (checkForCommonWords(decrypted)) { + break; + } + } + break; + } + + int firstLetterIndex = 0; + for (int i = 0; i < decrypted.length(); i++) { + if (Character.isLetter(decrypted.charAt(i))) { + firstLetterIndex = i; + break; } } - return text; + + int indexEncrypted = Alphabet.ENGLISH_LOWERCASE.indexOf(Character.toLowerCase(encrypted.charAt(firstLetterIndex))); + int indexDecrypted = Alphabet.ENGLISH_LOWERCASE.indexOf(Character.toLowerCase(decrypted.charAt(firstLetterIndex))); + if (indexEncrypted < indexDecrypted) { + indexEncrypted = indexEncrypted + 26; + } + return indexEncrypted - indexDecrypted; } private boolean checkForCommonWords(String text) { From d9a5e03a6c0df3a21521a5a521548c7400217e3d Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Thu, 5 Sep 2024 04:45:47 +0200 Subject: [PATCH 06/13] added key value to the name of bf-encrypted file --- src/main/java/ua/com/javarush/gnew/Main.java | 5 ++++- .../ua/com/javarush/gnew/fileManager/FileManager.java | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/ua/com/javarush/gnew/Main.java b/src/main/java/ua/com/javarush/gnew/Main.java index 859937a..a841d54 100644 --- a/src/main/java/ua/com/javarush/gnew/Main.java +++ b/src/main/java/ua/com/javarush/gnew/Main.java @@ -18,6 +18,7 @@ public static void main(String[] args) { List linesRead; List linesWritten = new ArrayList<>(); + Path resultFile = null; try { linesRead = fileManager.read(runOptions.getFilePath()); @@ -26,21 +27,23 @@ public static void main(String[] args) { for (String lineRead : linesRead) { linesWritten.add(cypher.encrypt(lineRead, runOptions.getKey())); } + resultFile = fileManager.getNewPath(runOptions.getFilePath(), runOptions.getCommand()); break; case DECRYPT: for (String lineRead : linesRead) { linesWritten.add(cypher.decrypt(lineRead, runOptions.getKey())); } + resultFile = fileManager.getNewPath(runOptions.getFilePath(), runOptions.getCommand()); break; case BRUTEFORCE: int key = cypher.calculateKey(linesRead); for (String lineRead : linesRead) { linesWritten.add(cypher.decrypt(lineRead, key)); } + resultFile = fileManager.getNewPath(runOptions.getFilePath(), key); break; } - Path resultFile = fileManager.getNewPath(runOptions.getFilePath(), runOptions.getCommand()); if (Files.notExists(resultFile)) { Files.createFile(resultFile); } diff --git a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java index 448db02..0e21496 100644 --- a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java +++ b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java @@ -24,13 +24,18 @@ public Path getNewPath(Path path, Command command) { yield " [DECRYPTED].txt"; case ENCRYPT: yield " [ENCRYPTED].txt"; - case BRUTEFORCE: - yield " [BRUTE_FORCE].txt"; + default: + yield ".txt"; }; String originalPath = path.toString(); String newPath = originalPath.substring(0, originalPath.length() - 4) + markerOfAction; + return Path.of(newPath); + } + public Path getNewPath(Path path, int key) { + String originalPath = path.toString(); + String newPath = originalPath.substring(0, originalPath.length() - 4) + " [BRUTE_FORCE] " + key + ".txt"; return Path.of(newPath); } } \ No newline at end of file From 53265b3b703cd3508ca74023f836b5dddab532cb Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Thu, 5 Sep 2024 04:55:52 +0200 Subject: [PATCH 07/13] fixed write() in FileManager, so that there is no empty line at the end --- .../java/ua/com/javarush/gnew/fileManager/FileManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java index 0e21496..388e4b2 100644 --- a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java +++ b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java @@ -14,7 +14,9 @@ public List read(Path path) throws IOException { } public void write(Path path, List lines) throws IOException { - Files.write(path, lines); + for (String str : lines) { + Files.writeString(path, str); + } } public Path getNewPath(Path path, Command command) { From 3beed0a555db39c32f34e8398dd09eba0006ca41 Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Thu, 5 Sep 2024 05:40:08 +0200 Subject: [PATCH 08/13] fixed FileManager again, so it copies everything --- .../ua/com/javarush/gnew/fileManager/FileManager.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java index 388e4b2..9d7d416 100644 --- a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java +++ b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java @@ -2,6 +2,8 @@ import ua.com.javarush.gnew.runner.Command; +import java.io.BufferedWriter; +import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -14,8 +16,13 @@ public List read(Path path) throws IOException { } public void write(Path path, List lines) throws IOException { - for (String str : lines) { - Files.writeString(path, str); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(path.toString()))) { + for (int i = 0; i < lines.size(); i++) { + writer.write(lines.get(i)); + if (i < lines.size() - 1) { + writer.newLine(); + } + } } } From 5349ecf3fc36cb4b326d243410cd25bc4118f434 Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Thu, 5 Sep 2024 05:56:49 +0200 Subject: [PATCH 09/13] FileManager.write() does not pass the test due to difference in line separators --- .../ua/com/javarush/gnew/fileManager/FileManager.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java index 9d7d416..9e3e6b0 100644 --- a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java +++ b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java @@ -2,8 +2,6 @@ import ua.com.javarush.gnew.runner.Command; -import java.io.BufferedWriter; -import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -16,13 +14,8 @@ public List read(Path path) throws IOException { } public void write(Path path, List lines) throws IOException { - try (BufferedWriter writer = new BufferedWriter(new FileWriter(path.toString()))) { - for (int i = 0; i < lines.size(); i++) { - writer.write(lines.get(i)); - if (i < lines.size() - 1) { - writer.newLine(); - } - } + for (String line : lines) { + Files.writeString(path, line); } } From d0c0075444bf0b8437d9f035b3dc7aba3a63dc3b Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Thu, 5 Sep 2024 06:48:41 +0200 Subject: [PATCH 10/13] readme.md updated --- readme.md | 24 ++++++++++++++++++- .../ua/com/javarush/gnew/cypher/Cypher.java | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index a17a9ac..1222e9c 100644 --- a/readme.md +++ b/readme.md @@ -25,4 +25,26 @@ ### Argument could be in any order ``` -e -f "/path/to/file.txt" -k 1 -``` \ No newline at end of file +``` + +## About the project + +### Implemented +- Program compiled in jar format and released on GitHub. +- Program can be run from the console by passing arguments. +- Program implements has three options: [ENCRYPT, DECRYPT, BRUTE_FORCE]. +- Program implements only one option at a time. +- Program writes the result into a new file, which name contains a label according to command used. +- Program can be used English language only. +- Only letters of the latin alphabet are encrypted. +- After decryption, the text *mostly* has the same formatting as the original file (spaces, indents, symbols, upper and lower case letters). + +### Not implemented +- Program does not work for Ukrainian or any other languages. +- Program does not encode any symbols except latin letters. +- Program does not have UI. +- 2 tests failed: After decryption, the line separators are different from the originals. +- Code simplicity: Cypher.calculateKey() method has over 20 lines. +### Extra +After hours of troubleshooting, I have not found a way to correctly convey the line separators into the output file. +The issue is most likely in the FileManager.write() method. Any feedback appreciated. :) \ No newline at end of file diff --git a/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java index fb601b2..7dc8add 100644 --- a/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java +++ b/src/main/java/ua/com/javarush/gnew/cypher/Cypher.java @@ -80,7 +80,7 @@ private boolean checkForCommonWords(String text) { return containsCommonWords; } - private static ArrayList getWords(String text) { + private ArrayList getWords(String text) { String[] words = text.replaceAll("[^a-zA-Z ]", "").split("\\s+"); ArrayList wordList = new ArrayList<>(); From dacc7a5525822e1717b32353e1dcc6b6b644cd0e Mon Sep 17 00:00:00 2001 From: Antonina Z <97844300+tojnya@users.noreply.github.com> Date: Thu, 5 Sep 2024 07:23:34 +0200 Subject: [PATCH 11/13] Update readme.md --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 1222e9c..98ae605 100644 --- a/readme.md +++ b/readme.md @@ -32,7 +32,7 @@ ### Implemented - Program compiled in jar format and released on GitHub. - Program can be run from the console by passing arguments. -- Program implements has three options: [ENCRYPT, DECRYPT, BRUTE_FORCE]. +- Program implements three options: [ENCRYPT, DECRYPT, BRUTE_FORCE]. - Program implements only one option at a time. - Program writes the result into a new file, which name contains a label according to command used. - Program can be used English language only. @@ -47,4 +47,4 @@ - Code simplicity: Cypher.calculateKey() method has over 20 lines. ### Extra After hours of troubleshooting, I have not found a way to correctly convey the line separators into the output file. -The issue is most likely in the FileManager.write() method. Any feedback appreciated. :) \ No newline at end of file +The issue is most likely in the FileManager.write() method. Any feedback appreciated. :) From 89a41b9533cbc53828a944f3c5cdb1934ce6c92b Mon Sep 17 00:00:00 2001 From: Antonina Z Date: Fri, 6 Sep 2024 00:20:55 +0200 Subject: [PATCH 12/13] The project is done: found and solved the issue in Files.write(); split Cypher.calculateKey() into 2 simpler methods; updated readme.md. --- META-INF/MANIFEST.MF | 3 ++ out/artifacts/GNEW_M1_FP_jar/GNEW-M1-FP.jar | Bin 0 -> 12892 bytes readme.md | 26 ++++++++++-------- src/main/java/ua/com/javarush/gnew/Main.java | 2 +- .../ua/com/javarush/gnew/cypher/Cypher.java | 9 ++++-- .../gnew/fileManager/FileManager.java | 6 ++-- 6 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 META-INF/MANIFEST.MF create mode 100644 out/artifacts/GNEW_M1_FP_jar/GNEW-M1-FP.jar diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000..e523bee --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: ua.com.javarush.gnew.Main + diff --git a/out/artifacts/GNEW_M1_FP_jar/GNEW-M1-FP.jar b/out/artifacts/GNEW_M1_FP_jar/GNEW-M1-FP.jar new file mode 100644 index 0000000000000000000000000000000000000000..d75d678dffb0cab46b664942647cd4e926e66f60 GIT binary patch literal 12892 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

b(FP$b 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 text) { + public int bruteForceKey(List text) { String encrypted = ""; String decrypted = ""; for (String line : text) { encrypted = line; - for (int i = 1; i < 26; i++) { + for (int i = 0; i < 26; i++) { decrypted = decrypt(line, i); if (checkForCommonWords(decrypted)) { break; @@ -50,6 +50,10 @@ public int calculateKey(List text) { break; } + return calculateKey(encrypted, decrypted); + } + + private int calculateKey(String encrypted, String decrypted) { int firstLetterIndex = 0; for (int i = 0; i < decrypted.length(); i++) { if (Character.isLetter(decrypted.charAt(i))) { @@ -60,6 +64,7 @@ public int calculateKey(List text) { int indexEncrypted = Alphabet.ENGLISH_LOWERCASE.indexOf(Character.toLowerCase(encrypted.charAt(firstLetterIndex))); int indexDecrypted = Alphabet.ENGLISH_LOWERCASE.indexOf(Character.toLowerCase(decrypted.charAt(firstLetterIndex))); + if (indexEncrypted < indexDecrypted) { indexEncrypted = indexEncrypted + 26; } diff --git a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java index 9e3e6b0..ab0f68d 100644 --- a/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java +++ b/src/main/java/ua/com/javarush/gnew/fileManager/FileManager.java @@ -14,13 +14,11 @@ public List read(Path path) throws IOException { } public void write(Path path, List lines) throws IOException { - for (String line : lines) { - Files.writeString(path, line); - } + String content = String.join("\n", lines); + Files.writeString(path, content); } public Path getNewPath(Path path, Command command) { - String markerOfAction = switch (command) { case DECRYPT: yield " [DECRYPTED].txt"; From 255288008375ce8055ef857e454734ea3e8f1616 Mon Sep 17 00:00:00 2001 From: oleksandr-jr <116897595+oleksandr-jr@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:03:59 +0200 Subject: [PATCH 13/13] Update readme.md --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 1d15385..46c698f 100644 --- a/readme.md +++ b/readme.md @@ -50,3 +50,4 @@ is appended to the file name as well. - Program does not encode any special or blank symbols (latin letters only). - Program does not work with CLI. - Program does not have UI. +