From 1a2d05559c676662bf880945f3ed913de526cc3d Mon Sep 17 00:00:00 2001 From: Nikita Karpov Date: Thu, 13 Dec 2018 22:52:31 +0300 Subject: [PATCH 1/5] -add enc; -add dec; --- .idea/misc.xml | 2 +- src/crypto/Crypto.java | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index a165cb3..cbb200f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/src/crypto/Crypto.java b/src/crypto/Crypto.java index 51d57b7..7851fd1 100644 --- a/src/crypto/Crypto.java +++ b/src/crypto/Crypto.java @@ -5,6 +5,39 @@ public class Crypto { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); - // write your code here + + String target = scanner.nextLine(); +// String message = "Wabc"; + String message = scanner.nextLine(); + int offset = scanner.nextInt(); + + if(target.equals("enc")){ + System.out.println(enc(message, offset)); + } else if(target.equals("dec")){ + System.out.println(dec(message, offset)); + } + + } + public static String enc(String originalStr, int offset){ + return offsetAll(originalStr, offset); + } + + public static String dec(String originalStr, int offset){ + return offsetAll(originalStr, -offset); + } + public static String offsetAll(String originalStr, int offset){ + final int lettersStar = 97; + final int lettersAmount = 26; + + StringBuilder out = new StringBuilder(); + char[] letters = new char[originalStr.length()]; + originalStr.getChars(0, originalStr.length(), letters, 0 ); + + for (int letter : letters){ + letter = (letter + offset); + out.append((char)letter); + } + + return out.toString(); } } From 6c7b8f772fb144087700d4186455ad497ce7a8f5 Mon Sep 17 00:00:00 2001 From: Nikita Karpov Date: Fri, 14 Dec 2018 20:45:21 +0300 Subject: [PATCH 2/5] Using command-line arguments --- src/crypto/Crypto.java | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/crypto/Crypto.java b/src/crypto/Crypto.java index 7851fd1..1a5cf53 100644 --- a/src/crypto/Crypto.java +++ b/src/crypto/Crypto.java @@ -6,10 +6,22 @@ public class Crypto { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); - String target = scanner.nextLine(); -// String message = "Wabc"; - String message = scanner.nextLine(); - int offset = scanner.nextInt(); + String target; + if(args.length > 1 && args[0].equals("-mode")){ + target = args[1]; + } else{ + target = "enc"; + } + + String message; + int offset; + if(args.length == 6 && args[4].equals("-data")){ + message = args[5]; + offset= Integer.parseInt(args[3]); + } else{ + message = scanner.nextLine(); + offset = scanner.nextInt(); + } if(target.equals("enc")){ System.out.println(enc(message, offset)); From 3bd4e9eb6ce83d48d27d102ef2bfe87527da4d22 Mon Sep 17 00:00:00 2001 From: Nikita Karpov Date: Mon, 17 Dec 2018 22:13:39 +0300 Subject: [PATCH 3/5] Working with files --- src/crypto/Crypto.java | 77 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 10 deletions(-) diff --git a/src/crypto/Crypto.java b/src/crypto/Crypto.java index 1a5cf53..994d0cc 100644 --- a/src/crypto/Crypto.java +++ b/src/crypto/Crypto.java @@ -1,35 +1,92 @@ package crypto; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLOutput; +import java.util.Arrays; +import java.util.List; import java.util.Scanner; public class Crypto { public static void main(String[] args) { + final String MODE = "-mode"; + final String KEY= "-key"; + final String DATA= "-data"; + final String IN = "-in"; + final String OUT = "-out"; + Scanner scanner = new Scanner(System.in); String target; - if(args.length > 1 && args[0].equals("-mode")){ - target = args[1]; + String message = null; + String processed = null; + int offset; + int index = -1; + List argsList = Arrays.asList(args); + + /*Mode*/ + index = argsList.indexOf(MODE); + if(index != -1){ + target = args[index+1]; } else{ target = "enc"; } - String message; - int offset; - if(args.length == 6 && args[4].equals("-data")){ - message = args[5]; - offset= Integer.parseInt(args[3]); + /*Input*/ + index = argsList.indexOf(IN); + if(index != -1){ + try { + message = new String(Files.readAllBytes(Paths.get(args[index + 1]))); + } catch (IOException e) { + System.out.println("Not found file " + args[index + 1]); + } + } else{ + index = argsList.indexOf(DATA); + if(index != -1 && message != null){ + message = args[index + 1]; + } else{ + System.out.println("Enter data:"); + message = scanner.nextLine(); + } + } + + /*Key*/ + index = argsList.indexOf(KEY); + if(index != -1){ + offset = Integer.parseInt(args[index+1]); } else{ - message = scanner.nextLine(); + System.out.println("Enter key:"); offset = scanner.nextInt(); + } if(target.equals("enc")){ - System.out.println(enc(message, offset)); + processed = enc(message, offset); } else if(target.equals("dec")){ - System.out.println(dec(message, offset)); + processed = dec(message, offset); + } + + /*Output*/ + index = argsList.indexOf(OUT); + if(index != -1){ + File outputFile = new File(args[index + 1]); + try (FileWriter writer = new FileWriter(outputFile)) { + writer.write(processed); + } catch (IOException e) { + System.out.println("Cannot write output message to file"); + } + } else{ + System.out.println(processed); } + } + public Crypto() { } + public static String enc(String originalStr, int offset){ return offsetAll(originalStr, offset); } From cd008b884a683833f511cdcaeee5f24c787676ab Mon Sep 17 00:00:00 2001 From: Nikita Karpov Date: Sat, 22 Dec 2018 21:57:32 +0300 Subject: [PATCH 4/5] -implimented strategy pattern for chiper algorithm; -separated caesar algorithm; -implimented morse algorithm enc/dec ; --- src/crypto/Crypto.java | 132 +++++++----- src/crypto/algorithms/CaesarAlgorithm.java | 28 +++ src/crypto/algorithms/CryptoAlgorithm.java | 8 + src/crypto/algorithms/MorseAlgorithm.java | 59 +++++ src/crypto/algorithms/MorseAlphabet.java | 216 +++++++++++++++++++ src/crypto/algorithms/VigenereAlgorithm.java | 13 ++ 6 files changed, 407 insertions(+), 49 deletions(-) create mode 100644 src/crypto/algorithms/CaesarAlgorithm.java create mode 100644 src/crypto/algorithms/CryptoAlgorithm.java create mode 100644 src/crypto/algorithms/MorseAlgorithm.java create mode 100644 src/crypto/algorithms/MorseAlphabet.java create mode 100644 src/crypto/algorithms/VigenereAlgorithm.java diff --git a/src/crypto/Crypto.java b/src/crypto/Crypto.java index 994d0cc..92be081 100644 --- a/src/crypto/Crypto.java +++ b/src/crypto/Crypto.java @@ -1,5 +1,9 @@ package crypto; +import crypto.algorithms.CaesarAlgorithm; +import crypto.algorithms.CryptoAlgorithm; +import crypto.algorithms.MorseAlgorithm; + import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; @@ -12,42 +16,51 @@ import java.util.Scanner; public class Crypto { + private CryptoAlgorithm algorithm; + private static List argsList; public static void main(String[] args) { final String MODE = "-mode"; final String KEY= "-key"; final String DATA= "-data"; final String IN = "-in"; final String OUT = "-out"; + final String ALG = "-alg"; Scanner scanner = new Scanner(System.in); - String target; + String target = "enc"; String message = null; String processed = null; - int offset; + String chiperKey; + String alg = "caesar"; int index = -1; - List argsList = Arrays.asList(args); + String value; + argsList = Arrays.asList(args); + + /*Algorithm*/ + value = findArgValue(ALG); + alg = (value != null) ? value: alg; + final Crypto app = new Crypto(alg); /*Mode*/ - index = argsList.indexOf(MODE); - if(index != -1){ - target = args[index+1]; - } else{ - target = "enc"; + value = findArgValue(MODE); + if(value != null){ + target = value; } /*Input*/ - index = argsList.indexOf(IN); - if(index != -1){ + value = findArgValue(IN); + if(value != null){ try { - message = new String(Files.readAllBytes(Paths.get(args[index + 1]))); + message = readFromFile(value); } catch (IOException e) { - System.out.println("Not found file " + args[index + 1]); + e.printStackTrace(); + System.exit(0); } } else{ - index = argsList.indexOf(DATA); - if(index != -1 && message != null){ - message = args[index + 1]; + value = findArgValue(DATA); + if(value != null){ + message = value; } else{ System.out.println("Enter data:"); message = scanner.nextLine(); @@ -55,58 +68,79 @@ public static void main(String[] args) { } /*Key*/ - index = argsList.indexOf(KEY); - if(index != -1){ - offset = Integer.parseInt(args[index+1]); + value = findArgValue(KEY); + if(value != null){ + chiperKey = value; } else{ System.out.println("Enter key:"); - offset = scanner.nextInt(); + chiperKey = scanner.nextLine(); } - if(target.equals("enc")){ - processed = enc(message, offset); - } else if(target.equals("dec")){ - processed = dec(message, offset); + /*Get message*/ + if(target.equals("dec")){ + processed = app.dec(message, chiperKey); + } else{ + processed = app.enc(message, chiperKey); } /*Output*/ - index = argsList.indexOf(OUT); - if(index != -1){ - File outputFile = new File(args[index + 1]); - try (FileWriter writer = new FileWriter(outputFile)) { - writer.write(processed); + value = findArgValue(OUT); + if(value != null){ + try { + writeToFile(value, processed); } catch (IOException e) { - System.out.println("Cannot write output message to file"); + e.printStackTrace(); + System.exit(0); } } else{ System.out.println(processed); } } - - public Crypto() { + public static String findArgValue(String key){ + int index = argsList.indexOf(key); + if(index != -1){ + return argsList.get(index+1); + } + return null; } - public static String enc(String originalStr, int offset){ - return offsetAll(originalStr, offset); + public Crypto(String alg) { + switch (alg) { + case "caesar": + this.algorithm = new CaesarAlgorithm(); + break; + case "morse": + this.algorithm = new MorseAlgorithm(); + break; + default: + this.algorithm = new CaesarAlgorithm(); + } } - - public static String dec(String originalStr, int offset){ - return offsetAll(originalStr, -offset); + private String enc(String data, String key){ + return algorithm.enc(data, key); } - public static String offsetAll(String originalStr, int offset){ - final int lettersStar = 97; - final int lettersAmount = 26; - - StringBuilder out = new StringBuilder(); - char[] letters = new char[originalStr.length()]; - originalStr.getChars(0, originalStr.length(), letters, 0 ); - - for (int letter : letters){ - letter = (letter + offset); - out.append((char)letter); + private String dec(String data, String key){ + return algorithm.dec(data, key); + } + private static String readFromFile(String filename) throws IOException { + try { + return new String(Files.readAllBytes(Paths.get(filename))); + } catch (IOException e) { + System.out.println("Not found file " + filename); + throw e; + } + } + private static void writeToFile(String filename, String data) throws IOException { + File outputFile = new File(filename); + try (FileWriter writer = new FileWriter(outputFile)) { + writer.write(data); + System.out.println("Success! Write to: " + outputFile.getName()); + } catch (IOException e) { + System.out.println("Cannot write output message to file"); + throw e; } - - return out.toString(); } + + } diff --git a/src/crypto/algorithms/CaesarAlgorithm.java b/src/crypto/algorithms/CaesarAlgorithm.java new file mode 100644 index 0000000..9a095b9 --- /dev/null +++ b/src/crypto/algorithms/CaesarAlgorithm.java @@ -0,0 +1,28 @@ +package crypto.algorithms; + +public class CaesarAlgorithm implements CryptoAlgorithm { + @Override + public String enc(String originalStr, String key){ + int offset = Integer.parseInt(key); + return offsetAll(originalStr, offset); + } + + @Override + public String dec(String originalStr, String key){ + int offset = Integer.parseInt(key); + return offsetAll(originalStr, -offset); + } + + private String offsetAll(String originalStr, int offset){ + StringBuilder out = new StringBuilder(); + char[] letters = new char[originalStr.length()]; + originalStr.getChars(0, originalStr.length(), letters, 0 ); + + for (int letter : letters){ + letter = (letter + offset); + out.append((char)letter); + } + + return out.toString(); + } +} diff --git a/src/crypto/algorithms/CryptoAlgorithm.java b/src/crypto/algorithms/CryptoAlgorithm.java new file mode 100644 index 0000000..5c8ec4c --- /dev/null +++ b/src/crypto/algorithms/CryptoAlgorithm.java @@ -0,0 +1,8 @@ +package crypto.algorithms; + +import java.util.Optional; + +public interface CryptoAlgorithm { + String enc(String offset, String key); + String dec(String offset, String key); +} diff --git a/src/crypto/algorithms/MorseAlgorithm.java b/src/crypto/algorithms/MorseAlgorithm.java new file mode 100644 index 0000000..286364f --- /dev/null +++ b/src/crypto/algorithms/MorseAlgorithm.java @@ -0,0 +1,59 @@ +package crypto.algorithms; + +public class MorseAlgorithm implements CryptoAlgorithm { + /*available punctuation*/ + private static final String PUNCTUATIONS = ".,!?"; + + @Override + public String enc(String message, String key) { + StringBuilder out = new StringBuilder(); + char[] letters = new char[message.length()]; + message.getChars(0, message.length(), letters, 0 ); + + MorseAlphabet morseCode; + String strLetter; + for (char letter : letters){ + strLetter = Character.toString(letter); + if(Character.isLetter(letter)){ + morseCode = MorseAlphabet.valueOf(strLetter.toUpperCase()); + out.append(morseCode.toString()); + } else if(Character.isDigit(letter)) { + morseCode = MorseAlphabet.NUMBER; + out.append(morseCode.toString(strLetter)); + }else if(MorseAlgorithm.PUNCTUATIONS.contains(Character.toString(letter))){ + morseCode = MorseAlphabet.PUNCTUATION; + out.append(morseCode.toString(strLetter)); + }else{ + out.append(letter); + } + if(letter == ' '){ + out.append(" "); + } else{ + out.append(' '); + } + + } + return out.toString(); + } + + @Override + public String dec(String message, String key) { + StringBuffer out = new StringBuffer(); + MorseAlphabet[] alphabet = MorseAlphabet.values(); + String[] words = message.split(" "); + String[] letters; + String morseCode; + for (int i = 0; i < words.length; i++){ + letters = words[i].split(" "); + for (int j=0;j< letters.length;j++){ + morseCode = letters[j]; + out.append(MorseAlphabet.getValue(morseCode)); + } + if(i != words.length - 1){ + out.append(' '); + } + } + return out.toString(); + } + +} diff --git a/src/crypto/algorithms/MorseAlphabet.java b/src/crypto/algorithms/MorseAlphabet.java new file mode 100644 index 0000000..6e28c09 --- /dev/null +++ b/src/crypto/algorithms/MorseAlphabet.java @@ -0,0 +1,216 @@ +package crypto.algorithms; + +public enum MorseAlphabet { +// static MorseAlphabet va + A { + @Override + public String toString() { + return ".-"; + } + }, + B { + @Override + public String toString() { + return "-..."; + } + }, + C { + @Override + public String toString() { + return "-.-."; + } + }, + D { + @Override + public String toString() { + return "−.."; + } + }, + E { + @Override + public String toString() { + return "."; + } + }, + F { + @Override + public String toString() { + return "..-."; + } + }, + G { + @Override + public String toString() { + return "--."; + } + }, + H { + @Override + public String toString() { + return "...."; + } + }, + I { + @Override + public String toString() { + return ".."; + } + }, + J { + @Override + public String toString() { + return ".---"; + } + }, + K { + @Override + public String toString() { + return "-.-"; + } + }, + L { + @Override + public String toString() { + return ".-.."; + } + }, + M { + @Override + public String toString() { + return "--"; + } + }, + N { + @Override + public String toString() { + return "-."; + } + }, + O { + @Override + public String toString() { + return "---"; + } + }, + P { + @Override + public String toString() { + return ".--."; + } + }, + Q { + @Override + public String toString() { + return "--.-"; + } + }, + R { + @Override + public String toString() { + return ".-."; + } + }, + S { + @Override + public String toString() { + return "..."; + } + }, + T { + @Override + public String toString() { + return "-"; + } + }, + U { + @Override + public String toString() { + return "..-"; + } + }, + V { + @Override + public String toString() { + return "...-"; + } + }, + W { + @Override + public String toString() { + return ".--"; + } + }, + X { + @Override + public String toString() { + return "-..-"; + } + }, + Y { + @Override + public String toString() { + return "-.--"; + } + }, + Z { + @Override + public String toString() { + return "--.."; + } + }, + NUMBER{ + public String toString(String num) { + return new String[]{ + "−−−−−", + ".−−−−", + "..---", + "...--", + "....-", + ".....", + "-....", + "--...", + "---..", + "----.", + "-----", + }[Integer.parseInt(num)]; + } + }, + PUNCTUATION{ + public String toString(String punct) { + switch (punct){ + case ".": return ".-.-.-"; + case ",": return "--..--"; + case "?": return "..--.."; + case "!": return "-.-.--"; + default: return ""; + } + } + }; + String toString(String num){ + return toString(); + } + static String getValue(String code){ + MorseAlphabet[] alphabet = MorseAlphabet.values(); + for(int i=0; i < alphabet.length; i++){ + if(alphabet[i] == MorseAlphabet.NUMBER){ + for(int j = 0; j < 10; j++){ + if(MorseAlphabet.NUMBER.toString(Integer.toString(j)).equals(code)){ + return Integer.toString(j); + } + } + } else if(alphabet[i] == MorseAlphabet.PUNCTUATION) { + switch (code){ + case ".-.-.-": return "."; + case "--..--": return ","; + case "..--..": return "?"; + case "-.-.--": return "!"; + default: return ""; + } + + }else if(alphabet[i].toString().equals(code)){ + return alphabet[i].name(); + } + } + return null; + } +} diff --git a/src/crypto/algorithms/VigenereAlgorithm.java b/src/crypto/algorithms/VigenereAlgorithm.java new file mode 100644 index 0000000..2c60975 --- /dev/null +++ b/src/crypto/algorithms/VigenereAlgorithm.java @@ -0,0 +1,13 @@ +package crypto.algorithms; + +public class VigenereAlgorithm implements CryptoAlgorithm{ + @Override + public String enc(String offset, String key) { + return null; + } + + @Override + public String dec(String offset, String key) { + return null; + } +} From 8212afd5358add0d831ea9f5222f97eeca0a3d41 Mon Sep 17 00:00:00 2001 From: Nikita Karpov Date: Sun, 23 Dec 2018 00:40:48 +0300 Subject: [PATCH 5/5] -implimented vigenere algorithm enc/dec ; --- src/crypto/Crypto.java | 4 +++ src/crypto/algorithms/VigenereAlgorithm.java | 36 +++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/crypto/Crypto.java b/src/crypto/Crypto.java index 92be081..e3c4a44 100644 --- a/src/crypto/Crypto.java +++ b/src/crypto/Crypto.java @@ -3,6 +3,7 @@ import crypto.algorithms.CaesarAlgorithm; import crypto.algorithms.CryptoAlgorithm; import crypto.algorithms.MorseAlgorithm; +import crypto.algorithms.VigenereAlgorithm; import java.io.File; import java.io.FileNotFoundException; @@ -113,6 +114,9 @@ public Crypto(String alg) { case "morse": this.algorithm = new MorseAlgorithm(); break; + case "vigenere": + this.algorithm = new VigenereAlgorithm(); + break; default: this.algorithm = new CaesarAlgorithm(); } diff --git a/src/crypto/algorithms/VigenereAlgorithm.java b/src/crypto/algorithms/VigenereAlgorithm.java index 2c60975..ec201bc 100644 --- a/src/crypto/algorithms/VigenereAlgorithm.java +++ b/src/crypto/algorithms/VigenereAlgorithm.java @@ -2,12 +2,40 @@ public class VigenereAlgorithm implements CryptoAlgorithm{ @Override - public String enc(String offset, String key) { - return null; + public String enc(String message, String key) { + message = message.toUpperCase(); + key = key.toUpperCase(); + StringBuilder out = new StringBuilder(); + message = message.toUpperCase(); + for (int i = 0, j = 0; i < message.length(); i++) + { + char c = message.charAt(i); + if (c < 'A' || c > 'Z'){ + out.append(c); + }else{ + out.append((char) ((c + key.charAt(j) - 2 * 'A') % 26 + 'A')); + j = ++j % key.length(); + } + } + return out.toString(); } @Override - public String dec(String offset, String key) { - return null; + public String dec(String message, String key) { + message = message.toUpperCase(); + key = key.toUpperCase(); + StringBuilder out = new StringBuilder(); + message = message.toUpperCase(); + for (int i = 0, j = 0; i < message.length(); i++) + { + char c = message.charAt(i); + if (c < 'A' || c > 'Z'){ + out.append(c); + }else{ + out.append((char) ((c - key.charAt(j) + 26) % 26 + 'A')); + j = ++j % key.length(); + } + } + return out.toString(); } }