Vigenere-Verschlüsselung: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
 
 
(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


Quelle: Wikimedia

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);
   }
}