einfacher caesar-code knacker

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
r00t
User
Beiträge: 7
Registriert: Samstag 18. April 2009, 12:58

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'
		
		
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.]
Zuletzt geändert von numerix am Mittwoch 28. Oktober 2009, 16:48, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
r00t
User
Beiträge: 7
Registriert: Samstag 18. April 2009, 12:58

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??
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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! :-)
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Nicht direkt zum Code, aber der Superlativ von oft ist am meisten. :wink:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

In der letzten Zeile ist ein Klammernpaar unnötig, da exakt eine Generator Expression übergeben wird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Hier ist ein kleines Skript, das die wahrscheinlichste Verschiebung anhand einer Art von "Summe der Quadrate" ermittelt:

http://paste.pocoo.org/show/147744/
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten