Simpelste Verschlüsselung -> Zeitproblem bei grossen fil

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Roman
User
Beiträge: 65
Registriert: Dienstag 14. März 2006, 09:10
Wohnort: Berlin

Hallo Zusammen,
Ich würde gerne den Inhalt eines files sehr simpel verschlüsseln.
Das habe ich mal ganz spontan so gemacht:

Code: Alles auswählen

>>> conn = file('C:\\Dokumente und Einstellungen\\Roman\\Desktop\\test.mpg','rb')
>>> content = conn.read()
>>> content_list = list(content)
>>> crypted_content = ""
>>> for i in content_list:
	crypted_char = chr((ord(i) + 3) % 256) 
	crypted_content += crypted_char
Leider dauert es nun doch seine Zeit (mehr als 10 min., denn da habe ich abgebrochen) das bei grösseren files anzuwenden. :cry:

Gibt es irgendeine Möglichkeit, die dasselbe, nur schneller macht?

Danke schon mal im Voraus,
Roman :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Roman hat geschrieben:Gibt es irgendeine Möglichkeit, die dasselbe, nur schneller macht?
Hi Roman!

Unabhängig davon, was ich von deiner Verschlüsselungsmethode :lol: halte -- hier ein paar Hinweise:

- Verwende keinen String, wenn du den String ständig ändern möchtest. Das ist auf Dauer zu langsam. Verwende eine Liste und mache zum Schluss wieder einen String daraus. Warum das so ist? Strings sind unveränderbare Objekte. Jede Änderung am String ist ein Erzeugen eines neuen Strings und Löschen des alten Strings.

Code: Alles auswählen

my_list = []
for i in range(1000):
    my_list.append(str(i))
my_sting = "".join(my_list)
- Große Dateien haben im Speicher nichts zu suchen. Lies große Dateien nicht ganz sondern nur in Teilen ein. Bearbeite diese kleinen Teile und werde das Ergebnis sofort wieder los, in dem du es in eine andere Datei schreibst. Das müllt dir den Speicher nicht voll.

Unabhängig davon, dass es noch schnellere Methoden gibt, habe ich dein Beispiel mal so abgeändert, dass es doch schon ein wenig schneller läuft.

Code: Alles auswählen

f_in = file("test.mp3", "rb")
f_out = file("test.mp3.crypted", "wb")

for part in iter(lambda: f_in.read(1024 * 1000), ""):
    vals = []
    for val in part:
        vals.append(chr((ord(val) + 3) % 256))
    f_out.write("".join(vals))

f_in.close()
f_out.close()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Roman
User
Beiträge: 65
Registriert: Dienstag 14. März 2006, 09:10
Wohnort: Berlin

Hallo Gerold,
Also ich weiss schon, dass die Verschlüsselungsmethode nichts taugt, aber darum geht es mir nicht wirklich.

Aber nun zu deinem Codebeispiel:

Ich hätte da ein paar Fragen, da ich noch nicht sooo sonderlich gut mit python umgehen kann.

1. Ich habe es schon öfter versucht, rauszubekommen, bin aber immer gescheitert :oops: . Was sind diese öminösen lambda-Konstrukte??

2. Was macht "iter"?

Hm, das sind shcon eine Menge Fragen zu einem so kleinen skript...
Danke für deine Mühe,
Roman :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Roman hat geschrieben:1. Was sind diese öminösen lambda-Konstrukte??
2. Was macht "iter"?
Hi Roman!

Hier zuerst mal ein Beispiel ohne "iter" und ohne "lambda":

Code: Alles auswählen

f_in = file("test.mp3", "rb")
f_out = file("test.mp3.crypted", "wb")

while True:
    part = f_in.read(1024 * 1000)
    if not part:
        break
    vals = []
    for val in part:
        vals.append(chr((ord(val) + 3) % 256))
    f_out.write("".join(vals))

f_in.close()
f_out.close()
Das sollte einfacher zu verstehen sein.

Und jetzt zu *iter()*. http://docs.python.org/lib/built-in-funcs.html#l2h-42
Mit iter() kann ich z.B. eine Funktion in einer Schleife so oft aufrufen, bis das Abbruchargument zutrifft. In meinem vorherigen Beispiel, wird damit also die Lambda-Funktion so oft aufgerufen, bis "" zurück kommt.

Die Methode f.read() kann ohne Argumente aufgerufen werden. Allerdings möchte ich als Argument die Länge der Daten übergeben, die mir f.read() zurück liefern soll. An die Funktion iter() kann aber nur eine Referenz zu einer Funktion übergeben werden. Ich habe keine Möglichkeit, die Argumente zu übergeben. Jetzt könnte ich eine eigene Funktion definieren, in der die richtigen Argumente übergeben werden. Diese Funkton könnte ich an iter() übergeben. Das könnte z.B. so aussehen:

Code: Alles auswählen

f_in = file("test.mp3", "rb")
f_out = file("test.mp3.crypted", "wb")

def read_part():
    return f_in.read(1024 * 1000)

for part in iter(read_part, ""):
    vals = []
    for val in part:
        vals.append(chr((ord(val) + 3) % 256))
        
    f_out.write("".join(vals))

f_in.close()
f_out.close()
Allerdings bin ich faul und möchte gerne auf die Definition einer eigenen Funktion verzichten. Deshalb verwende ich in solchen Fällen gerne **lambda**. Mit lambda erstellt man **namenlose** Funktionen.
Allerdings wird lambda immer mehr aus der Dokumentation verdrängt. Man sollte es wohl sparsam einsetzen. ;-)
http://docs.python.org/ref/lambdas.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Roman hat geschrieben:Gibt es irgendeine Möglichkeit, die dasselbe, nur schneller macht?
Neben den Optimierungen die Gerold schon vorgeschlagen hat, gibt es noch die Möglichkeit Geschwindingkeitskritische Teile in C/C++ auszulagern. Mit Pyrex kannst du Verhältnismäßig einfach aus python-Code eine C-Erweiterung machen. Ist allerdings dann doch etwas aufwendiger, deswegen stellt sich da die Frage ob es den aufwand überhaupt wert ist. Eine andere Möglichkeit wäre das nutzen von "richtigen" Verschlüsselungen mit PyCrypto, was aber nicht unbedingt so viel schneller ist, daes ja viel komplexere Verschlüsselungen sind und dementsprechend auch mehr Rechenzeit benötigen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Roman
User
Beiträge: 65
Registriert: Dienstag 14. März 2006, 09:10
Wohnort: Berlin

Hallo,

Also ich habe jetzt die Nutzlosigkeit meines Programms eingesehen und wollte dann pycrypto nutzen.

Aber, Ähem, wie benutzt man das Teil nun?? :oops:
Ich habe hier einen ganzen Berg von Dateien... Wie importiere ich das ganze bzw. welche Dateien sind für mich von Nutzen und in welches Verzeichnis muss ich sie dann packen? (Das gleiche, wo auch mein script drinstehen wird?)

Danke schon mal im Voraus,
Roman :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Roman hat geschrieben:wie benutzt man das Teil nun?
Hi Roman!

Hier steht alles: http://www.amk.ca/python/writing/pycrypt/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Roman hat geschrieben:Ich habe hier einen ganzen Berg von Dateien... Wie importiere ich das ganze bzw. welche Dateien sind für mich von Nutzen und in welches Verzeichnis muss ich sie dann packen? (Das gleiche, wo auch mein script drinstehen wird?)
Du musst eine kompilierte Version nehmen, nicht den Sourcecode (der Sourcecode besteht aus C und um den zu Modulen zu kompilieren bräuchtest du einen Compilter wie GCC oder Microsoft C(++) Compiler). Unter Related Links findest du Links zu Python 2.3 und Python 2.4 Builds.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Roman
User
Beiträge: 65
Registriert: Dienstag 14. März 2006, 09:10
Wohnort: Berlin

Hallo,
Danke schon mal für diese hilfreichen tipps.
Jetzt habe ich nur noch das Problem, dass ich eine kompilierte (hasse es, dieses Wort zu schreiben) Version für Python 2.2 brauche... Kann da jemand helfen?
Wie kann ich denn den Code kompilieren? Also ich habe auf jeden Fall C++... (Aber wahrscheinlich bräuchte es dafür Kentnisse, die ich (noch) nicht habe :( )
Danke schon mal für euren Aufwand,
Roman
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

am einfachsten wäre es, das setup.py zu nehmen ;)
die macht das selber.
Roman
User
Beiträge: 65
Registriert: Dienstag 14. März 2006, 09:10
Wohnort: Berlin

Hallo,
Ok, das wusste ich nicht... :lol:
Aber egal, ich bin jetzt sowieso auf Python 2.4.3 umgestiegen. (Das musste einfach mal sein)

Nun aber eine andere Frage:
da ich mich mit Kryptographie nicht sonderlich gut auskenne, kann mir jemand sagen, welchen Algorithmus ich am besten für binary files verwende?
Er muss nicht zu 100% sicher sein, meine Priorität ist eher die Geschwindigkeit.

Danke schon mal,
Roman :)
CapJo
User
Beiträge: 26
Registriert: Donnerstag 27. April 2006, 13:17

Kannst ja mal Blowfisch und AES ausprobieren ... kommt dann sicher auch noch auf die Schlüssellänge drauf an, je länger der Schlüssel desto höher die Laufzeit.

Kannst es ja selber mal testen.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

CapJo hat geschrieben:je länger der Schlüssel desto höher die Laufzeit.
Nur für einunddasselbe Verfahren. AES 128 ist schneller als AES 256, aber z.B. ein One-time-pad mit einer Schlüssellänge von 4MB ist schneller als AES (und "sicherer")
CapJo
User
Beiträge: 26
Registriert: Donnerstag 27. April 2006, 13:17

Das mit der Schlüssellänge war natürlich auch nur auf ein Verfahren bezogen.

Die Schlüssel beim One-Time-Pad sind so unhandlich da würd ich doch lieber AES nehmen :wink:
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

CapJo hat geschrieben:Die Schlüssel beim One-Time-Pad sind so unhandlich da würd ich doch lieber AES nehmen :wink:
Sicherheit ist immer unbequem. Je sicherer, desto unbequemer.

Deshalb sind auch viele Windowsboxen offen wie Scheunentore, immer als Admin zu arbeiten ist eben viel bequemer.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Roman hat geschrieben:Jetzt habe ich nur noch das Problem, dass ich eine kompilierte (hasse es, dieses Wort zu schreiben) Version für Python 2.2 brauche... Kann da jemand helfen?
Wie kann ich denn den Code kompilieren? Also ich habe auf jeden Fall C++... (Aber wahrscheinlich bräuchte es dafür Kentnisse, die ich (noch) nicht habe :( )
Du bräuchtest einen Compiler (ich nutze gcc-MinGW), OpenSSL und ein verständnis wie distutils in etwa funktionieren. Sonderlich schwer ist das meist nicht, jedoch ist es etwas Aufwand den Compiler passend einzurichten.

Ich kompiliere nur für Version 2.4 (und wenn 2.5 fertig ist dann 2.5), Builds für Python 2.2 zu machen ist mir zu viel aufwand, da ich davon nichts habe.

Das du auf Python 2.4 umgestiegen bist kann ich also auch nur gutheißen ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Roman
User
Beiträge: 65
Registriert: Dienstag 14. März 2006, 09:10
Wohnort: Berlin

Hallo,
So, pycrypto ist installiert und ich habe mich sogar schon durch einen Teil des manuals durchgekämpft... :D
Das Programm ist ja echt fix, hätte gar nicht damit gerechnet! :shock:

Danke noch mal für eure zahlreichen Antworten!
Bis dann,
Roman
Antworten