Seite 1 von 1

einfacher caesar-code knacker

Verfasst: Mittwoch 28. Oktober 2009, 16:38
von r00t
Hi habe einen einfachen caesar-code-knacker entworfen. Er checkt einfach wie oft ein buchstabe in dem kodierten text vorkommt und setzt ihn mit e gleich. wenn er es nach mehreren versuchen(immer neuer buchstabe für e manchmal au der zweithäufigste etc) benutzt er brute-force

Code: Alles auswählen

def meisteletter (Str):	#herausfinden welcher buchstabe am oeftesten vorkommt
	Str=Str.upper()
	
	anzahl=0
	hoechsterbuchstabe=[]
	for letter in ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']:
		if letter in Ausnahmen:
			continue
		
		Strlist=list(Str)
		anzahl2=Strlist.count(letter)
		
		if anzahl<anzahl2:
			
			anzahl=anzahl2
			hoechsterbuchstabe=[letter]
			
		elif anzahl==anzahl2:			#wenn buchstaben gleich oft vorkommen
			hoechsterbuchstabe.append(letter)
			
	return hoechsterbuchstabe

def Entschluesslung(buchstabenauswahl,code):
	code=code.upper()
	for letter in buchstabenauswahl:
		differenz=ord(letter)-ord('E')	#verschiebung herausfinden
		if differenz<0:
			differenz+=26
		if differenz in mydifferenzen: #wenn schon gemacht
			continue
		else:
			mydifferenzen.append(differenz)	
		realtext='Hier der entschluesselte Text: \n'
		for i in code:
			if not i in ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',]: #sonderzeichen etc so lassen
				realasci=ord(i)
			else:
				realasci=ord(i)-differenz	
				if realasci<ord('A'):
					realasci+=26
			realtext=realtext+chr(realasci)
		print realtext
		antwort=raw_input('Stimmt dieser Text?(y/n): ')
		if antwort=='y':
			print 'Die Verschiebung betraegt: ' +str(differenz)
			return realtext
	return None	
codiert=raw_input('Geben Sie den codierten Text ein: ')
Ausnahmen=[]
oeftesterbuchstabe=meisteletter(codiert)
mydifferenzen=[]
for i in oeftesterbuchstabe:
	Ausnahmen.append(i)

a=Entschluesslung(oeftesterbuchstabe,codiert)
if a==None:
	zweitoeftesterbuchstabe=meisteletter(codiert)
	a=Entschluesslung(zweitoeftesterbuchstabe,codiert)
	if a==None:
		print 'Jetzt hilft nur noch Brute-Force!'
		a=Entschluesslung(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],codiert)
		if a==None:
			print ' Der Code ist nicht per Caesar codiert'
		
		

Verfasst: Mittwoch 28. Oktober 2009, 16:45
von numerix
Auweia, ist das ein schräger Code. Da weiß man gar nicht, wo man anfangen soll. Am besten ich verzichte ganz darauf (werden andere sicher in Kürze tun).

Stattdessen ein Hinweis zur Idee dahinter: Man kann die "Knackfähigkeit" dadurch verbessern, dass man nicht nur das "e" in Betracht zieht, sondern auch andere Buchstabenhäufigkeiten. Als Einstieg dazu: "http://de.wikipedia.org/wiki/Buchstabenhäufigkeit"

[Wenn ich das in URL-Tags setze, kommt gar kein Text mehr - das "ä" macht da irgendwas kaputt.]

Verfasst: Mittwoch 28. Oktober 2009, 16:46
von Hyperion
Hui... sieht leider recht grausam aus ;-)

Stichworte:
- kein PEP8
- sinnlose / unschöne Namensgebung ('Str'... brrrr)
- im string-Modul gibts alle Buchstaben gratis

Code: Alles auswählen

In [11]: import string

In [12]: string.lowercase
Out[12]: 'abcdefghijklmnopqrstuvwxyz'
- zu viel Code auf Modulebene
- kein Encoding angegeben
- es fehlt die Übergabe von Texten per Kommandozeilenparameter (bei Snippets evtl. ok, aber bei kompletten Programmen erwarte ich so was schon)

Zum Algo:
Nette Idee, klappt aber nur bei längeren Texten.
Wieso nimmst Du kein Dictionary für die Buchstaben und zählst jedes einzelne Vorkommen? Damit könntest Du ggf. sogar gegen eine normale Verteilung in deutschen Texten einen Text machen.

Verfasst: Mittwoch 28. Oktober 2009, 16:56
von r00t
ok danke ich werde mich in kürze daransetzen un ein besseres programm schreiben weil ich möchte meine programmierkenntnisee verbessern hab gerade erst angefangen...
könntet ihr mir tipps geben wie ich mich verbessern könnte(also programmierideen etc) damit ich nicht mehr so grausam programmiere??

Verfasst: Mittwoch 28. Oktober 2009, 17:13
von Hyperion
Naja, habe ich schon getan zum Teil.

Mein Tipp: Lies Dir mal PEP8 wirklich durch und versuche es zu befolgen. Alleine durch das Durchdenken von Namen bekommt man schon besseren Code.

Außerdem arbeite mal das Tutorial durch (aus der Doku). Dort lernst Du wirklich die grundlegenden Datentypen kennen. Ansonsten viel Fremd-Code angucken. Kommentiere Deinen Code! Und zwar nicht in jeder Zeile, sondern auf Modul-, Funktions und (später) Klassenebene. Hinzu ggf. Zeilenkommentare bei wirklich wichtigen Dingen im Quellcode.

Schau auf jeden Fall auch immer in die Standard-Lib in der Doku. Machst Du viel mit Strings, schadet ggf. ein Blick in diese Lib nicht. Willst Du Kommandozeilenparameter einlesen, gibts auch dafür ein Modul. Anhand der dortigen Beispiele lernt man übrigens auch einiges.

Tja, und sonst: Üben, üben, üben! :-)

Verfasst: Donnerstag 29. Oktober 2009, 13:26
von Pascal
Bei deiner Überarbeitung könntest du gleich noch einiges ergänzen:

Welche Buchstabenkombinationen gibt es überhaupt im Klartext?
(z.B. Nach `Q´ folgt immer `U´ oder viele Worte enden auf ´en`)

Kommt ein Wort mit 2 oder 3 Buchstaben vor?
Wie viele Wörter kennst du mit 2 Buchstaben? (Um, Du, Da, Wo...)
Viele sind es nicht.

Verfasst: Donnerstag 29. Oktober 2009, 13:43
von Rebecca
Nicht direkt zum Code, aber der Superlativ von oft ist am meisten. :wink:

Verfasst: Donnerstag 29. Oktober 2009, 16:04
von ms4py

Verfasst: Donnerstag 29. Oktober 2009, 16:27
von derdon
In der letzten Zeile ist ein Klammernpaar unnötig, da exakt eine Generator Expression übergeben wird

Verfasst: Donnerstag 29. Oktober 2009, 20:13
von birkenfeld
Hier ist ein kleines Skript, das die wahrscheinlichste Verschiebung anhand einer Art von "Summe der Quadrate" ermittelt:

http://paste.pocoo.org/show/147744/