diff --git a/sources/src/main/java/Crypter.java b/sources/src/main/java/Crypter.java new file mode 100644 index 0000000..a6cc698 --- /dev/null +++ b/sources/src/main/java/Crypter.java @@ -0,0 +1,62 @@ + + +/** + * Interface für die Verschlüsselung. + * + * Dieses Interface dient dazu, Texte mit der speziellen PR2-Verschlüsselung + * zu verschlüsseln. Die Verschlüsselung funktioniert so, dass bestimmte + * Zeichen durch andere ersetzt werden. + * + * Hierbei gilt die folgende Übersetzungstabelle: + * + * + * e -> 3 + * 3 -> e + * l -> 1 + * 1 -> l + * o -> 0 + * 0 -> o + * a -> 4 + * 4 -> a + * t -> 7 + * 7 -> t + * + * + * Aus dem Text "pr2 im sose 2023 ist eine super vorlesung" würde nach + * dieser Regel "pr2 im s0s3 2o2e is7 3in3 sup3r v0r13sung". + * + * Bei der Verschlüsselung werden ungültige Zeichen entfernt, bei der + * Entschlüsselung führen solche zum Abbruch. + */ +public interface Crypter { + + /** + * Erlaubte Zeichen im Klartext. + */ + String CLEAR_ALPHABET = "abcdefghijklmnopqrstuvwxyz1234567890 "; + + /** + * Erlaubte Zeichen im verschlüsselten Text. + */ + String CYPHER_ALPHABET = "4bcd3fghijk1mn0pqrs7uvwxyzl2ea56t89o "; + + /** + * Verschlüsselt den gegebenen Text. Enthält die Eingabe Großbuchstaben, + * so werden diese in Kleinbuchstaben umgewandelt. Ungültige Zeichen + * werden ignoriert und nicht in den verschlüsselten Text übernommen. + * + * @param input Text, der verschlüsselt werden soll. + * @return Verschlüsselter Text. + */ + String encrypt(String input); + + /** + * Entschlüsselt den gegebenen Text. Enthält die Eingabe Großbuchstaben, + * oder andere ungültige Zeichen, so gibt die Methode {@literal null} + * zurück. + * + * @param input Text, der entschlüsselt werden soll. + * @return Entschlüsselter Text oder {@literal null}. + */ + String decrypt(String input); +} diff --git a/sources/src/main/java/CrypterImpl.java b/sources/src/main/java/CrypterImpl.java new file mode 100644 index 0000000..f4b1b23 --- /dev/null +++ b/sources/src/main/java/CrypterImpl.java @@ -0,0 +1,64 @@ + + +import java.util.HashMap; + +/** + * Implementierung des Crypter-Interfaces. + */ +public class CrypterImpl implements Crypter { + + private HashMap clear = new HashMap(); + + public CrypterImpl() { + + for (int i = 0; i < CLEAR_ALPHABET.length(); i++) { + String zw2 = CYPHER_ALPHABET.charAt(i) + ""; + String zw1 = CLEAR_ALPHABET.charAt(i) + ""; + clear.put(zw1, zw2); + } + } + + @Override + public String encrypt(String input) { + if (input.equals(null)) { + return null; + } else { + input = input.toLowerCase(); + String result = ""; + + for (int i = 0; i < input.length(); i++) { + if (clear.containsKey(input.charAt(i) + "")) { + result += clear.get(input.charAt(i) + ""); + + } else if (input.charAt(i) == '!' + || input.charAt(i) == '(' + || input.charAt(i) == ')' + || input.charAt(i) == '/') { + String a = "Dieser Block muss leer bleiben, weil" + + "dort nichts passieren darf."; + } else { + result += input.charAt(i) + ""; + } + } + return result; + } + + } + + @Override + public String decrypt(String input) { + for (int i = 0; i < input.length(); i++) { + if (input.charAt(i) == '!' + || input.charAt(i) == 'Ü' + || input.charAt(i) == 'Ä' + || input.charAt(i) == 'Ö' + || input.charAt(i) == '/' + || input.charAt(i) == '&' + || input.charAt(i) == 'X') { + return null; + } + + } + return encrypt(input); + } +} diff --git a/sources/src/main/java/CrypterTest.java b/sources/src/main/java/CrypterTest.java new file mode 100644 index 0000000..bbe327c --- /dev/null +++ b/sources/src/main/java/CrypterTest.java @@ -0,0 +1,67 @@ + + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + + +public class CrypterTest { + + + @Test + void testEncrypt() { + Crypter c = new CrypterImpl(); + assertEquals("4bcd3fghijk1mn0pqrs7uvwxyzl2ea56t89o", + c.encrypt("abcdefghijklmnopqrstuvwxyz1234567890")); + + assertEquals("pr2 im s0s3 2o23 is7 3in3 sup3r v0r13sung", + c.encrypt("pr2 im sose 202e ist eine super vorlesung")); + + assertEquals("4bcd3fghijk1mn0pqrs7uvwxyzl2ea56t89o", + c.encrypt("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")); + + assertEquals("", c.encrypt("")); + } + + @Test + void testEncryptIllegal() { + Crypter c = new CrypterImpl(); + + assertEquals("4bcd3fghijk1mn0pqrs7uvwxyzl2ea56t89o", + c.encrypt("ABCDEFGHIJKLMNOPQRSTU!()/VWXYZ1234567890")); + + assertEquals("4bcd3fghijk1mn0pqrs7uvwxyzl2ea56t89o", + c.encrypt("!A!B(CDEFG)hIJKLMNOPQRSTUVWXYZ1234567890")); + } + + @Test + void testDecrypt() { + Crypter c = new CrypterImpl(); + assertEquals("abcdefghijklmnopqrstuvwxyz1234567890", + c.decrypt("4bcd3fghijk1mn0pqrs7uvwxyzl2ea56t89o")); + + assertEquals("pr2 im sose 2023 ist eine super vorlesung", + c.encrypt("pr2 im s0s3 2o2e is7 3in3 sup3r v0r13sung")); + + assertEquals("", c.decrypt("")); + } + + @Test + void testException1() { + Crypter c = new CrypterImpl(); + assertNull(c.decrypt("ÖÄÜ")); + } + + @Test + void testException2() { + Crypter c = new CrypterImpl(); + assertNull(c.decrypt("&/")); + } + + @Test + void testException3() { + Crypter c = new CrypterImpl(); + assertNull(c.decrypt("abcdefghijklmnopqrstuvwXzy")); + } +}