public class Caesar {
static String msgKodieren(char key, char ch, boolean decode) {
/*
* Die Methode uebernimmt den Schluessel (key), einen Grossbuchstaben (ch),
* die Option Kodieren(false)/Dekodieren(true) und gibt einen String
* mit dem Buchstaben zurueck.
*/
char c=65; // 65 entspricht dem "A" (Grossbuchstabe)
int i=1,j=0,k;
StringBuffer s = new StringBuffer(1); // Kleiner String Buffer fuer 1 Char
//
// ch zu Uppercase (sonst klappt der Vergleich spaeter nicht)
//
s.append(ch); // Char in den String Buffer...
String s1=s.toString(); // ...StringBuffer in den String...
s1=s1.toUpperCase(); // ...String zu Uppercase...
ch=s1.charAt(0); // ...und Uppercase zurueck in Char
s.delete(0, s.length()); // Loeschen den Buffers, da er spaeter nocheinmal gebraucht wird
//
// key zu Uppercase
//
s.append(key);// gleiche Prozedur wie bei "ch"
s1=s.toString();
s1=s1.toUpperCase();
key=s1.charAt(0);
s.delete(0, s.length());
for (k=0,c=65; c<key-1;c++) // Verschiebungs-Faktor berechnen
i++;
if (decode == false) // Dekodieren
for (j = 0; j<i;j++) // ch um Faktor i verschieben. Wird "Z" ueberschritten, Sprung zu "A"
if (ch<90)
ch++;
else ch=65;
else // Kodieren
for (j = 0; j<i;j++) // ch um Faktor i verschieben. Wird "Z" ueberschritten, Sprung zu "A"
if (ch>65)
ch--;
else ch=90;
s.append(ch);
String sOut=s.toString();
return sOut; // �bergabe des Kodierten/Dekodierten Buchstaben
}
public static void main(String[] args) {
//
// Pruefung der Argumente
//
/*
* Es wird ueberprueft, ob die Kommandozeilenparametern die richtige Anzahl haben
* und ob der Kommandozeilenparameter, der den Schluessel angibt, die richtige Form hat.
* Sind die Kommandozeilenparameter nicht korrekt, wird eine Fehlermeldung ausgegeben und
* das Programm beendet sich.
*/
if (args[0].length()>1 // 1. Argument laenger als ein Buchstabe?
|| args[0].isEmpty()==true // 1. Argument fehlt?
|| (Character.isLetter(args[0].charAt(0))==true // 1. Argument = Buchstabe?
&& args[0].charAt(0)<=65 // 1. Argument = Grossbuchstabe?
&& args[0].charAt(0)>=90)// "" ?
|| (args[0].charAt(0)<=97 // 1. Argument = Kleinbuchstabe?
&& args[0].charAt(0)>=122) // "" ?
|| args[1].isEmpty()==true // 2. Argument fehlt?
|| args.length>=3) // 3. Argument vorhanden?
System.err.print("Parameter ungueltig!"+"\n"
+"Argument 1 sollte ein Gross-/Kleinbuchstabe sein!"+"\n"
+"Argument 2 sollte eine beliebige Zeichenfolge sein!");
else {
//
// Wenn Eingaben korrekt:
//
char key=args[0].charAt(0); // Schluessel uebernehmen
String msg=args[1]; // Nachricht (msg) uebernehmen
StringBuffer s = new StringBuffer(msg.length()); // Buffer der Laenge msg.length
for (int i=0; i<msg.length();i++){
//
// Char zu Uppercase
//
StringBuffer ChBuffer = new StringBuffer(1);
ChBuffer.append(msg.charAt(i));
String bString=ChBuffer.toString();
bString=bString.toUpperCase();
char ch=bString.charAt(0);
/* Jedes Zeichen wird darauf geprueft ein Buchstabe zu sein. Wenn ja, wird das Zeichen
* einzeln Chiffriert, zurueckgegeben und in den StringBuffer geschrieben. Ist das Zeichen
* kein Buchstabe, kommt es direkt in den Buffer.
* Ist der Schluessel (key) ein Grossbuchstabe wird die Nachricht kodiert. Sollte der
* Schluessel ein Kleinbuchstabe sein wird die Nachricht dekodiert.
*/
// Kodieren
if (Character.isLetter(ch)==true && ch>=65 && ch<=90)
if (Character.isUpperCase(key)==true)
s.append(msgKodieren(key,msg.charAt(i),false)); // Kodieren
else s.append(msgKodieren(key,msg.charAt(i),true)); // Dekodieren
else {s.append(msg.charAt(i)); // Unkodiert
}
}
// Ausgabe
System.out.print("+++ +++ +++ +++ ++++ +++ +++ +++ +++ +++ +++ +++"+"\n"
+"Klartext: "+msg+"\n"
+"Kodiert: "+s+"\n"
+"+++ +++ +++ +++ ++++ +++ +++ +++ +++ +++ +++ +++");
}
}
}