diff --git a/src/main/java/Enigma/model/Codebuch.java b/src/main/java/Enigma/model/Codebuch.java index c32345ed483066ea6daa01e4d0f9bc88776e49f0..3ef5e25be47442b10fec91bad94bb60d3070cb43 100644 --- a/src/main/java/Enigma/model/Codebuch.java +++ b/src/main/java/Enigma/model/Codebuch.java @@ -5,7 +5,7 @@ package Enigma.model; * Jeder Enigma gehörte auch ein Codebuch bei, welches notwenidg war um die Nachrichten zu ver/entschlüsseln. * Im Codebuch standen für jeden Tag des Monats die notwendigen Einstellungen welche vorgenommen werden * mussten um die Texte zu ver/entschlüsseln. - * Hiernach wurden die Walzen eingesetzt, die Ringe für den Rücksprung der Walzen gesetzt und deren Grundeinstellung + * Hiernach wurden die Walzen eingesetzt, die Ringe für den Rücksprung der Walze gesetzt und deren Grundeinstellung * vorgenommen. * Bei der Enigma um welche es hier geht (Enigma I) gab es zusätzlich ein Steckbrett, welches ebenfalls im Codebuch * festgelegt war. diff --git a/src/main/java/Enigma/model/Walze.java b/src/main/java/Enigma/model/Walze.java new file mode 100644 index 0000000000000000000000000000000000000000..2d72adc6bf887c4593b4c591b2aaf1c7eba020de --- /dev/null +++ b/src/main/java/Enigma/model/Walze.java @@ -0,0 +1,224 @@ +package Enigma.model; + +public class Walze { + + Character buchstabe = null; + Character ringstellung = null; + int walzennr = 0; + int iPositionBuchstabe = 0; + int iPositionBuchstabeRe = 0; + Character[] walze = new Character[25]; + + /** + * Gibt die Parameter der Walze mit + * + * @param walzennr : int : Nummer der gewaehlten Walze + * @param buchstabe : Character : Grundeinstellung der Walze + * @param ringstellung : Character : Einstellung des Notch + */ + public Walze(int walzennr, Character buchstabe, Character ringstellung) { + this.walzennr = walzennr; + this.buchstabe = buchstabe; + this.ringstellung = ringstellung; + } + + /** + * @return buchstabe : Character : gibt den neuen Buchstaben zurueck + */ + public char getBuchstabe() { + return buchstabe; + } + + /** + * Gibt die Grundeinstellung der Walze ein. Nur Buchstaben von A - Z sind zugelassen. + * Buchstaben werden automatisch in Grossbuchstaben umgewandelt. + * Im Fehlerfall wird die Grundeinstellung der Walze standardmaessig auf 'A' gesetzt. + * + * @param buchstabe : Character : Grundeinstellung der Walze + */ + private void setBuchstabe(Character buchstabe) { + this.buchstabe.toUpperCase(buchstabe); + + if(buchstabe.isLetter(buchstabe)) { + this.buchstabe = buchstabe; + } else { + this.buchstabe = 'A'; + } + + } + + /** + * @return ringstellung : Character : gibt die neue Ringstellung zurueck + */ + public char getRingstellung() { + return ringstellung; + } + + + /** + * Gibt die Initiale Ringstellung der Walze an. + * Es sind nur Zahlen von 1 - 26 zugelassen. + * Im Fehlerfall wird die Ringstellung standardmaessig auf '1' gesetzt. + * + * @param ringstellung : Character : Punkt an dem die Walze umspringt + */ + private void setRingstellung(Character ringstellung) { + + if(buchstabe.isDigit(ringstellung) && ringstellung > 0 && ringstellung <= 26) { + this.ringstellung = ringstellung; + } else { + this.ringstellung = '1'; + } + } + + /** + * @return walzennr : int : gibt die Walzennummer zurueck + */ + public int getWalzennr() { + return walzennr; + } + + /** + * Definiert die Walze. Es stehen fuenf Walze zur Auswahl. + * + * @param walzennr : int : setzt die Walzennummer + */ + private void setWalzennr(int walzennr) { + if(walzennr > 0 && walzennr < 6) { + this.walzennr = walzennr; + } else { + System.err.println("Keine gültige Walzennummer"); + } + } + + /** + * Sortiert den Walzennummern das passenden Character-Array mittels switch zu. + * + * @return walze : Character[] : gibt die gewaehlte Walze zurueck + */ + private Character[] walzenNummer() { + + //Walze nach der Cheffrierung + Character[] walzeEins = {'E','K', 'M', 'F', 'L', 'G', 'D', 'Q', 'V', 'Z', 'N', 'T', 'O', 'W', 'Y', 'H', 'X', 'U', 'S', 'P', 'A', 'I', 'B', 'R', 'C', 'J'}; + Character[] walzeZwei = {'A', 'J', 'D', 'K', 'S', 'I', 'R', 'U', 'X', 'B', 'L', 'H', 'W', 'T', 'M', 'C', 'Q', 'G', 'Z', 'N', 'P', 'Y', 'F', 'V', 'O', 'E'}; + Character[] walzeDrei = {'B', 'D', 'F', 'H', 'J', 'L', 'C', 'P', 'R', 'T', 'X', 'V', 'Z', 'N', 'Y', 'E', 'I', 'W', 'G', 'A', 'K', 'M', 'U', 'S', 'Q', 'O'}; + Character[] walzeVier = {'E', 'S', 'O', 'V', 'P', 'Z', 'J', 'A', 'Y', 'Q', 'U', 'I', 'R', 'H', 'X', 'L', 'N', 'F', 'T', 'G', 'K', 'D', 'C', 'M', 'W', 'B'}; + Character[] walzeFuenf = {'V', 'Z', 'B', 'R', 'G', 'I', 'T', 'Y', 'U', 'P', 'S', 'D', 'N', 'H', 'L', 'X', 'A', 'W', 'M', 'J', 'Q', 'O', 'F', 'E', 'C', 'K'}; + + switch (getWalzennr()) { + case 1: + walze = walzeEins; + break; + case 2: + walze = walzeZwei; + break; + case 3: + walze = walzeDrei; + break; + case 4: + walze = walzeVier; + break; + case 5: + walze = walzeFuenf; + break; + } + + return walze; + } + + /** + * Ermittelt die Position des Buchstaben auf der Alphabetswalze, um die Position mit + * der Cheffrierung auf der gewaehlten Walze abgleichen zu koennen. + * + * @return iPositionBuchstabe : int : Position des Buchstaben im Array + */ + public int positionBuchstabe() { + + //Alphabetswalze + Character[] walzeAlpha = {'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'}; + + int index = 0; + + //Ermittelt die Position des Buchstaben buchstabe auf der Alphabetswalze + for(index = 0; index < walzeAlpha.length; index++) { + if(buchstabe.equals(walzeAlpha[index])) { + iPositionBuchstabe = index; + break; + } + } + + return iPositionBuchstabe; + } + + + /** + * Cheffriert den Buchstaben an der Position aus der Methode positionBuchstabe() + * anhand der gewaehlten Walze. + * + * @param iPositionBuchstabe : int : Position des zu cheffrierenden Buchstabens + * @param walze : Character[] : ausgewaehlte Walze + * @return cheffrierterBuchstabe : Character : cheffrierter Buchstabe + */ + public Character codierterBuchstabe(int iPositionBuchstabe, Character[] walze) { + Character codierterBuchstabe = walze[iPositionBuchstabe]; + return codierterBuchstabe; + } + + + /** + * Nimmt die Startposition, die aus der Walzeneinstellung geholt wird und + * erhoeht sie um eins. + * Die Variable wird ueberschrieben und zaehlt von nun an die Position mit. + * Ab Position 25 wird wieder bei 0 angefangen. + * + * @param iPositionBuchstabe : int : alte Position der Walze + * @return iPositionBuchstabe : int : neue Position der Walze + */ + public int vorstellenDerWalze(int iPositionBuchstabe) { + + if(iPositionBuchstabe == 25) { + iPositionBuchstabe = 0; + } else { + iPositionBuchstabe += 1; + } + + return iPositionBuchstabe; + } + + /** + * Ermittelt die Position des Buchstaben auf der gewaehlten Walze, um die Position mit + * der Cheffrierung auf der AlphaWalze abgleichen zu koennen. + * + * @param walzennr : int : gibt die gewaehlte Walze zurueck + * @return iPositionBuchstabeRe : int : Position des Buchstaben im Array + */ + public int positionBuchstabeReverse(int walzennr) { + + int index = 0; + + //Ermittelt die Position des Buchstaben buchstabe auf der Alphabetswalze + for(index = 0; index < walze.length; index++) { + if(buchstabe.equals(walze[index])) { + iPositionBuchstabeRe = index; + break; + } + } + return iPositionBuchstabeRe; + } + + /** + * Cheffriert den Buchstaben an der Position aus der Methode positionBuchstabeReverse() + * anhand der AlphaWalze. + * + * @param iPositionBuchstabeRe : int : Position des zu cheffrierenden Buchstabens + * @return codierterBuchstabeRe : Character : cheffrierter Buchstabe + */ + public Character codierterBuchstabeReverse(int iPositionBuchstabeRe) { + //Alphawalze + Character[] walzeAlpha = {'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'}; + + Character codierterBuchstabeRe = walzeAlpha[iPositionBuchstabeRe]; + return codierterBuchstabeRe; + } + +}