XECryption knacken

Code-Stücke können hier veröffentlicht werden.
Antworten
rumilmirion
User
Beiträge: 34
Registriert: Mittwoch 3. Mai 2006, 12:09

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
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)
rumilmirion
User
Beiträge: 34
Registriert: Mittwoch 3. Mai 2006, 12:09

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!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

birkenfeld hat geschrieben:Nein, das ist Geschmackssache.
Schon das dritte mal, dass jemand das fragt. Sollten wir vielleicht mal in die FAQ schreiben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Gute Idee.

[wiki]FAQ#GibtEsEinenUnterschiedZwischenlistBzwdict[/wiki]
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
rumilmirion
User
Beiträge: 34
Registriert: Mittwoch 3. Mai 2006, 12:09

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten