Viginere-Verschlüsselung in Java

Momchilo

Komplett-PC-Aufrüster(in)
Viginere-Verschlüsselung in Java

Hallo,
ich versuche momentan die Viginere-Verschlüsselung zu verstehen. Das Prinzip stellt für mich kein Problem dar, aber ich verstehe die Implementierung nicht ganz.
Code:
    private void button1ActionPerformed(java.awt.event.ActionEvent evt) {
        String eingabe = textfield1.getText().toLowerCase();
        String key = textfield2.getText().toUpperCase();
        String ausgabe = "";
        for(int i=0; i<eingabe.length(); i++)
        {
           int j = i % key.length();
           int x = key.charAt(j) -65;
           x = (eingabe.charAt(i) -97 + x) % 26;
           x = x + 65;
           ausgabe = ausgabe + (char)x;
        }
        textfield3.setText(ausgabe);
    }
Zu Beginn werden die Eingabe (der Klartext) und der Key (Schlüsselwort) in Strings gespeichert. Anschließend wird die for-Schleife so oft ausgeführt, wie der String "eingabe" Zeichen hat.
So jetzt habe ich Probleme den Code zu verstehen. Was machen folgende Zeilen?
Code:
           int j = i % key.length();
           int x = key.charAt(j) -65;
           x = (eingabe.charAt(i) -97 + x) % 26;
Also was jeder Befehl für sich bedeutet weiß ich, aber die Funktionsweise vom Algorithmus ist mir schleierhaft. Besonders die Funktion der Variablen "j".
Ich würde mich über eine Erklärung oder Hilfestellung sehr freuen :)
 
AW: Viginere-Verschlüsselung in Java

Alsooo...

Code:
int j = i % key.length();

Die Variable j dient dazu, um durch den Schlüssel zu cyclen, da ja jeder Buchstabe mit einer anderen Zeile aus der Schlüsseltabelle verschlüsselt wird. Durch ermitteln des Rests der Division erhälst du immer ne Zahl zwischen 0 und key.length-1. Diese gibt an, welcher Buchstabe von key verwendet wird, um den momentanen (i-ten) Buchstabe aus eingabe zu verschlüsseln.

Code:
int x = key.charAt(j) -65;

Hier bekommst du durch int x = String.charAt(int) den ASCII-Dezimalwert des des sich auf der Position int befindlichen Buchstaben. Die Großbuchstaben (der Key-String besteht aus Großbuchstaben) haben entsprechend der ASCII-Tabelle Werte zwischen 65 und 90. Deshalb noch minus 65 gerechnet, und man hat die Differenz zwischen dem gesuchten Buchstaben, in unserem Fall key[j], und "A".

Code:
x = (eingabe.charAt(i) -97 + x) % 26;

Mit obigem sollte das einfach zu verstehen sein. Man besorgt sich den ASCII-Dez-Wert vom i-ten Buchstaben aus eingabe, subtrahiert 97 (Kleinbuchstaben auf der ASCII-Tabelle befinden sich von 97 bis 122), und addiert x (Positionsunterschied auf der Tablle zwischen "a" und unserem Buchstaben). Danach alles modulo 26, um wie bei der ersten dieser drei Zeilen zu cyclen, dieses Mal allerdings zwischen 0 und 25, aka dem Alphabet. Danach noch 65 draufaddieren, um den entsprechenden ASCII-Dezimalwert für den Kleinbuchstaben zu erhalten. Durch (char)x; erhält man aus dem Zahlenwert wieder einen Buchstaben.


Ich hoffe mal, ich hab keinen Fehler gemacht :D
 
Zuletzt bearbeitet:
Zurück