Caesar-chiffre

Kekzii

Mitglied
Hallo,

Ich habe eine Verschlüsselung via Caesar-Chiffre geschrieben.

Also die Theorie ist ganz einfach :

Man hat ein Wort/Satz/Text und einen Schlüssel. Der Schlüssel besteht aus EINEM Buchstaben.
Der Buchstabe erhält eine Wertigkeit je nachdem welche Stelle der Buchstabe im Alphabet hat.
Also so hat zum Beispiel C die Wertigkeit 3 ,da er an der dritten Stelle im Alphabet steht.

jetzt wird das Wort (z.B.Hallo) "verschlüsselt" also wird jeder einzelne Buchstabe um 3 Stellen verschoben.

so wird aus dem Wort "Hallo " mit dem Schlüssel "c" das wort "kdoor".

soweit läuft das. Wenn ich jedoch ein grosses "C" statt einem kleinen nehme kommt bei dem wort "Hallo"
das Wort "+DOOR" raus
wie kann ich das verhindern?

Hier mal mein CODE

Java:
public class Bla {
	// private char hallo[];

	private char[] arrtext = null;
	private char key;

	// Konstruktoren
	public Bla(char key) {
		arrtext = createArray();
		this.key = key;

	}

	public Bla() {
		arrtext = createArray();
		this.key = 3;

	}

	// erstellen der ZeichenTabelle
	public char[] createArray() {
		// 33 Zeichen , 26Großbuchstaben , 6Zeichen ,26Kleinbuchstaben ,
		// 4Zeichen
		char[] ch = new char[33 + 26 + 6 + 26 + 4];

		int pos = 0;

		// Zuordnung der Zeichen
		for (int j = 32; j < 127; j++) {

			ch[pos++] = (char) j;
		}
		return ch;
	}

	public String codieren(String text) {
		// Start einer Zeichenkette
		StringBuffer codiert = new StringBuffer();

		for (int i = 0; i < text.length(); i++) {
			// aktueller char
			char akt = text.charAt(i);
			for (int j = 0; j < this.arrtext.length; j++) {

				if (akt == this.arrtext[j]) {

					// Verschlüsselter Buchstabe
					int bst = j + key;

					int test = bst - this.arrtext.length;
					if (test < 0) {
						bst -= this.arrtext.length;
					}

					if (bst >= this.arrtext.length) {

						bst -= this.arrtext.length;

					}

					else if (bst < 0) {

						bst += this.arrtext.length;
					}
					// falls maximale Zeichen erreicht wurden => Maximale
					// Zeichen abziehen
					if (bst > 94) {
						bst -= 94;
					}
					bst -= 1;
					akt = this.arrtext[bst];
					break;

				}

			}
			if (akt > 91) {
				akt -= 36;
			}
			// Stück für Stück Zeichenkette zusammenfügen
			codiert.append(akt);

		}
		return codiert.toString();
	}

	public String decodieren(String text) {
		// Start einer Zeichenkette
		StringBuffer codiert = new StringBuffer();

		for (int i = 0; i < text.length(); i++) {
			// aktueller char
			char akt = text.charAt(i);
			for (int j = 0; j < this.arrtext.length; j++) {

				if (akt == this.arrtext[j]) {

					// Verschlüsselter Buchstabe
					int bst = j - key;

					if (bst >= this.arrtext.length) {

						bst -= this.arrtext.length;

					}

					else if (bst < 0) {

						bst += this.arrtext.length;
					}
					// falls maximale Zeichen erreicht wurden => Maximale
					// Zeichen abziehen
					if (bst < 0) {
						bst += 94;
					}
					bst += 1;
					akt = this.arrtext[bst];
					break;

				}

			}
			// Stück für Stück Zeichenkette zusammenfügen
			codiert.append(akt);

		}
		return codiert.toString();
	}

}

Schonmal Danke im vorraus für eure Mühe
 
> so wird aus dem Wort "Hallo " mit dem Schlüssel "c" das wort "kdoor".

also bei mir nicht, ne main-Methode mit
Java:
        Bla b = new Bla('c');
        System.out.println(b.codieren("Hallo"));
führt zu
K@KKN
..

> Also so hat zum Beispiel C die Wertigkeit 3 ,da er an der dritten Stelle im Alphabet steht.

davon steht nichts im Code, du verwendst key wie er ist, 'c' ist 99

--------

allgemein hängt alles von den implementierten Regeln ab, wie wirkt sich key aus, wie unterscheidest du Groß/ Kleinbuchstaben usw.,
nur deinen (oder auch nicht deinen) Code sprechen zu lassen ist etwas dürftig,

ein Vorschlag: nur Kleinbuchstaben ver/ entschlüsseln, vorher merken was klein/ groß war, am Ende zurücksetzen:
Hallo = hallo -> kdoor = Kdoor,
oder soll groß/ klein beliebig durchmischt werden?
 
o0 seltsam

Ich hab auch eine GUI da gibt er mir Kdoor aus aber wenn ich es über die main mache dann nicht

versteh ich nicht 🙁


Gross und Kleinschreibung sollte schon beibehalten werden ansonsten hätte ich direkt alles in grossbuchstaben bzw. Kleinbuchstaben gemacht
 
So

jetzt habe ich die zeilen

[java=77] if (akt > 91) {
akt -= 36;
} [/code]

mal entfernt da ich gemerkt habe dass die Variable "akt" nach der For-Schleife niemals größer 91 ist es und es ziemlich unlogisch wäre davon 36 abzuziehen 😀 keine ahnung was mich da geritten hat ???:L
danach kommt auch das richtige Ergebnis zustande

Jetzt bleibt nur noch das Problem, dass bei einem grossen "C" als schlüssel "+DOOR" ausgegeben wird anstatt "kDOOR"

vllt kann mir da ja jemand helfen 🙂
 
du hast eben so ein komisches Alphabet, so dass 99 Positionen nach dem H das + steht statt das k,
wenn du das nicht willst, dann ändere wie gesagt die Regeln,

ich bin nach wie vor dafür z.B. die 26 Kleinbuchstaben bzw. evtl. 52 Klein- + Großbuchstaben nur innerhalb sich selbst zu drehen,
das 94er-Alphabet ist zu kompliziert
 

Zurück
Oben