Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

[leicht bis schwer]Krypto-Analyse

Diskussion: [leicht bis schwer]Krypto-Analyse im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Eingereicht von Tarantoga Beschreibung: Ziel dieser Aufgabe ist es eine Anwendung zu schreiben, die es ermöglicht einen verschlüsselten Text ...

Antwort
Alt 25.11.10, 17:53   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard [leicht bis schwer]Krypto-Analyse

Anzeige

Eingereicht von Tarantoga

Beschreibung: Ziel dieser Aufgabe ist es eine Anwendung zu schreiben, die es ermöglicht einen verschlüsselten Text zu analysieren, zu bearbeiten und (im Idealfall) zu entschlüsseln. Um das zu können muss die Anwendung über folgende Eigenschaften verfügen:

Einfach
Die Anwendung muss es ermöglichen eine Textdatei mit einem verschlüsselten Text einzulesen.
Um den Text zu analysieren muss die Anwendung folgende Werte ermitteln können:
- die Länge des Textes
- die Häufigkeit der einzelnen Zeichen
Um den Text bearbeiten zu können muss die Anwendung über eine Methode "Suchen & Ersetzen" verfügen, die es ermöglicht bestimmte Zeichen des Textes durch andere Zeichen zu ersetzen (z. B. alle "A" durch "B")
Um die Veränderungen an dem Text zu erhalten, muss die Anwendung natürlich über eine Methode verfügen den bearbeiteten Text in einer neuen Datei zu speichern.

Fortgeschritten
Um die Anwendung etwas mächtiger zu machen, kann man die Methode "Suchen & Ersetzen" differenzierter gestalten, z. B. so das sie es auch ermöglicht nicht nur alle Zeichen eines bestimmten Typs, sondern nur Zeichen an einer bestimmten Stelle zu ersetzen.

Schwierig
Darüber hinaus kann man natürlich bekannte Chiffrier Algorithmen, z. B. den Caesar-Code oder die Vigenére-Chiffre, implementieren und auf den Text anwenden lassen und so versuchen ihn zu entschlüsseln. Beim Caesar-Code könnte der User eine Zahl angeben und die Anwendung verschiebt dann alle Buchstaben des Textes entsprechend, oder einen Bereich von Zahlen (z. B. 1-26) und die Anwendung arbeitet sie nacheinander ab...
Analog dazu kann der User bei der Vigenére-Chiffre ein Wort angeben, das die Anwendung dann als Schlüssel auf den Text anwendet...

__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 27.11.10, 16:01   #2 (permalink)
Moderator
 
Benutzerbild von Tarantoga
 
Registriert seit: 11.02.06
Tarantoga QuadcoreTarantoga QuadcoreTarantoga QuadcoreTarantoga QuadcoreTarantoga QuadcoreTarantoga Quadcore
Likes: 229
Standard

Hier mal mein erster Entwurf, bzw. Lösungsansatz, wie immer in Java:
Quellcode   
Code:
import java.io.*;

public class KryptoAnalyseHabo 
{//class KryptoAnalyseHabo
    private static void vigChiffre(String kryptText)throws IOException
    {//vigChiffre()
        int textLaenge, schluesselLaenge;
        String schluessel, auswahl;
        char[] textVig;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("*** Vigenére Chiffre ***");
        System.out.println("\nBitte geben sie ein Wort als Schlüssel ein:");
        schluessel=ein.readLine();
        
        textLaenge=kryptText.length();
        schluesselLaenge=schluessel.length();
        textVig=new char[textLaenge];
        for(int i=0, j=0; i<textLaenge; i++, j++)
        {
            if(j==schluesselLaenge)j=0;
            textVig[i]=(char)(kryptText.charAt(i)-schluessel.charAt(j));
        }
        kryptText="0";
        for(int i=0; i<textLaenge; i++)
        {
            kryptText=kryptText+Character.toString(textVig[i]);
        }
        kryptText=kryptText.substring(1);
        System.out.println("Der Text wurde mit "+schluessel+" als Schluessel dechiffriert:");
        System.out.println(kryptText);
        System.out.println("\n(T)ext bearbeiten, Text (s)peichern, (B)eenden?");
        auswahl=ein.readLine();
        
        if(auswahl.equals("T")||auswahl.equals("t"))
        {
            bearbeiten(kryptText);
        }
        else if(auswahl.equals("S")||auswahl.equals("s"))
        {
            dateiSpeichern(kryptText);
        }
        else if(auswahl.equals("B")||auswahl.equals("b"))
        {
            System.out.println("\nProgramm beendet...");
            System.exit(0);
        }
        else
        {
            System.out.println("Ungültige Eingabe!");
            vigChiffre(kryptText);
        }
    }//vigChiffre()
    private static void caesar(String kryptText)throws IOException
    {//caesar()
        int schluessel, laenge;
        char[] textVerschoben;
        String auswahl;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("*** Caesar Code ***");
        System.out.println("\nBitte geben sie eine Zahl als Schlüssel ein:");
        schluessel=Integer.parseInt(ein.readLine());
        
        laenge=kryptText.length();
        textVerschoben=kryptText.toCharArray();
        for(int i=0; i<laenge; i++)
        {
            textVerschoben[i]=(char)(textVerschoben[i]-schluessel);
        }
        kryptText="0";
        for(int i=0; i<laenge; i++)
        {
            kryptText=kryptText+Character.toString(textVerschoben[i]);
        }
        kryptText=kryptText.substring(1);
        System.out.println("Text wurde mit "+schluessel+" als Schlüsselwert dechiffriert:");
        System.out.println(kryptText);
        System.out.println("\n(T)ext bearbeiten, Text (s)peichern, (B)eenden?");
        auswahl=ein.readLine();
        
        if(auswahl.equals("T")||auswahl.equals("t"))
        {
            bearbeiten(kryptText);
        }
        else if(auswahl.equals("S")||auswahl.equals("s"))
        {
            dateiSpeichern(kryptText);
        }
        else if(auswahl.equals("B")||auswahl.equals("b"))
        {
            System.out.println("\nProgramm beendet...");
            System.exit(0);
        }
        else
        {
            System.out.println("Ungültige Eingabe!");
            caesar(kryptText);
        }
    }//caesar()
    private static void dechiffrierenMenue(String kryptText)throws IOException
    {//dechiffrierenMenue()
        String auswahl;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("**** Text dechiffrieren ***");
        System.out.println("\n1 - Caesar Code");
        System.out.println("2 - Vigenére Chiffre");
        System.out.println("Welchen Algorithmus wollen sie auf den Text anwenden?");
        auswahl=ein.readLine();
        
        if(auswahl.equals("1"))
        {
            caesar(kryptText);
        }
        else if(auswahl.equals("2"))
        {
            vigChiffre(kryptText);
        }
        else
        {
            System.out.println("Ungültige Eingabe!");
            dechiffrierenMenue(kryptText);
        }
    }//dechiffrierenMenue()
    private static void bearbeiten(String kryptText)throws IOException
    {//bearbeiten()
        String auswahl, datei;
        char muster, neu;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("*** Text bearbeiten ***");
        System.out.println(kryptText);
        System.out.println("\n(S)uchen & ersetzen, (D)echiffrieren, (T)ext speichern, (B)eenden");
        auswahl=ein.readLine();
        
        if(auswahl.equals("S")||auswahl.equals("s"))
        {
            System.out.println("Welches Zeichen möchten sie ersetzen?");
            muster=ein.readLine().charAt(0);
            System.out.println("Durch welches Zeichen wollen sie "+muster+" ersetzen?");
            neu=ein.readLine().charAt(0);
            kryptText=kryptText.replace(muster, neu);
            //System.out.println(kryptText);
            bearbeiten(kryptText);
        }
        else if(auswahl.equals("D")||auswahl.equals("d"))
        {
            dechiffrierenMenue(kryptText);
        }
        else if(auswahl.equals("T")||auswahl.equals("t"))
        {
            dateiSpeichern(kryptText);
        }
        else if(auswahl.equals("B")||auswahl.equals("b"))
        {
            System.out.println("\nProgramm beendet...");
            System.exit(0);
        }
        else
        {
            System.out.println("\nUngültige Eingabe!");
            bearbeiten(kryptText);
        }
    }//bearbeiten()
    private static void analysiere(String kryptText)throws IOException
    {//analysiere()
        int zeichenGesamt;
        char[]kryptChar;
        int[]counter;
        boolean[]doppelt;
        String auswahl;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        zeichenGesamt=kryptText.length();
        counter=new int[zeichenGesamt];
        doppelt=new boolean[zeichenGesamt];
        kryptChar=kryptText.toCharArray();
        
        for(int i=0; i<zeichenGesamt; i++)
        {
            for(int j=0; j<zeichenGesamt; j++)
            {
                if(kryptChar[i]==kryptChar[j])
                {
                    counter[i]++;
                }
            }
        }
        System.out.println("Text:\n"+kryptText);
        System.out.println("Der Text besteht aus "+zeichenGesamt+" Zeichen");
        System.out.println("Häufigkeitsanalyse:");
        
        for(int i=0; i<zeichenGesamt; i++)
        {
            for(int j=i+1; j<zeichenGesamt; j++)
            {
                if(kryptChar[i]==kryptChar[j])
                {
                    doppelt[j]=true;
                }
                if(doppelt[i]!=true)
                {
                    System.out.print(">"+kryptChar[i]+"< Anzahl: "+counter[i]+" ");
                    for(int k=0; k<counter[i]; k++)
                    {
                        System.out.print("*");
                    }
                    System.out.print("\n");
                    doppelt[i]=true;
                }
            }
        }
        
        System.out.println("(T)ext bearbeiten, Text (s)peichern oder (B)eenden?");
        System.out.println("Ihre Wahl?");
        auswahl=ein.readLine();
        
        if(auswahl.equals("T")||auswahl.equals("t"))
        {
            bearbeiten(kryptText);
        }
        else if(auswahl.equals("S")||auswahl.equals("s"))
        {
            dateiSpeichern(kryptText);
        }
        else if(auswahl.equals("B")||auswahl.equals("b"))
        {
            System.out.println("Programm beendet...");
            System.exit(0);
        }
        else
        {
            System.out.println("\nUngültige Eingabe!");
            analysiere(kryptText);
        }
    }//analysiere()
    private static void dateiSpeichern(String kryptText)throws IOException
    {
        int textLaenge=kryptText.length();
        char[] dateiInhalt=new char[textLaenge+1];
        String datei;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("*** Text speichern ***");
        System.out.println("\nUnter welchem Namen wollen sie den Text speichern?");
        datei=ein.readLine();
        BufferedWriter dateiSchreiber=new BufferedWriter(new FileWriter(datei+".txt"));
        
        for(int i=0; i<textLaenge; i++)
        {
            dateiInhalt[i]=kryptText.charAt(i);
            dateiSchreiber.write(dateiInhalt[i]);
        }
        dateiSchreiber.close();
        menue();
    }
    private static void dateiLaden()throws IOException
    {//dateiLaden()
        String dateiInhalt="0", datei, zeile, kryptText;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("*** Datei laden ***");
        System.out.println("\nWelche Datei soll geladen werden?");
        datei=ein.readLine();
        
        try
        {
            BufferedReader dateiLeser=new BufferedReader(new FileReader(datei+".txt"));
            
            while((zeile=dateiLeser.readLine())!=null)
            {
                dateiInhalt=dateiInhalt+zeile+"\n";
            }
            kryptText=dateiInhalt.substring(1, dateiInhalt.length()-1);
            analysiere(kryptText);
        }
        catch(java.io.FileNotFoundException e)
        {
            System.out.println("Datei >"+datei+"< konnte nicht gefunden werden...");
            System.out.println("Bitte überprüfen sie die Schreibweise und stellen Sie");
            System.out.println("sicher, dass sich die Datei im Ordner >KryptoAnalyseHabo< befindet!\n");
            menue();
        }
    }//dateiLaden()
    private static void menue()throws IOException
    {//menue()
        String auswahl, datei;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("*** KryptoAnalyzer (Habo) ***");
        System.out.println("1 - Datei laden");
        System.out.println("2 - Programm beenden");
        System.out.println("Ihre Wahl?");
        auswahl=ein.readLine();
        
        if(auswahl.equals("1"))
        {
            dateiLaden();
        }
        else if(auswahl.equals("2"))
        {
            System.out.println("Programm beendet...");
            System.exit(0);
        }
        else
        {
            System.out.println("Ungültige Eingabe!");
            menue();
        }
    }//menue()
    public static void main(String[]args)throws IOException
    {//main()
        menue();
    }//main()
}//class KryptoAnalyseHabo


Dieser Entwurf unterstützt zwar bereits den Caesar Code und die Vigenére Chiffre, dabei habe ich aber sozusagen geschummelt, denn der Algorithmus arbeitet nicht mit Buchstaben, sondern mit chars - das hat zwar den Vorteil das auch Sonderzeichen "verschlüsselt/entschlüsselt" werden können, führt aber auch teilweise zu seltsam anmutenden Ausgaben...
Darüber hinaus muss der User bis jetzt beim Caesar Code den Schlüssel für jeden Versuch einzeln eingeben, was bei vielen Versuchen recht unkomfortabel ist. Auch das Suchen&Ersetzen ist noch ganz einfach gehalten und ermöglicht bislang nur alle Zeichen eines Typs zu ersetzen.
Ausserdem gibt es sicher noch massig andere Dinge die man einbauen, bzw. verbessern könnte - doch da gleich der BVB spielt, muss das alles warten...
Tarantoga ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » [leicht bis schwer]Krypto-Analyse
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61