Vigenere-Verschlüsselung: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 5: | Zeile 5: | ||
[[File:Vigenere-Beispiel.png|thumb|Quelle: [http://commons.wikimedia.org/wiki/File:Vigenere-Beispiel.png Wikimedia] |727px]] | [[File:Vigenere-Beispiel.png|thumb|Quelle: [http://commons.wikimedia.org/wiki/File:Vigenere-Beispiel.png Wikimedia] |727px]] | ||
Das Vigenere-Verfahren ist eine '''polyalphabetische''' Verschlüsselung, die | Das Vigenere-Verfahren ist eine '''polyalphabetische''' Verschlüsselung, die die [[Caesar-Verschlüsselung]] erheblich verbessert. | ||
Es wurde im 16. Jahrhundert entwickelt und galt lange als sicher; erst 1854 wurde der sog. '''Kasiski-Test''' veröffentlicht, mit dem man das Vigenere-Verfahren knacken konnte. | Es wurde im 16. Jahrhundert entwickelt und galt lange als sicher; erst 1854 wurde der sog. '''Kasiski-Test''' veröffentlicht, mit dem man das Vigenere-Verfahren für kurze Schlüssellängen bei ausreichender Textmenge knacken konnte. (Bei langen Schlüsseln, am besten so lang wie der Text selber, ist das Vigenere-Verfahren auch heute noch sicher.) | ||
=Verfahren= | =Verfahren= | ||
Zeile 19: | Zeile 19: | ||
==Implementierung== | ==Implementierung== | ||
<code> | <code>public class Vigenere { | ||
'''private static char[][] vigenereQuadrat;''' | '''private static char[][] vigenereQuadrat;''' | ||
'''public static void vigenereQuadratErstellen(){''' | '''public static void vigenereQuadratErstellen(){''' | ||
if(vigenereQuadrat == null){ | if(vigenereQuadrat == null){ | ||
Zeile 104: | Zeile 103: | ||
System.out.println("entschluesselt: "+entschluesselt); | System.out.println("entschluesselt: "+entschluesselt); | ||
} | } | ||
} | }</code> | ||
</code> |
Aktuelle Version vom 29. Februar 2024, 15:41 Uhr
Das Vigenere-Verfahren ist eine polyalphabetische Verschlüsselung, die die Caesar-Verschlüsselung erheblich verbessert. Es wurde im 16. Jahrhundert entwickelt und galt lange als sicher; erst 1854 wurde der sog. Kasiski-Test veröffentlicht, mit dem man das Vigenere-Verfahren für kurze Schlüssellängen bei ausreichender Textmenge knacken konnte. (Bei langen Schlüsseln, am besten so lang wie der Text selber, ist das Vigenere-Verfahren auch heute noch sicher.)
Verfahren
Verschlüsselung
- Unter den Klartext wird der Schlüssel geschrieben. Dabei wird der Schlüssel ggf. mehrfach wiederholt.
- Jetzt schaut man für jeden Buchstaben in der Tabelle nach (s. Grafik).
Entschlüsselung
- Man schreibt den Schlüssel unter den Geheimtext, dabei wiederholt man ggf. den Schlüssel.
- Jetzt geht man von dem Buchstaben des Schlüssels in der Tabelle nach rechts, bis man auf den geheimen Buchstaben trifft.
- Jetzt geht man nach oben und erhält den Buchstaben des Klartextes.
Implementierung
public class Vigenere {
private static char[][] vigenereQuadrat;
public static void vigenereQuadratErstellen(){
if(vigenereQuadrat == null){
vigenereQuadrat = new char['z'+1]['z'+1];
int zahl = 0;
for (char i = 'a'; i <= 'z'; i++) {
for(char j='a'; j <= 'z'; j++){
vigenereQuadrat[i][j] = j;
vigenereQuadrat[i][j] += zahl;
if(vigenereQuadrat[i][j] > 'z'){
vigenereQuadrat[i][j] -= 26;
}
}
zahl++;
}
}
}
public static void quadratDrucken(){
System.out.println("*** Das Vigenere-Quadrat ***");
if(vigenereQuadrat == null){
vigenereQuadratErstellen();
}
for (char i = 'a'; i <= 'z'; i++) {
for(char j='a'; j <= 'z'; j++){
System.out.print(vigenereQuadrat[i][j]);
}
System.out.println();
}
}
public static String entschluesseln(String pText, String pSchluessel) {
vigenereQuadratErstellen();
// alles auf Kleinbuchstaben bringen!
pText = pText.toLowerCase();
String ergebnis = "";
int laengeSchluessel = pSchluessel.length();
for(int i=0; i<pText.length(); i++){
char verschluesseltBuchstabe = pText.charAt(i);
int indexSchluessel = i%laengeSchluessel;
int schluesselBuchstabe = pSchluessel.charAt(indexSchluessel);
// den richtigen Buchstaben suchen!
char[] zeile = vigenereQuadrat[schluesselBuchstabe];
char textBuchstabe = 'a';
while(zeile[textBuchstabe] != verschluesseltBuchstabe){
textBuchstabe++;
}
ergebnis += textBuchstabe;
}
return ergebnis;
}
private static String verschluesseln(String pText, String pSchluessel) {
vigenereQuadratErstellen();
// Leerzeichen rausnehmen!
pText = pText.replaceAll(" ", "");
// alles auf Kleinbuchstaben bringen!
pText = pText.toLowerCase();
System.out.println("Nachricht ohne Leerzeichen und alles klein: "+pText);
String ergebnis = "";
int laengeSchluessel = pSchluessel.length();
for(int i=0; i<pText.length(); i++){
char textBuchstabe = pText.charAt(i);
int indexSchluessel = i%laengeSchluessel;
char schluesselBuchstabe = pSchluessel.charAt(indexSchluessel);
char verschluesseltBuchstabe = vigenereQuadrat[textBuchstabe][schluesselBuchstabe];
ergebnis += verschluesseltBuchstabe;
}
return ergebnis;
}
public static void main(String[] args) {
//quadratDrucken();
String schluessel = "test";
System.out.println("Schluessel: "+schluessel);
String nachricht = "Hallo zusammen wie gehts";
System.out.println("Nachricht: "+nachricht);
String verschluesselt = verschluesseln(nachricht, schluessel);
System.out.println("verschluesselt: "+verschluesselt);
String entschluesselt = entschluesseln(verschluesselt, schluessel);
System.out.println("entschluesselt: "+entschluesselt);
}
}