Caesar Chiffre Bruteforce

Kruemel

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

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

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

Top Contributor
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

Top Contributor
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.
 
Zuletzt bearbeitet:

Crian

Top Contributor
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.
 

Kruemel

Mitglied
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

Bekanntes Mitglied
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.
 

Ähnliche Java Themen

Neue Themen


Oben