-
Notifications
You must be signed in to change notification settings - Fork 0
/
VigenereMaschine.java
151 lines (138 loc) · 5.25 KB
/
VigenereMaschine.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/**
* Die Klasse VigenereMaschine implementiert die Gemeinsamkeiten der Klassen Entschluessler
* und Verschluessler, die von dieser abgeleitet werden.
*
* @author Fiedler, Paul, 3726896
*/
public class VigenereMaschine {
private String inputFileName;
private String schluesselwort;
private FormatierterText inputText;
private String outputText;
private char[][] chiffrierMatrix;
private boolean isEntschluesseler;
/**
* Constructs and initializes a VigenereMaschine with an input- and output as well a s a schluesselwort
* Konstruktor der Klasse.
*
* @author Fiedler, Paul, 3726896
* @param inputFileName Name der zu ent- oder verschlüsselten Datei.
* @param schluesselwort Das für Ent-/Verschlüsslung notwendige Schlüsselwort.
* @param isEntschluesseler Bestimmt, ob die VigenereMaschine Ent- oder Verschlüssler ist.
*/
public VigenereMaschine(String inputFileName, String schluesselwort, boolean isEntschluesseler){
this.inputFileName = inputFileName;
this.schluesselwort = schluesselwort;
this.isEntschluesseler = isEntschluesseler;
this.inputText = new FormatierterText(FileHandler.readFromFile(inputFileName));
this.chiffrierMatrix = new char[26][26]; // initialisiert ein zweidimensionales char-Array in der Größe des genutzten Alphabets
// generiert Matrix
int k = 0;
for (int i = 0; i < chiffrierMatrix.length; i++) {
for (int j = 0; j < chiffrierMatrix[i].length; j++) {
chiffrierMatrix[i][j] = (char)(k++ % 26 + 97);
}
k++;
}
}
/**
* Getter für das Attribut inputText
*
* @author Fiedler, Paul, 3726896
* @return inputText, in die Vigenere-Maschine eingegebener Text als Typ FormatierterText.
*/
public FormatierterText getInputText() {
return inputText;
}
/**
* Getter für das Attribut outputText
*
* @author Fiedler, Paul, 3726896
* @return outputText, in die Vigenere-Maschine eingegebener Text vom Typ String.
*/
public String getOutputText() {
return outputText;
}
/**
* Gibt die eine Matrix und Erklärung zur Fuktionsweise der VigenereChiffre auf der Konsole aus.
*
* @author Fiedler, Paul, 3726896
*/
public void printMatrix(){
// prints instructions
System.out.println("\n");
System.out.println("### VIGENERE-CHIFFRE ###");
System.out.println("\n");
System.out.println("Das Chiffre findet sich, wo Zeile des Schlüsselbuchstaben und ");
System.out.println("Spalte des zu verschlüsselnden Buchstabens in der Matrix zusammentreffen.");
System.out.println("\n");
System.out.println("Zum Dechiffrieren Suchen sie in der ersten Spalte den Schlüsselbuchstaben");
System.out.println("suchen sie in dessen Spalte den entsprechenden Buchstaben im verschlüsselten Text");
System.out.println("in der ersten Zeile über diesem finden sie den entsprechenden entschlüsselten Buchstaben.");
System.out.println("\n");
// prints Matrix
for (int i = 0; i < chiffrierMatrix.length; i++) {
for (int j = 0; j < chiffrierMatrix[i].length; j++) {
if (chiffrierMatrix[i][j] - 10 < 0) {System.out.print(chiffrierMatrix[i][j] + " |");}
else {System.out.print(chiffrierMatrix[i][j] + "|");}
}
System.out.println();
}
}
/**
* Gibt den Ausgangstext auf der Konsole aus.
*
* @author Fiedler, Paul, 3726896
*/
public void printInput(){
System.out.println();
System.out.println("----------");
System.out.println("Ausgangstext:");
System.out.println();
System.out.println(this.inputText.getText());
}
/**
* Gibt das Attribut outputText in der Konsole aus.
*
* @author Fiedler, Paul, 3726896
*/
public void printOutput(){
System.out.println(this.outputText);
}
/**
* Speichert das Ergebnis als Datei.
*
* @param outputFilename
* @author Fiedler, Paul, 3726896
*/
public void outputToFile(String outputFilename){
FileHandler.writeFile(outputFilename, this.outputText.toString());
}
/**
* Ver-/Enschluesselt den formatierten Text.
*
* @author Fiedler, Paul, 3726896
*/
public void chiffrieren() {
char[] inputText = this.inputText.getText().toCharArray();
StringBuilder sb = new StringBuilder();
int k = 0;
for (int i = 0; i < inputText.length; i++) {
if (inputText[i] < 97 || inputText[i] > 122) {
sb = sb.append(inputText[i]);
} else {
if (k == schluesselwort.length()) {k = 0;}
int x = (int)(schluesselwort.charAt(k)) - 97;
if (isEntschluesseler){
char c =(char)(chiffrierMatrix[26 - x][inputText[i] - 97]); // Chiffre char ermitteln
sb.append(c);
}else{
char c =(char)(chiffrierMatrix[x][inputText[i] - 97]); // Chiffre char ermitteln
sb.append(c);
}
k++;
}
}
outputText = sb.toString();
}
}