Ausdruck verstehen

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
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

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)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@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?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__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?
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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@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.
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.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

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
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ach du liebe Guete. Derjenige nutzt das hoffentlich nur, um seine wertvolle Rezeptesammlung zu schuetzen?

Um die Frage zu beantworten: nein. Crypto ist *hart*.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

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:
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@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.
Antworten