Python Modul PyCrypto und Blowfish

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
albertus
User
Beiträge: 52
Registriert: Mittwoch 7. Juli 2010, 14:48

Hallo,

seit ein paar Tagen beschäftige ich mich mit PyCrypto und Blowfish. Bis gestern ohne allzu große Schwierigkeiten. Seit gestern versuche ich Blowfish mit dem Modus MODE_CTR zu betreiben was mir nicht gelingt. Für die später zu programmierende Anwendung könnte ich auf diesen Modus verzichten. Nur dieses "nicht wollen" nervt... :K .

Wie man Blowfish in diesen Modus betreibt dazu schweigt die Dokumentation leider eisern. So konnte ich bis jetzt nur rumprobieren. Ich bin jetzt so weit das keine Exceptions mehr ausgelöst werden, aber ob die Verschlüsselung richtig ist, kann ich nicht nachvollziehen den die Entschlüsselung funktioniert leider überhaupt nicht. Hier mein bisheriger Versuch:

Code: Alles auswählen

# Python 3.3
from Crypto.Cipher import Blowfish
from Crypto.Random import get_random_bytes
from Crypto.Util.number import bytes_to_long, long_to_bytes

MSG1 = "Hallo ihr Vögel.\n".encode()
PASSWORT = b'GeHeIm'

class MyCounter(object):
    def __init__(self, nonce):
        self.c = bytes_to_long(nonce)
    def __call__(self):
        self.c += 1
        return long_to_bytes(self.c)

def CTR_1():
    nonce = get_random_bytes(8)
    cipher = Blowfish.new(PASSWORT, Blowfish.MODE_CTR, counter =  MyCounter(nonce))
    geheim = cipher.encrypt(MSG1)
    print("Verschlüsselte Nachricht:\n")
    print(geheim)
    print("\nEndschlüsselte Nachricht:\n") 
    klartext = cipher.decrypt(geheim)
    print(klartext)
Ich habe mich da in etwas verrannt, vielleicht gibt es ja hier jemand der mich auf den Richtigen Weg zurück führen kann. Wenn nicht lass ich es halt :evil:
Mit freundlichen Grüßen

Albertus
lunar

Klar kann das so nicht funktionieren. Du verwendest dasselbe Objekt für die Entschlüsselung, ohne den Counter zurückzusetzen. Die Entschlüsselung verwendet mithin ganz andere Zählerwerte als die Verschlüsselung, so dass ganz offensichtlich eben andere Werte herauskommen.

Du musst ein neues Blowfish-Objekt zum Entschlüsseln erzeugen, und diesem ein neues "MyCounter"-Objekt mit derselben "nonce" übergeben.

Und bitte, bitte, verwende keine ASCII-Zeichen direkt als Passwörter. Nutze mindestens Hashing, besser aber eine spezifizierte Ableitungsfunktion (e.g. PBKDF5), um aus einer Zeichenkette einen Schlüssel zu erzeugen. Ansonsten hat dein Schlüssel einen starken statistischen Bias und ist leicht angreifbar.

PS: Ach ja, Blowfish ist heute auch nicht mehr der Standard-Algorithmus. Nutze besser AES oder Twofish.
albertus
User
Beiträge: 52
Registriert: Mittwoch 7. Juli 2010, 14:48

lunar hat geschrieben:Klar kann das so nicht funktionieren. Du verwendest dasselbe Objekt für die Entschlüsselung, ohne den Counter zurückzusetzen. Die Entschlüsselung verwendet mithin ganz andere Zählerwerte als die Verschlüsselung, so dass ganz offensichtlich eben andere Werte herauskommen.

Du musst ein neues Blowfish-Objekt zum Entschlüsseln erzeugen, und diesem ein neues "MyCounter"-Objekt mit derselben "nonce" übergeben.
Ok jetzt habe ich es kapiert ist ja auch logisch. Na ja. Aber daneben habe ich auch noch das padding missachtet :oops: da bin ich dann aber (immerhin) selbst drauf gekommen.
Und bitte, bitte, verwende keine ASCII-Zeichen direkt als Passwörter. Nutze mindestens Hashing, besser aber eine spezifizierte Ableitungsfunktion (e.g. PBKDF5), um aus einer Zeichenkette einen Schlüssel zu erzeugen. Ansonsten hat dein Schlüssel einen starken statistischen Bias und ist leicht angreifbar.
Also so weit bin ich noch nicht. Momentan bin ich in der Experimentierphase, ich habe mich noch nicht für oder gegen ein Verschlüsselungsverfahren entschieden und das Thema Passwörter hatte ich noch gar nicht auf dem Schirm; gut das Du es dahin gebracht hast.
PS: Ach ja, Blowfish ist heute auch nicht mehr der Standard-Algorithmus. Nutze besser AES oder Twofish.
Laut wikipedia http://de.wikipedia.org/wiki/Blowfish#Kryptoanalyse ist Blowfish sicher. Ich habe es so verstanden, des es Angriffspunkte gibt, diese aber bis heute Blowfish nicht geknackt haben. Auch für AES gibt es, laut wikipedia http://de.wikipedia.org/wiki/Advanced_E ... d_Angriffe Angriffspunkte, die aber bis heute AES auch nicht geknackt haben. Von den drei hier angesprochenen Verschlüsselungsverfahren scheint mir Twofish das sicherste zu sein, nur in PyCrypto ist es nicht enthalten. Kennt jemand ein Modul für Python 3.x?

Nun ja nichts ist absolut sicher in der Kryptographie schon gar nicht, wer das nicht wahr haben will, macht schon den ersten Fehler. Soviel habe ich schon mal gelernt.
Mit freundlichen Grüßen

Albertus
albertus
User
Beiträge: 52
Registriert: Mittwoch 7. Juli 2010, 14:48

lunar hat geschrieben:Padding? Bei CTR?
Hast braucht man nicht.
Mit freundlichen Grüßen

Albertus
Antworten