# Caesar Chiffre Bruteforce



## Kruemel (20. Apr 2011)

Hi miteinander!

Ich versuche mich zur Zeit an einem Programm das Caesar Chiffren knackt.

Das ganze funktioniert auch schon aber nicht unbedingt höchst zuverlässig.
Mein Vorgehen ist folgendes:

1) Alle Möglichkeiten ausprobieren und bei jeder Möglichkeit e, n, i, s, r in einem 'Statistic' Objekt auszählen.
2) In der Hauptfunktion werden dann die Statistic Objekte immer mit einer compare-Funktion verglichen und jeweils der Zähler für das beste Resultat gespeichert.
3) Am Ende der Schleife steht die Verschiebung mit dem besten Ergebnis in der Variable.

Meine Frage betrifft die Buchstabenanalyse. Ich gehe momentan wie folgt vor:

Das ist die Hauptfunktion:


```
public String crack (){
	
		Statistic best=getStatisticObject();  //<-- es sollen Statisticobjekte für Deutsch und
		int besti=0;                                   //Englisch unterstützt werden
		
		for(int i=0; i<26; i++){
			String text = getKTA(i);         // Hier wird entschlüsselt
			Statistic stat = analyze(text); // analyze zählt die Buchstaben aus
			if(best.compare(stat)>3){     //<-- Hier liegt der Hase begraben
				besti=i;
				best=stat;
			}
		}
		
		return getKTA(besti);
	}
```

Die compare Funktion des Statistic-Objects sieht wie folgt aus:


```
public float compare(Statistic s){
		float i=0;
		if(s.getPercent('E')>this.getPercent('E'))
			i=i+2;
		if(s.getPercent('N')>this.getPercent('N'))
			i=i+1;
		if(s.getPercent('I')>this.getPercent('I'))
			i=i+(float)0.5;
		if(s.getPercent('S')>this.getPercent('S'))
			i=i+(float)0.3;
		if(s.getPercent('R')>this.getPercent('R'))
			i=i+(float)0.3;
		return i;
	}
```

Für mehr E's gibts mehr "Punkte" als für mehr R's... irgendwie primitiv.
In der Hauptfunktion wird ein Resultat das einen um 3 (2, 1 möglich) besseren Wert hat als Ergebnis übernommen... Diese 3 bzw. 2 entstand aber eher durch ausprobieren...
Ich habe nirgendwo ein anständiges Beispiel für eine Buchstabenanalyse gefunden, jemand eine Idee wie man da optimal vorgeht?

Gruß, Kruemel


----------



## Final_Striker (20. Apr 2011)

Irgendwie verstehe ich dein Vorgehen nicht.
Nach dem Verschieben der Buchstaben bekommt du ja die Lösung wenn du den Schlüssel gefunden hast oder halt nicht.

Was bezweckst du aber mit diesem Vergleichen von E, N, I, S, R ???


----------



## Andi_CH (20. Apr 2011)

Es wird wohl darum gehen die statistische Häugigkeit von Buchstaben auszunutzen um festzustellen wann die richtige Verschiebung eingestellt ist.

as wird ausgezählt und dann mit irgend einer Häufigkeit gewichtet - so primitiv ist das Verfahren gar nicht, wenn es denn richtig angewandt wird. Der Cäsar ist ja auch ein benaler Algorithums also dürfte dieser Ansatz schon zum Erfolg führen.

Nur sehe ich da irgendiwe kein Java-spezifisches Problem.


----------



## Crian (20. Apr 2011)

Vielleicht hilft dir

Buchstabenhäufigkeit ? Wikipedia

weiter, insbesondere für eine genauere Gewichtung der Buchstaben. Neben den Häufigsten könnte man zur Abgrenzung gegen Englisch auch die seltenen wichten, etwa y, das im Englischen wesentlich häufiger vorkommt.

Je kürzer der Text, desto ungenauer ist die Methode allerdings.


----------



## Final_Striker (20. Apr 2011)

Achso, ok. Bin von einem einzelnen Wort ausgegangen. Bei einem längerem Text, könnte das natürlich funktionieren.


----------



## Landei (20. Apr 2011)

Im Internet finden sich auch deutsche Wortlisten, damit könnte man effektiver abgleichen.


----------



## Kruemel (20. Apr 2011)

Das mit den Wortlisten ist ne super Idee gewesen. Einfach "Standardwörter" suchen (der, die, das, usw. Wikipedia hat ne Liste mit 207 Stück).

Danke!

Das Buchstabenauszählen schreitet dann erst als Plan B ein wenn kein passendes Wort gefunden wurde.

Gruß, Kruemel


----------



## Logaff (20. Apr 2011)

ja einfach Artikel(der, die, das, ein) und Personalpronomen(ich, du, er, sie, es, wir, ihr, (sie)) ich denk mal das wär die minimalistische Abgleichmethode.

könnte übrigens auch bei Anagrammen funktionieren, da muss aber die Wordlist wesentlich größer sein.


----------



## Kar (21. Apr 2011)

Wenn du eine geeignete Wortliste gefunden hast, kannst du den Bloomfilter anwenden. Sollte bei Cäsar genügen.


----------

