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

Code: Alles auswählen

cypher = file(cypher,'r').read()
ist, oder ist das mehr Geschmackssache?
Das gleiche mit

Code: Alles auswählen

enc_list_added = list()
entgegen

Code: Alles auswählen

enc_list_added = []
- 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

Code: Alles auswählen

cypher = file(cypher,'r').read()
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

Code: Alles auswählen

enc_list_added = list()
entgegen

Code: Alles auswählen

enc_list_added = []
- 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.