Seite 1 von 1
XECryption knacken
Verfasst: Samstag 16. Dezember 2006, 21:50
von rumilmirion
Hab mir vorhin ne Funktion zum knacken von XECryption geschrieben. Paar Anmerkungen vorerst: Hab's auf schnell gemacht, also wahrscheinlich nicht sonderlich elegant. Als Argument ist standardmässig ein Dateiname erwartet, wer will, kann durch setzen des zweiten Arguments auf alles ausser 'file' auch nen String angeben, was bei XECrypt aber ziemlich lang wird. Die Funktion funktioniert
nicht bei einzelnen Wörtern, sondern nur bei längeren Texten.
Code: Alles auswählen
def XECryptCrack(cypher,mode='file'):
if mode == 'file':
cypher = file(cypher,'r').read()
enc_list = []
for item in cypher.split('.'):
if item != '':
enc_list.append(item)
counter = 1
enc_list_added = []
while counter < len(enc_list):
enc_list_added.append(int(enc_list[counter-1])+int(enc_list[counter])+int(enc_list[counter+1]))
counter += 3
count_max=0
for item in enc_list_added:
if enc_list_added.count(item) > count_max:
count_max = enc_list_added.count(item)
item_max = item
key = int(item_max) - 32
dec_list = []
for item in enc_list_added:
dec_list.append(int(item)-key)
readable_str = ''
for item in dec_list:
readable_str += chr(item)
return readable_str
Verfasst: Samstag 16. Dezember 2006, 23:32
von BlackJack
Erstmal der Quelltext mit ein paar Verbesserungen:
Code: Alles auswählen
def XECryptCrack(cypher, mode='file'):
if mode == 'file':
crypted_file = open(cypher, 'r')
cypher = crypted_file.read()
crypted_file.close()
enc_list = [int(item) for item in cypher.split('.') if item]
enc_list_added = list()
for i in xrange(0, len(enc_list), 3):
enc_list_added.append(sum(enc_list[i:i+3]))
histogram = dict()
for item in enc_list_added:
histogram[item] = histogram.get(item, 0) + 1
item_max = None
count_max = 0
for key, count in histogram.iteritems():
if count > count_max:
count_max = count
item_max = key
key = item_max - 32
return ''.join(chr(item - key) for item in enc_list_added)
Die Datei wird geschlossen, die Dreiergrüppchen werden durch Slicing gebildet und das Histogramm ersetzt den Algorithmus zur Bestimmung den häufigsten Codes mit der Quadratischen Laufzeit durch einen mit linearer Laufzeit.
Und nun noch die obligatorische, FP-like Lösung:
Code: Alles auswählen
from itertools import izip
from operator import itemgetter
def xecrypt_crack(crypted_text):
numbers = (int(item) for item in crypted_text.split('.') if item)
sums = map(sum, izip(numbers, numbers, numbers))
histogram = dict()
for number in sums:
histogram[number] = histogram.get(number, 0) + 1
dummy, maybe_space = max((count, code)
for code, count in histogram.iteritems())
key = maybe_space - ord(' ')
return ''.join(chr(number - key) for number in sums)
Verfasst: Sonntag 17. Dezember 2006, 01:14
von rumilmirion
Gibt es einen bestimmten Grund, warum
Code: Alles auswählen
crypted_file = open(cypher,'r')
cypher = crypted_file.read()
besser als
ist, oder ist das mehr Geschmackssache?
Das gleiche mit
entgegen
- gibt's da Gründe, warum das eine besser ist als das andere?
Zum zweiten Code-Beispiel kann ich vorerst mal nur Hä? sagen.

Werd's mir auf jeden Fall genauer anschauen. Danke schon mal für die Verbesserungen!
Verfasst: Sonntag 17. Dezember 2006, 09:13
von birkenfeld
rumilmirion hat geschrieben:Gibt es einen bestimmten Grund, warum
Code: Alles auswählen
crypted_file = open(cypher,'r')
cypher = crypted_file.read()
besser als
ist, oder ist das mehr Geschmackssache?
Du behältst eine Referenz auf die Datei, auf der du später close() aufrufen kannst. Im Falle eines kurzen Skripts ist das allerdings eher unwichtig, da spätestens bei Programmende alle offenen Dateien geschlossen werden.
Wenn die Programme allerdings länger laufen, ist es schon sinnvoll, alle Dateien explizit wieder zu schließen (gerade unter Windows, wo selbst das Öffnen nur zum lesen andere Prozesse am Zugriff auf die Datei hindert).
Das gleiche mit
entgegen
- gibt's da Gründe, warum das eine besser ist als das andere?
Nein, das ist Geschmackssache.
Verfasst: Sonntag 17. Dezember 2006, 14:18
von Leonidas
birkenfeld hat geschrieben:Nein, das ist Geschmackssache.
Schon das dritte mal, dass jemand das fragt. Sollten wir vielleicht mal in die FAQ schreiben.
Verfasst: Sonntag 17. Dezember 2006, 14:38
von birkenfeld
Gute Idee.
[wiki]FAQ#GibtEsEinenUnterschiedZwischenlistBzwdict[/wiki]
Verfasst: Sonntag 17. Dezember 2006, 19:41
von rumilmirion
birkenfeld hat geschrieben:Du behältst eine Referenz auf die Datei, auf der du später close() aufrufen kannst. Im Falle eines kurzen Skripts ist das allerdings eher unwichtig, da spätestens bei Programmende alle offenen Dateien geschlossen werden.
Wenn die Programme allerdings länger laufen, ist es schon sinnvoll, alle Dateien explizit wieder zu schließen (gerade unter Windows, wo selbst das Öffnen nur zum lesen andere Prozesse am Zugriff auf die Datei hindert).
Das mit der offenen Referenz war mir klar - hab das Zumachen der Datei in dem Fall vergessen, normal mach ich's auch. Ich meinte in dem Fall warum der Zweizeiler - erste Zeile öffnen, zweite Zeile lesen - besser als der Einzeiler - öffnen und lesen auf der gleichen Zeile - ist.
Verfasst: Sonntag 17. Dezember 2006, 19:51
von birkenfeld
rumilmirion hat geschrieben:
Das mit der offenen Referenz war mir klar - hab das Zumachen der Datei in dem Fall vergessen, normal mach ich's auch. Ich meinte in dem Fall warum der Zweizeiler - erste Zeile öffnen, zweite Zeile lesen - besser als der Einzeiler - öffnen und lesen auf der gleichen Zeile - ist.
Weil du die Datei beim Einzeiler nicht mehr selbst schließen kannst, da du keine Referenz darauf hast.