Java: Vigenère-Verschlüsselung?

3 Antworten

Nehmen wir den Code mal Zeile für Zeile auseinander:

public static String vigenereCipher(String plaintext, String key) {
  String ciphertext = "";
  int mod, cipher1, cipher2, cipher3, y = 0;

Sollte klar sein. Die Funktion und ein paar Variablen werden deklariert.

  for (int x = 0; x < plaintext.length(); x++) {

Der folgende Code wird so oft wiederholt, wie der Klartext lang ist. Dabei wird die Variable x jedes mal eins weiter hochgezählt.

cipher1 = plaintext.charAt(x) - 'A';

Die Variable cipher1 wird mit dem Wert des Buchstaben beschrieben, der grade verarbeitet wird (aus A wird 0, aus B wird 1, aus C wird 2 etc.)

mod = x % key.length();

Die Variable mod wird mit der Zeichenposition beschrieben, die aus dem Schlüssel benutzt werden soll (Wenn z.B. der Klartext 30 Zeichen lang ist, aber der Schlüssel nur 10 Zeichen, dann wird die ersten 10 Zeichen lang jeweils das x-te Zeichen vom Klartext mit dem x-ten Zeichen vom Schlüssel verarbeitet. Danach fängt der Schlüssel wieder von vorne an, also das elfte Zeichen vom Klartext wird mit dem ersten Zeichen vom Schlüssel verarbeitet etc.)

cipher2 = key.charAt(mod) - 'A';

Die Variable cipher2 kriegt den Wert des aktuell benutzten Zeichens aus dem Schlüssel. (Wieder das gleiche Spiel, wie beim Klartext. A wird zu 0, B wird zu 1 etc.)

cipher3 = (cipher1 + cipher2) % 26 + 'A';

Die Werte der Buchstaben aus Klartext und Schlüssel werden zusammenaddiert. Wenn die Werte über 25 hinausgehen, wird wieder von vorne angefangen zu zählen. (z.B. E + F = 4 + 5 = 9 = J. Und bei Buchstaben vom Ende des Alphabets: S + T = 18 + 19 = 37. 37 ist größer als 25, also wird 26 abgezogen. 37 - 26 = 11 = L)

Zu dem Wert des Buchstabens wird wieder das "A" hinzuaddiert, wodurch in der Variable cipher3 der Ascii-Code von dem verschlüsselten Zeichen gespeichert wird.

ciphertext = ciphertext + (char) cipher3;

An die Variable ciphertext wird das aktuell berechnete Zeichen angefügt.

  }

  return ciphertext; 

Die Schleife wird beendet und der verschlüsselte Text wird an die aufrufende Funktion zurückgegeben.


U2345242 
Fragesteller
 11.03.2019, 18:29

Super vielen Dank! :)

1

Wenn dir das Verfahren bestens vertraut ist, ist es doch nicht notwendig, fremde Codes zu kopieren? Stattdessen könntest du dir den Algorithmus ganz leicht selbst schreiben. Sicherlich ist das auch das eigentliche Anliegen deiner Übung, die du da absolvierst?

Das A ist ein Wert vom Datentyp char. Schau dir nun die ASCII-Tabelle an. Jedes Zeichen hat eine numerische Repräsentation. Das A bspw. hat den Dezimalwert 65.

Für die Codierung möchte man sich nur auf die Buchstaben A-Z begrenzen (daher Modulo 26). Also zieht man den Startwert (A = 65) zwischenzeitlich ab (so hat Z den Wert 90 - 65 = 25, wohlgemerkt, die Zählung beginnt bei 0) und addiert ihn später (nach der Division) wieder hinzu.

Wenn du die weiteren Zeilen genau verstehen möchtest, setze einen konkreten Wert je Parameter ein und laufe Schritt für Schritt durch. Entweder machst du das auf einem Blatt Papier oder du nimmst dir den Debugger einer IDE zu Hilfe.

In der for schleife wird 1mal x auf 0 gesetzt und solange x größer als 0 wird die länge berechnet und x um eins addiert bevor das dann wieder wiederholt wird kommt der rest

Sry habe gerade keine Zeit und kenne die chefrier Art nicht