Hier hat Dookie sein crypt() und decrypt() gepostet:
http://python.sandtner.org/viewtopic.php?p=7127#7127
Ich hatte mir eigentlich eine eigene Variante daraus gestrickt:
Code: Alles auswählen
from random import Random
def encrypt(txt,Pass):
rnd=Random(Pass).randint(0,127)
return "".join([chr(ord(a) ^ rnd) for a in txt])
def decrypt(txt,Pass):
rnd=Random(Pass).randint(0,127)
return "".join([chr(ord(a) ^ rnd) for a in txt])
Nun ist mir zum Glück etwas Aufgefallen!
Hier mal ein Test:
Code: Alles auswählen
crypted=encrypt("Test1","EinTollesPasswort")
print "crypted:",crypted
decrypted=decrypt(crypted,"EinTollesPasswort")
print "decrypted:",decrypted
print "-"*30
crypted=encrypt("Test2","098f6bcd4621d373cade4e832627b4f6")
print "crypted:",crypted
decrypted=decrypt(crypted,"098f6bcd4621d373cade4e832627b4f6")
print "decrypted:",decrypted
Code: Alles auswählen
crypted: kZLK[SO]
decrypted: Test1
------------------------------
crypted: Test2
decrypted: Test2
Wie man sieht ist der "Test2" nicht wirklich verschlüßelt... Nun hab ich hin und her überlegt, warum das der Fall ist....
Die Lösung ist, das
Random("098f6bcd4621d373cade4e832627b4f6").randint(0,127)
"zufällig" 0 ergibt!
Wenn damit verschlüsselt wird, dann passiert nix...
Im Original-Skript von Dookie hatte er ja den Random anders gestartet:
sum([ord(a) for a in Pass])
Das hatte ich weg gelassen, weil ich mir dache, wozu so kompliziert...
Jetzt könnte man überlegen, wie man es hinbekommt, das der Random nie mit einer 0 gestartet wird...
Dazu gibt es mehrere Möglichkeiten... Die einfachste ist es nicht .randint(0,127) sondern .randint(1,127) zu verwenden...
Jetzt fällt mir allerdings auf, das durch .randint(0,127) die maximale Variation festgelegt ist! Also egal welches Passwort man benutzt es kann sich nur 128 verschiedene Verschlüsselungen ergeben
Das ist natürlich super einfach mit einem zu knacken:
Code: Alles auswählen
def BruteForce(txt):
for rnd in range(127):
decrypted="".join([chr(ord(a) ^ rnd) for a in txt])
if decrypted=="EinLangerTestText":
return decrypted
print BruteForce("zVQs^QXZMkZLKkZGK")
Hmmmm.....