Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
1e9fc76
change readme.md
lgt77 Aug 24, 2024
73acc24
change readme.md
lgt77 Aug 24, 2024
669718e
Merge remote-tracking branch 'origin/main'
lgt77 Aug 24, 2024
a5e3655
Added Enum Alphabet
lgt77 Aug 26, 2024
f5bae0d
Added class Encrypt.java
lgt77 Aug 26, 2024
0f84392
Added class Decrypt.java
lgt77 Aug 26, 2024
3f70aa7
changed Main.java for quick check
lgt77 Aug 26, 2024
4a9bb0a
add to Enum Alphabet another element
lgt77 Aug 26, 2024
f1d2963
deleted constructor in Decrypt.java and Encrypt.java
lgt77 Aug 26, 2024
1fcb116
rename ENUM Alphabet.java to ConstantsForCipher.java
lgt77 Aug 27, 2024
394dc8e
finalise class Decrypt.java (cheng all methods)
lgt77 Aug 27, 2024
7cbaed9
finalise class Encrypt.java (cheng all methods)
lgt77 Aug 27, 2024
11f85e1
add class Cipher.java
lgt77 Aug 30, 2024
8e8802b
add class KeyManager.java
lgt77 Aug 30, 2024
22e85c0
add class SymbolsBelonging.java
lgt77 Aug 30, 2024
a38b283
change class Decrypt.java
lgt77 Aug 30, 2024
088a0ad
change class Encrypt.java
lgt77 Aug 30, 2024
a0b615e
change class Main.java
lgt77 Aug 30, 2024
0b55418
change class FileManager.java
lgt77 Aug 30, 2024
ff5bc0f
create class KeyManager.java
lgt77 Sep 1, 2024
5fdc378
create class Cryptor.java
lgt77 Sep 1, 2024
e09162c
create class Cryptor.java
lgt77 Sep 1, 2024
09c3e3f
create class Rotator.java
lgt77 Sep 1, 2024
1f0d4ce
create class SymbolsBelonging.java
lgt77 Sep 1, 2024
c149462
rename class ConstantsForCryptor
lgt77 Sep 1, 2024
3de15ef
change class KeyManager.java
lgt77 Sep 1, 2024
4b98ac2
renaming
lgt77 Sep 1, 2024
b394db7
renaming
lgt77 Sep 1, 2024
a889546
add try - catch
lgt77 Sep 1, 2024
5159e5f
change KeyManager.java for negative key
lgt77 Sep 1, 2024
c338abd
change for new classes
lgt77 Sep 1, 2024
d901259
Merge remote-tracking branch 'origin/main'
lgt77 Sep 1, 2024
470fc65
deleted class
lgt77 Sep 1, 2024
2d962af
created classes FileNameTag and NewFileNamePath
lgt77 Sep 2, 2024
93e7b3e
created classes FileNameTag and NewFileNamePath
lgt77 Sep 4, 2024
9787aa0
changed if for key (null pointer exception)
lgt77 Sep 8, 2024
0c572b1
minor changes for ease of writing code
lgt77 Sep 8, 2024
1f39f43
added a constructor with one argument (for brute force)
lgt77 Sep 8, 2024
b4e9b9f
virtually unchanged
lgt77 Sep 8, 2024
bfc585a
added object of class KeyManager
lgt77 Sep 8, 2024
90fb29c
added method keySelection(), to add a key when using the bruteforce c…
lgt77 Sep 8, 2024
fd3a038
added method keySelection(), to add a key when using the bruteforce c…
lgt77 Sep 8, 2024
2f77de2
in class FileNameTag changed name method key() to getKey()
lgt77 Sep 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 37 additions & 5 deletions readme.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,60 @@
# CAESAR CIPHER
author Serhii Lahuta

## Run the program
# ENGLISH
### Run the program

### Commands:
#### Commands:

```
-e Encrypt
-d Decrypt
-bf Brute force
```

### Arguments:
#### Arguments:
```
-k Key
-f File path
```

### Example:
#### Example:
```
-e -k 1 -f "/path/to/file.txt" - Encrypt file with key 1
-d -k 5 -f "/path/to/file [ENCRYPTED].txt" - Decrypt file with key 5
-bf -f "/path/to/file [ENCRYPTED].txt" - Brute force decrypt file
```

### Argument could be in any order
#### Argument could be in any order
```
-e -f "/path/to/file.txt" -k 1
```

# УКРАЇНСЬКА
### Запуск програми

#### Команди:

```
-e Зашифрувати
-d Розшифрувати
-bf Підбір коду
```

#### Аргуметни:
```
-k Ключ
-f Шлях до файлу
```

#### Приклад:
```
-e -k 1 -f "/path/to/file.txt" - Зашифрувати файл з ключем 1
-d -k 5 -f "/path/to/file [ENCRYPTED].txt" - Розшифрувати файл з ключем 5
-bf -f "/path/to/file [ENCRYPTED].txt" - Розшифрувати файл методом підбору ключа
```

#### Аргументи можуть бути у будь-якому порядку
```
-e -f "/path/to/file.txt" -k 1
```
31 changes: 19 additions & 12 deletions src/main/java/ua/com/javarush/gnew/Main.java
Original file line number Diff line number Diff line change
@@ -1,32 +1,39 @@
package ua.com.javarush.gnew;

import ua.com.javarush.gnew.crypto.Cypher;
import ua.com.javarush.gnew.crypto.Cryptor;
import ua.com.javarush.gnew.crypto.KeyManager;
import ua.com.javarush.gnew.file.FileManager;
import ua.com.javarush.gnew.file.NewFileNamePath;
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.Path;

public class Main {
public static void main(String[] args) {
Cypher cypher = new Cypher();
FileManager fileManager = new FileManager();
ArgumentsParser argumentsParser = new ArgumentsParser();
RunOptions runOptions = argumentsParser.parse(args);
KeyManager keyManager = new KeyManager();

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";

Path newFilePath = runOptions.getFilePath().resolveSibling(newFileName);
fileManager.write(newFilePath, encryptedContent);
String content = fileManager.read(runOptions.getFilePath());
Cryptor cryptor;
if(runOptions.getCommand() == Command.ENCRYPT || runOptions.getCommand() == Command.DECRYPT){
int key = keyManager.getKey(runOptions);
cryptor = new Cryptor(content, key);
String cryptoContent = cryptor.cypher();
NewFileNamePath path = new NewFileNamePath();
fileManager.write(path.newPath(runOptions) , cryptoContent);
} else if (runOptions.getCommand() == Command.BRUTEFORCE) {
cryptor = new Cryptor(content, keyManager.keySelection(runOptions));
String cryptoContent = cryptor.cypher();
NewFileNamePath path = new NewFileNamePath();
fileManager.write(path.newPath(runOptions) , cryptoContent);
}
Comment on lines +21 to 32
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contains duplicates. See here how to get rid of it.

} catch (Exception e) {
System.out.println(e.getMessage());
}


}
}
22 changes: 22 additions & 0 deletions src/main/java/ua/com/javarush/gnew/crypto/ConstantsForCryptor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ua.com.javarush.gnew.crypto;

import java.util.ArrayList;
import java.util.Arrays;

public enum ConstantsForCryptor {
ALPHABET(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'))),
PUNCTUATION (new ArrayList<>(Arrays.asList(' ', ',', '!', '?', ':', ';', '-',
'(', ')', '[', ']', '{', '}','#', '.', '@', '*', '+', '=', '_', '&',
'\\', '/', '₴', '~', '`')));

private final ArrayList<Character> CHARS_ARRAY_CONSTANT;

ConstantsForCryptor(ArrayList<Character> CHARS_ARRAY_CONSTANS) {
this.CHARS_ARRAY_CONSTANT = CHARS_ARRAY_CONSTANS;
}
public ArrayList<Character> getCharsArrayConstant() {
return this.CHARS_ARRAY_CONSTANT;
}
}
63 changes: 63 additions & 0 deletions src/main/java/ua/com/javarush/gnew/crypto/Cryptor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package ua.com.javarush.gnew.crypto;


import java.util.HashMap;
import java.util.Map;

public class Cryptor {

private String input ;
private int key;

public Cryptor(String input, int key){
this.input =input ;
this.key = key;
}


public Cryptor(String input){
this.input = input;
}

public String cypher() {

Rotator rotator = new Rotator();

char[] charsArray = input.toCharArray();

StringBuilder sb = new StringBuilder();
SymbolsBelonging symBel = new SymbolsBelonging();
for(char symbol : charsArray) {
if(ConstantsForCryptor.ALPHABET.getCharsArrayConstant().contains(Character.toUpperCase(symbol))){
sb.append(symBel.symbolsBelongingABC(symbol, rotator.rotateAlphabet(key)));
}else if (ConstantsForCryptor.PUNCTUATION.getCharsArrayConstant().contains(symbol)) {
sb.append(symBel.symbolsBelongingPUNCTUATION(symbol, rotator.rotatePunctuation(key)));
}else {
sb.append(symbol);
}
}
return sb.toString();
}

public char MostFrequentChar(){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the approach


char[] charsArray = input.toCharArray();

Map<Character, Integer> frequencyMap = new HashMap<>();
for(char symbol : charsArray){
frequencyMap.put(symbol, frequencyMap.getOrDefault(symbol, 0) + 1);
}

char mostFrequentChar = '\0';
int maxFrequency = 0;

for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {
if (entry.getValue() > maxFrequency) {
mostFrequentChar = entry.getKey();
maxFrequency = entry.getValue();
}
}
return mostFrequentChar;
}

}
33 changes: 0 additions & 33 deletions src/main/java/ua/com/javarush/gnew/crypto/Cypher.java

This file was deleted.

29 changes: 29 additions & 0 deletions src/main/java/ua/com/javarush/gnew/crypto/KeyManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package ua.com.javarush.gnew.crypto;

import ua.com.javarush.gnew.file.FileManager;
import ua.com.javarush.gnew.runner.RunOptions;
import ua.com.javarush.gnew.runner.Command;


public class KeyManager {

public int getKey(RunOptions runOptions){
if (runOptions.getCommand() == Command.ENCRYPT) {
return (runOptions.getKey() % 26) * -1;
}else if (runOptions.getCommand() == Command.DECRYPT) {
return runOptions.getKey() % 26;
} else if (runOptions.getCommand() == Command.BRUTEFORCE) {
return keySelection(runOptions);
}else {
return 0;
}
}

public int keySelection(RunOptions runOptions) {
FileManager fileManager = new FileManager();
String input =fileManager.read(runOptions.getFilePath());
Cryptor cryptor = new Cryptor(input);
return ConstantsForCryptor.PUNCTUATION.getCharsArrayConstant().indexOf(cryptor.MostFrequentChar());
}

}
22 changes: 22 additions & 0 deletions src/main/java/ua/com/javarush/gnew/crypto/Rotator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ua.com.javarush.gnew.crypto;

import java.util.ArrayList;
import java.util.Collections;

public class Rotator {

protected ArrayList<Character> rotateAlphabet(int key){


ArrayList<Character> rotateAlphabet = new ArrayList<>(ConstantsForCryptor.ALPHABET.getCharsArrayConstant());
Collections.rotate(rotateAlphabet, key);
return rotateAlphabet;
}

protected ArrayList<Character> rotatePunctuation(Integer key){
ArrayList<Character> rotatePunctuation = new ArrayList<>(ConstantsForCryptor.PUNCTUATION.getCharsArrayConstant());
Collections.rotate(rotatePunctuation, key);
return rotatePunctuation;
}

}
18 changes: 18 additions & 0 deletions src/main/java/ua/com/javarush/gnew/crypto/SymbolsBelonging.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ua.com.javarush.gnew.crypto;

import java.util.ArrayList;

public class SymbolsBelonging {
protected Character symbolsBelongingABC(char symbol, ArrayList<Character> rotateAlphabet) {
int index = ConstantsForCryptor.ALPHABET.getCharsArrayConstant().indexOf(Character.toUpperCase(symbol));
if(Character.isLowerCase(symbol)){
return Character.toLowerCase(rotateAlphabet.get(index));
}
return rotateAlphabet.get(index);
}

protected Character symbolsBelongingPUNCTUATION(char symbol, ArrayList<Character> rotatePunctuation){
int index = ConstantsForCryptor.PUNCTUATION.getCharsArrayConstant().indexOf(symbol);
return rotatePunctuation.get(index);
}
}
Comment on lines +5 to +18
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually we already have similar method.
Character. isAlphabetic()
For punctuation, you could use Pattern.matches("\\p{IsPunctuation}", str)

18 changes: 14 additions & 4 deletions src/main/java/ua/com/javarush/gnew/file/FileManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,21 @@
import java.nio.file.Path;

public class FileManager {
public String read(Path filePath) throws IOException {
return Files.readString(filePath);
public String read(Path filePath) {
String content = null;
try {
content = Files.readString(filePath);
} catch (IOException e) {
System.out.println("Ошибка при чтении файла: " + e.getMessage());
}
return content;
}

public void write(Path filePath, String content) throws IOException {
Files.writeString(filePath, content);
public void write(Path filePath, String content) {
try {
Files.writeString(filePath, content);
} catch (IOException e) {
System.out.println("Ошибка при записи в файл: " + e.getMessage());
}
}
}
39 changes: 39 additions & 0 deletions src/main/java/ua/com/javarush/gnew/file/FileNameTag.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package ua.com.javarush.gnew.file;

import ua.com.javarush.gnew.crypto.KeyManager;
import ua.com.javarush.gnew.runner.Command;
import ua.com.javarush.gnew.runner.RunOptions;

public class FileNameTag {

protected String fileNameNotExtension(RunOptions runOptions){
String fileName = runOptions.getFilePath().getFileName().toString();
int lastDotIndex = fileName.lastIndexOf('.');
return fileName.substring(0, lastDotIndex);
}

protected String nameTag(RunOptions runOptions){
StringBuilder tag = new StringBuilder();
if(runOptions.getCommand() == Command.ENCRYPT){
tag.append("[ENCRYPTED]");
} else if (runOptions.getCommand() == Command.DECRYPT) {
tag.append("[DECRYPTED]");
} else if (runOptions.getCommand() == Command.BRUTEFORCE) {
tag.append("[DECRYPTED] [WITH KEY ");
KeyManager keyManager = new KeyManager();
tag.append(keyManager.getKey(runOptions));
tag.append("]");
}
return tag.toString();
}

protected String fileNameTag(RunOptions runOptions){
StringBuilder sb = new StringBuilder();
sb.append(fileNameNotExtension(runOptions));
sb.append(nameTag(runOptions));
return sb.toString() + ".txt";

}


}
12 changes: 12 additions & 0 deletions src/main/java/ua/com/javarush/gnew/file/NewFileNamePath.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ua.com.javarush.gnew.file;

import ua.com.javarush.gnew.runner.RunOptions;
import java.nio.file.Path;

public class NewFileNamePath {

public Path newPath(RunOptions runOptions) {
FileNameTag tag = new FileNameTag();
return Path.of(tag.fileNameTag(runOptions));
}
}
Loading