You are not logged in.

  • Login

1

Tuesday, January 8th 2008, 10:52pm

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:

Quoted

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":

Java Quellcode

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
public class codeknacker {
    public static void main(String[] args) {
	String[] dictionary = new String[1];
	dictionary[0] = "wintersonnenwende";
	String Dekodieren = "dpualyzvuuludlukl";
	String alpha = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
	int Laenge = Dekodieren.length();
	char[] Feld = new char[Laenge];
	char neu;
	String raus = "";
 
	for (int i = 0; i < Laenge; i++) {
	    Feld[i] = Dekodieren.charAt(i);
	}
 
	for (int j = 0; j < 26; j++) {
	    raus = "";
	    for (int i = 0; i < Laenge; i++) {
		neu = alpha.charAt(alpha.indexOf(Feld[i]) + j);
		raus += neu;
 
	    }
 
	    System.out.println(raus);
	    for (int k = 0; k < dictionary.length; k++) {
		if (raus.equals(dictionary[k])) {
		    System.out.println("Ergebnis: " + raus);
		    break;
		}
	    }
	}
    }
}


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. :(

2

Tuesday, January 8th 2008, 11:26pm

Hi,

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.

3

Thursday, January 10th 2008, 4:03am

RE: Caesar Code-Knacker

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


Java 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)


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


Java 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 :

Java 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 :

Java Quellcode

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
class CodeKnacker {
  public static void main(String[] args) {
  int k = 0;
  String[] dictionary = new String[100];
  dictionary[0] = "wintersonnenwende";
  String toDecode = "dpualyzvuuludlukl";
  int Laenge = toDecode.length();
  char[] Feld = new char[Laenge];
  char neu;
  String raus = "";
  for (int j = 0; j < 26; j++) {
    for (int i = 0; i < Laenge; i++) {
         neu = (char)(((toDecode.charAt(i)-97+j)%26)+97);
         raus += neu;
    }
    System.out.println(raus);
    while (dictionary[k] != null) {
        if (raus.contains(dictionary[k])) {
            System.out.println("Ergebnis: " + raus);
        break;
        }
        k++;
    }
    raus = "";
    k = 0;
  }
}
}

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
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
import java.io.*;
public class codeknacker {
  public static void main(String[] args) throws IOException {
  String dicFileName = "dic.txt"; //name der datei
  BufferedReader in = new BufferedReader( new FileReader( dicFileName  ) );  //bufferedReader
  String[] dictionary = new String[100];
  int k = 0;
  String line;
  String toDecode = "dpualyzvuuludlukl"; //string zu dekodieren
  int Laenge = toDecode.length();
  char[] Feld = new char[Laenge];
  char neu;
  String raus = "";
  line = in.readLine();   //aus der datei lesen
    while (line != null) {   //jede zeile lesen bis ende der datei
          dictionary[k] = line;
          line = in.readLine();
          k++;
    }
  for (int j = 0; j < 26; j++) {  //jedes mal um j verschieben
    for (int i = 0; i < Laenge; i++) {
         neu = (char)(((toDecode.charAt(i)-97+j)%26)+97);
         raus += neu;
    }
    System.out.println(raus);
    k = 0;
    while (dictionary[k] != null) { //suche nach dem wort
        if (raus.contains(dictionary[k])) {
            System.out.println("Ergebnis: " + raus);
        break;
        }
        k++;
    }
    raus = "";
    k = 0;
  }
}
}

4

Wednesday, January 16th 2008, 9:55pm

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.

Similar threads

Social bookmarks