Hallo liebe Community!
Da wir gerade in der Schule mit Kryptographie anfangen, hab ich mir gedacht, die Algorithmen nicht nur (zwangsweise ) 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.
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
DES Implementierung
-
- User
- Beiträge: 23
- Registriert: Samstag 19. April 2008, 13:27
- Wohnort: Münsterland
Zuletzt geändert von DelphiMarkus am Sonntag 16. Dezember 2012, 16:38, insgesamt 2-mal geändert.
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.
-
- 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
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).
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 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.
-
- 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.
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.