Seite 1 von 1

Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 02:17
von Sophus
Hallo Leute,

ich habe im Internet einen Quelltext-Ausschnitt gesehen. Dort gibt es einen Ausdruck, den ich nicht ganz verstehe. Alles weitere in den Kommentaren des Quelltextes.

Code: Alles auswählen

chunksize = 65536
w = open(filename + '.' + str(cs) + '.split', 'wb')
tdata = f.read(307200)
w.write(tdata)
w.close

infile.open(filename + '.' + str(cs) + '.split', 'rb')

while True:
    #   Die geöffnete Datei in Blöcken lesen, um Speicher zu schonen
    chunk = infile.read(chunksize)
    print "Chunk length: " + str(len(chunk))
    #   Wenn der Block von der Länge her Null ist, dann While-Schleife abbrechen.
    if len(chunk) == 0:
        break

    #   Ansonsten die Länge des Blockes durch 16 teilen, und
    #   überprüfen, ob dies ungleich null ist.
    #   Wieso 16? 
    elif len(chunk) % 16 != 0:
        #   Ja, es ist ungleich Null
        #   Was wird hier gemacht? += heißt, dass der rechte Operant zum linken
        #   hinzugefügt wird. Aber wie verstehe ich hier ' ' * (16 - len(chunk) % 16)?
        chunk += ' ' * (16 - len(chunk) % 16)

Re: Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 07:24
von DasIch
Der Ausdruck erzeugt einen String mit 0-15 Leerzeichen und hängt die an den Chunk, so dass die Länge des Chunks ein Vielfaches von 16 ist. Das nennt man Padding und wird häufig bei Verschlüsselung gemacht.

Re: Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 13:01
von Sophus
@DasIch: Danke. Jetzt bin ich ein Stück weiter. Aber darf ich fragen, wieso man das so macht? Ich komme nicht dahinter, wieso. Wieso wird immer ein Vielfaches der Chunk-Länge erzeugt?

Re: Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 13:10
von __deets__
Das kann man so ohne Kontext nicht final beantworten, aber es liegt nahe zu vermuten, dass nachfolgende Schritte das erfordern. Es gibt zB Verschluesselungsverfahren die eben nur bestimmte Blockgroessen akzeptieren.

Re: Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 14:44
von BlackJack
Hinweis am Rande: Ich würde bei so einem Code ein ``assert`` einbauen das prüft ob `chunksize` ein Vielfaches von 16 ist, sonst funktioniert der Code nämlich nicht. Ich würde die `chunksize` dann wahrscheinlich auch entweder hexadezimal angeben oder als Multiplikation einer 2er-Potenz oder direkt als 2er-Potenz, denn bei 65536 sieht die Teilbarkeit durch 16 vielleicht nicht jeder auf den ersten Blick. Als 0x10000 oder 2**16 oder 64 * 1024 geschrieben ist das IMHO offensichtlicher das die Blockgrösse 64 KiB beträgt.

Re: Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 15:03
von Sophus
@__deets__: Ich habe mich eben zufällig über einen Google-Book belesen. Ich habe einfach den Ausdruck chunk += ' ' * (16 - len(chunk) % 16) in die Google-Suchmaschine eingegeben und bin auf diese Seite gestoßen: Das Python-Praxisbuch: Der große Profi-Leitfaden für Programmierer (Seite 882). Dieses Buch ist natürlich nicht vollständig digitalisiert. Jedenfalls bin ich im Text auf eine Stelle gestoßen, in welcher geschrieben steht, dass das AES-Algorithmus dies erfordert. Also dass die Daten immer ein Vielfaches von 16 Bytes haben müssen. Dies wäre eben die Einschränkung. Daher steht auch im Klammern, dass man zur Not "paddern" müsse. Gut, dann nehme ich das einfach als "gegeben" an, dass es so sein muss, ohne mich weiter tiefgründig mit Kryptographie auseinandersetzen zu müssen.

Allerdings beschäftigt mich ein weiterer Ausdruck, und zwar dieser: elif len(chunk) % 16 != 0:. Hier wird ja gesagt, dass im 'elif'-Rumpf die Länge des Chunks durch 16 geteilt wird, korrekt? Und im Zuge dieser Division wird geprüft, ob das Ergebnis ungleich Null ist. Allerdings bin ich über das Zeichen % verwirrt. Was ist nun der Unterschied zwischen / und % ? Hätte ein / nicht gereicht?

Re: Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 15:23
von BlackJack
@Sophus: Nein, das kann man aber auch einfach ausprobieren das das offensichtlich nicht geht hier % durch / zu ersetzen.

Code: Alles auswählen

In [19]: [x % 16 for x in [1024, 32, 23, 42]]
Out[19]: [0, 0, 7, 10]

In [20]: [x / 16 for x in [1024, 32, 23, 42]]
Out[20]: [64, 2, 1, 2]

In [21]: [x / 16. for x in [1024, 32, 23, 42]]
Out[21]: [64.0, 2.0, 1.4375, 2.625]
Im letzten Beispiel könnte man sich jetzt natürlich alternativ zum Vergleich mit 0 den Nachkommaanteil der Gleitkommazahlen anschauen, aber eigentlich möchte man bei so einem Test gar nicht erst auf Gleitkommazahlen zurückgreifen wenn es auch mit ganzen Zahlen geht.

Re: Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 15:23
von Sirius3
@Sophus: Du willst Dateien verschlüsseln, Dich aber nicht mit Verschlüsselung beschäftigen? Das wäre so, als ob Du eine Gasheizung installieren möchtest, Dich aber mit Heizungsbau nicht beschäftigen. Zum Glück gibt es in Deutschland, im Gegensatz zu Verschlüsselung, Gesetze, die verbieten, als Nicht-Fachmann an Gasleitungen herumzuschrauben, sonst möchte ich nicht in Deiner Nachbarschaft wohnen. Was AES und was Blockverschlüsselung bedeutet, klären die Wikipedia-Artikel schon ganz gut auf. Aber Du willst Dich ja mit dem Thema nicht beschäftigen. Welche mathematischen Operatoren es in Python gibt, steht in der Dokumentation.

Re: Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 15:44
von Sophus
@Sirius3: Ich bedauere, dass du mich gänzlich falsch verstanden hast. Ich schrieb, dass ich mich nicht tiefgründig mit der Kryptographie auseinandersetzen möchte. Dies bezeugt meine Achtung. Denn Kryptographie ist keineswegs einfach. Wenn ich eine Expertise betreiben möchte, könnte ich auch gleich zum Kryptologen werden. Allein, dass ich hier Fragen stelle, zeigt ja, dass mich das durchaus interessiert und ich der Sache (soweit es mir möglich ist) auf den Grund gehe. Wenn ich beispielsweise weiß, dass die Daten (in Bezug auf das AES-Algorithmus) immer ein Vielfaches von 16 Bytes haben müssen, dann langt mir dieses Wissen. Alles darüber hinaus ist für mich tiefgründig.

Re: Ausdruck verstehen

Verfasst: Samstag 15. April 2017, 16:04
von BlackJack
@Sophus: Mit Kryptographie kann man sich entweder tiefgründig oder gar nicht beschäftigen. Man kann auf jeden Fall keine Verschlüsselung selber schreiben ohne sich *richtig* mit dem Thema auseinander zu setzen. Denn es reicht ja nicht das die Ver- und Entschlüsselung funktioniert, sondern das sollte am Ende auch sicher sein. Sonst kann man es sich auch sparen. Und um das beurteilen zu können muss man sich wirklich gut mit der Materie auskennen. Ansonsten nimmt man einfach eine Komplettlösung die sich in der Praxis bewährt hat.

Re: Ausdruck verstehen

Verfasst: Dienstag 18. April 2017, 09:24
von Zizibee
BlackJack hat geschrieben:Denn es reicht ja nicht das die Ver- und Entschlüsselung funktioniert, sondern das sollte am Ende auch sicher sein. Sonst kann man es sich auch sparen. Und um das beurteilen zu können muss man sich wirklich gut mit der Materie auskennen.
Gibt es keine Möglichkeit ein Verschlüsselungsverfahren zu bewerten ohne sich tief in die Materie einarbeiten zu müssen?
Hintergrund ist der, dass ich jemanden kenne, der sehr von seinem selbst geschriebenen Verschlüsselungsprogramm überzeugt ist und ich das leider gar nicht bewerten kann. Schön fände ich einen Beweis durch Gegenbeweis - also: guck ich habs ohne Kenntnis des Passworts entschlüsselt :D

Re: Ausdruck verstehen

Verfasst: Dienstag 18. April 2017, 09:57
von __deets__
Ach du liebe Guete. Derjenige nutzt das hoffentlich nur, um seine wertvolle Rezeptesammlung zu schuetzen?

Um die Frage zu beantworten: nein. Crypto ist *hart*.

Re: Ausdruck verstehen

Verfasst: Dienstag 18. April 2017, 10:25
von Zizibee
Ich glaube er nutzt es gar nicht, er fand es nur toll sich das zu überlegen und zu programmieren.

Wenn ich für das Knacken seiner Musterdateien mehr Zeit aufwenden muss als er für das Programmieren, muss ich echt überlegen ob mir es das Wert ist... eigentlich schade :wink:

Re: Ausdruck verstehen

Verfasst: Dienstag 18. April 2017, 13:40
von Sophus
@Zizibee: Genies soll es ja immer wieder geben. Grundsätzlich ist es ja nicht verwerflich, wenn sich jemand solch ein komplexes Thema annimmt. Um seine Arbeit beurteilen zu können, müsse er seine Arbeit hochladen und öffentlich zugänglich machen. Experten werden sich das früher oder später ansehen.