DES Implementierung

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
DelphiMarkus
User
Beiträge: 23
Registriert: Samstag 19. April 2008, 13:27
Wohnort: Münsterland

Hallo liebe Community!

Da wir gerade in der Schule mit Kryptographie anfangen, hab ich mir gedacht, die Algorithmen nicht nur (zwangsweise :P ) in Java sondern zusätzlich auch einfach nochmal in Python zu implementieren. ROT und Vigenere haben wir in der Schule programmiert und DES einmal durchgesprochen. Da hab ich mir gedacht, dass es doch ganz interessant wäre DES einmal selbst zu implementieren. Und ja ich weiß: DES sollte man besser nicht verwenden, es sei denn man weiß, dass potenzielle Angreifer aus der Vergangenheit kommen. :wink:

Ich habe, damit es erst mal einfacher ist, BitArray aus dem modul bitstring (http://pypi.python.org/pypi/bitstring) verwendet. Der Code findet sich auf BitBucket:
https://bitbucket.org/DelphiMarkus/cryp ... at=default

Ich werde einfach auch noch Triple-DES implementieren, denn das sollte ja nicht mehr schwer sein. Von der Geschwindigkeit her ist die Implementierung natürlich nicht atemberaubend, aber immerhin kann man mit ihr ver- und entschlüsseln. Ich würde gerne wissen, was ihr so von der Implementierung z.B. in Beziehung auf Programmierstil haltet.

Danke!

Gruß,
Maxi
Zuletzt geändert von DelphiMarkus am Sonntag 16. Dezember 2012, 16:38, insgesamt 2-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der Stil ist auf jedenfall gut und der Code ist leicht lesbar. Ich hab mir allerdings nicht die Mühe gemacht zu schlauen ob der Algorithmus korrekt implementiert wurde.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dein Stil ist sauber, PEP 8 beherzigt und durchgehend kommentiert. Die globalen Konstanten würde ich vielleicht etwas aussagekräftiger bezeichnen (z.B. PERMUTATION statt P). Aufgefallen ist mir, dass Du P zweimal definierst: 32-Bit-Block Permutation, P-Permutation. Der Code selbst ist sehr gut lesbar und gefällt mir ohne weitere Prüfung gut.
DelphiMarkus
User
Beiträge: 23
Registriert: Samstag 19. April 2008, 13:27
Wohnort: Münsterland

Danke euch beiden, dass ihr euch den Code mal angesehen habt!

@DasIch
Ich hoffe mal, dass er korrekt implementiert ist, zumindest haben die Tests bisher gut geklappt und auch die folgende Seite: http://people.eku.edu/styere/Encrypt/JS-DES.html scheint die gleichen Ergebnisse wie ich zu haben.

Ich bin mir allerdings unsicher ob ich einen zu verschlüsselnden Block mit 0'en auffüllen soll, bis er 64bit lang ist. DES ist nunmal ein Blockchiffre und schreibt eine Blocklänge von 64bit vor. Deshalb hab ich das so implementiert und natürlich auch in den Kommentaren vermerkt.

@kbr
Ich hab mir die Spezifikation im FIPS 46-3 genommen und von daher hab ich eben die knappen eher mathematischen Bezeichnungen für die Permutationstabellen etc. übernommen. Aber etwas aussagekräftigere Namen wären tatsächlich nicht schlecht.
Wie die doppelte Definition von P zustandegekommen ist, weiß ich ehrlich gesagt nicht mehr... :K Auf jeden Fall ist es gut, dass du es bemerkt hast! Mir ist das gar nicht aufgefallen, zumal die erste Definition von P auch noch falsch ist... Komisch woher die Zahlen vom falschen P kommen...

Den Quelltext hab ich dann auch direkt aktualisiert (s. erster Post).
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

DelphiMarkus hat geschrieben:Danke euch beiden, dass ihr euch den Code mal angesehen habt!

@DasIch
Ich hoffe mal, dass er korrekt implementiert ist, zumindest haben die Tests bisher gut geklappt und auch die folgende Seite: http://people.eku.edu/styere/Encrypt/JS-DES.html scheint die gleichen Ergebnisse wie ich zu haben.

Ich bin mir allerdings unsicher ob ich einen zu verschlüsselnden Block mit 0'en auffüllen soll, bis er 64bit lang ist. DES ist nunmal ein Blockchiffre und schreibt eine Blocklänge von 64bit vor. Deshalb hab ich das so implementiert und natürlich auch in den Kommentaren vermerkt.
Nur mit Nullen auffüllen geht nicht, nur auffüllen wenn der letzte Block unvollständig ist auch nicht, da du später nicht feststellen kannst ob es aufgefüllt wurde und wenn ja mit wievielen Bits. Ich bin mir nicht sicher welches Padding DES verwendet aber was prinzipiell geht ist den Block mit einer 1 gefolgt von 0en aufzufüllen und wenn der letzte Block vollständig ist, einen weiteren Block zu generieren der mit einer 1 beginnt und mit 0en aufgefüllt wird. In diesem Fall kannst du dann das Padding problemlos wieder entfernen.
DelphiMarkus
User
Beiträge: 23
Registriert: Samstag 19. April 2008, 13:27
Wohnort: Münsterland

Ja, das Auffüllen mit Nullen kann man nachher nicht mehr eindeutig rückgängig machen... Bisher wurde eben der letzte Block mit Null-Bits aufgefüllt bis die Länge 64 Bit beträgt. Ich hab dann gerade mal im Internet gesucht und "herausgefunden", dass zumindest im FIPS 46 nichts von Padding steht...
Es gibt allerdings einige Paddingverfahren, wie das von dir vorgeschlagene oder PKCS7 bzw. 5. (siehe dazu http://en.wikipedia.org/wiki/Padding_%28cryptography%29)

Ich werde dann mindestens PKCS5 einbauen, wenn nicht vielleicht noch mehr. Das würde dann voraussetzen, dass eine Nachricht aus Bytes besteht...

Edit:
Ich hab dann mal PKCS5 eingebaut. Die Tests liefen bisher alle gut, es scheint zu funktionieren. :D
Antworten