Caesar Code-Knacker

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Caesar Code-Knacker

    Liebe Leute,

    ich habe dieses Forum über Google gefunden und mich in der Hoffnung registriert, hier eventuell Hilfe zu finden.
    Folgendes Problem: Ich habe eine Aufgabe zu lösen, für die ich mit jemandem gemeinsam auch schon den Quellcode geschrieben habe, allerdings bin ich mir - aufgrund mangelnder Java-Kenntnisse - nicht sicher, ob die Lösung stimmt. Ich würde mich darum freuen, wenn jemand von euch einmal drüber schauen und mir sagen könnte, was da verbesserungsfähig oder gar falsch ist.

    Zunächst die Aufgabe:
    Im alten Rom wurden unter Cäsar geheime Nachrichten durch ein einfaches Verfahren verschlüsselt, indem jedes Zeichen der Nachricht char message[0...n] (als char-Feld der Länge n) durch zyklisches Verschieben im Standardalphabet (’a’ . . . ’z’) um einen festen Wert (den Schlüssel) in die verschlüsselten Nachricht secret[0...n] kodiert wird. So wird z. B. bei einem Schlüssel k=2 mit
    Klartextzeichen a b c . . . y z
    verschlüsselt c d e . . . a b
    aus message = "ahoi" die verschlüsselte Nachricht secret = "cjqk". Zur Vereinfachung werden Leerzeichen weggelassen und alle Zeichen in Kleinbuchstaben konvertiert. Schreiben Sie ein „Crack“-Programm, das versucht, eine verschlüsselte Nachricht zu knacken,
    indem es
    • alle möglichen Schlüssel durchprobiert,
    • die durch Anwendung eines Schlüssels erhaltene Zeichenkette unter Verwendung eines Wörterbuchs auf sinnvolle Wörter prüft.

    Hinweis 1: Das Wörterbuch können Sie als Feld von Strings (String[] dictionary) implementieren, wobei die Wörter entweder beispielhaft direkt im Programmtext angegeben (einfach) oder aus einer Datei geladen (anspruchsvoll) werden.
    Hinweis 2: Auf Grund der ASCII-Kodierung der Zeichen des Alphabets kann man mit Zeichen einfach “rechnen“. So ist z. B. ‘a‘+ 10 = ‘k‘. Nach ‘z‘ beginnt der Zyklus wieder mit ‘a‘.


    Und hier unser "Versuch":

    Quellcode

    1. public class codeknacker {
    2. public static void main(String[] args) {
    3. String[] dictionary = new String[1];
    4. dictionary[0] = "wintersonnenwende";
    5. String Dekodieren = "dpualyzvuuludlukl";
    6. String alpha = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
    7. int Laenge = Dekodieren.length();
    8. char[] Feld = new char[Laenge];
    9. char neu;
    10. String raus = "";
    11. for (int i = 0; i < Laenge; i++) {
    12. Feld[i] = Dekodieren.charAt(i);
    13. }
    14. for (int j = 0; j < 26; j++) {
    15. raus = "";
    16. for (int i = 0; i < Laenge; i++) {
    17. neu = alpha.charAt(alpha.indexOf(Feld[i]) + j);
    18. raus += neu;
    19. }
    20. System.out.println(raus);
    21. for (int k = 0; k < dictionary.length; k++) {
    22. if (raus.equals(dictionary[k])) {
    23. System.out.println("Ergebnis: " + raus);
    24. break;
    25. }
    26. }
    27. }
    28. }
    29. }
    Alles anzeigen


    Wir haben noch ein Problem mit dem Wörterbuch, denn fügen wir mehrere Wörter mittels dictionary[1] usw. hinzu, dann wird ein Fehler ausgegeben.
    Entschuldigt, wenn das alles nicht stimmt, aber wir sind ziemliche Dummies auf diesem Gebiet. :(
  • Hi,

    nullkomma schrieb:

    denn fügen wir mehrere Wörter mittels dictionary[1] usw. hinzu, dann wird ein Fehler ausgegeben.

    Fehlermeldungen immer posten. Dann wissen wir auch was falsch ist. Habt ihr denn die Länge des Arrays gleichzeitig vergrößert
    String[] dictionary = new String[5];
    dictionary[4] = "wintersonnenwende";


    mal ein paar Korrekturen und Schönheitsfehler:
    • Den Anfangsbuchstaben von Klassen immer groß schreiben.
    • Die 26 solltest du irgendwo als Konstante definieren.
    • char[] Feld = Dekodieren.toCharArray(); ist doch viel einfacher als eine Schleife zu bemühen
    • ich würde sagen in #28 muss ein break 2 hin, weil du aus beiden for-Schleifen springen willst.
  • RE: Caesar Code-Knacker

    u. u. u.
    also ..
    wir fangen von vorne an:


    Quellcode

    1. String[] dictionary = new String[1];

    dies bringt dir NICHTS .
    konstruiere einen grossen array, dann überprüfe die felder auf null .. (siehe in meinen Code)


    Quellcode

    1. String alpha = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";


    das brauchst du auch nicht, da char auch als int betrachtet werden könnten.
    ascii-wert von a = 97 --> z = 97 + 26. (siehe auch in meinen code wie ich das gemacht habe)

    Java-Quellcode

    1. neu = (char)(((toDecode.charAt(i)-97+j)%26)+97);


    Quellcode

    1. if (raus.equals(dictionary[k]))

    das gibt dir IMMER falsch da du nicht die selben Objekten hast (String ist ein objekt !)
    also du hast 2 Objekte. mit equals überprüfst du ob die objekte in die selbe adresse pointen (existiert das wort ? :D)
    du könntest die string mit der methode contains überprüfen.
    also mit :

    Quellcode

    1. if (raus.contains(dictionary[k]))

    und noch was .. du hast die Initialisierung von raus vergessen ..
    nach der 2ten for-schleife musste du raus initialisieren .. also raus = "";

    und das ganze sieht so aus :

    Quellcode

    1. class CodeKnacker {
    2. public static void main(String[] args) {
    3. int k = 0;
    4. String[] dictionary = new String[100];
    5. dictionary[0] = "wintersonnenwende";
    6. String toDecode = "dpualyzvuuludlukl";
    7. int Laenge = toDecode.length();
    8. char[] Feld = new char[Laenge];
    9. char neu;
    10. String raus = "";
    11. for (int j = 0; j < 26; j++) {
    12. for (int i = 0; i < Laenge; i++) {
    13. neu = (char)(((toDecode.charAt(i)-97+j)%26)+97);
    14. raus += neu;
    15. }
    16. System.out.println(raus);
    17. while (dictionary[k] != null) {
    18. if (raus.contains(dictionary[k])) {
    19. System.out.println("Ergebnis: " + raus);
    20. break;
    21. }
    22. k++;
    23. }
    24. raus = "";
    25. k = 0;
    26. }
    27. }
    28. }
    Alles anzeigen

    du könntest immer in dictionnary wörter rein machen ..
    dictionary[1] = "blabla";
    dictionary[2] = "was weisst ich";


    die zweite Varianten wenn die wörter aus einer Datei geladen werden sollen siehst so aus :

    Java-Quellcode

    1. import java.io.*;
    2. public class codeknacker {
    3. public static void main(String[] args) throws IOException {
    4. String dicFileName = "dic.txt"; //name der datei
    5. BufferedReader in = new BufferedReader( new FileReader( dicFileName ) ); //bufferedReader
    6. String[] dictionary = new String[100];
    7. int k = 0;
    8. String line;
    9. String toDecode = "dpualyzvuuludlukl"; //string zu dekodieren
    10. int Laenge = toDecode.length();
    11. char[] Feld = new char[Laenge];
    12. char neu;
    13. String raus = "";
    14. line = in.readLine(); //aus der datei lesen
    15. while (line != null) { //jede zeile lesen bis ende der datei
    16. dictionary[k] = line;
    17. line = in.readLine();
    18. k++;
    19. }
    20. for (int j = 0; j < 26; j++) { //jedes mal um j verschieben
    21. for (int i = 0; i < Laenge; i++) {
    22. neu = (char)(((toDecode.charAt(i)-97+j)%26)+97);
    23. raus += neu;
    24. }
    25. System.out.println(raus);
    26. k = 0;
    27. while (dictionary[k] != null) { //suche nach dem wort
    28. if (raus.contains(dictionary[k])) {
    29. System.out.println("Ergebnis: " + raus);
    30. break;
    31. }
    32. k++;
    33. }
    34. raus = "";
    35. k = 0;
    36. }
    37. }
    38. }
    Alles anzeigen
  • d0nut schrieb:

    Fehlermeldungen immer posten. Dann wissen wir auch was falsch ist. Habt ihr denn die Länge des Arrays gleichzeitig vergrößert
    String[] dictionary = new String[5];
    dictionary[4] = "wintersonnenwende";

    Erst einmal vielen Dank euch beiden, dass ihr euch so schnell die Mühe gemacht habt und entschuldigt meine verspätete Antwort! (Etwas unhöflich, ich weiß.)
    Genau das war unser Fehler, wir haben die Länge des Arrays nicht vergrößert. Ja, das sind alles so Sachen, die im Grunde genommen so logisch sind, dass man sich fragt, wie man überhaupt so einen Fehler machen kann, aber da wir mehr als nur ein bisschen Anfänger auf diesem Gebiet sind, lernen wir erst mit solchen Fehlern, was was bedeutet...in dieser uns bisher noch sehr geheimnisvollen Sprache.

    Ich habe mir eure Verbesserungsvorschläge angesehen, wenn auch nicht alle 100%ig verstanden, so doch in meinen Augen erstaunlich viel.

    Also: Nochmals Danke für eure Hilfe!

    Und in der Hoffnung, diese Sprache irgendwann genauso zu durchsteigen wie ihr, beende ich diesen Beitrag erst einmal.