Vigenere-Verschlüsselung: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(Die Seite wurde neu angelegt: „Kategorie:Kryptographie Kategorie:Informatik-Abitur Kategorie:Informatik“) |
|||
(9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
[[Kategorie:Informatik-Abitur]] | [[Kategorie:Informatik-Abitur]] | ||
[[Kategorie:Informatik]] | [[Kategorie:Informatik]] | ||
[[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 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== | |||
<code>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); | |||
} | |||
}</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);
}
}