Probleme mit Crypto

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
windo89
User
Beiträge: 1
Registriert: Montag 14. Dezember 2015, 21:08

Hallo liebe Python Gemeinde,
ich bin etwas neu in Python (3 Monate) und habe folgendes Problem.

Ausgangsstellung
Ich versuche eine SQL Datenbank auszulesen und diese via AES zu verschlüsseln.
Das Auslesen funktioniert ohne Probleme.
Selbst das verschlüsseln und entschlüsseln der Datenbank funktioniert.

Das Problem ist, wenn ich ein einzelnes Element aus der Datenbank entnehme, kann ich dieses nicht entschlüsseln.

Hier mein Code:

Code: Alles auswählen

from Crypto import Random
from Crypto.Cipher import AES
from SQL_Funktionen import *

def Liste_verschlüsseln(Liste,Key):
    obj = AES.new(Key, AES.MODE_CBC, 'This is an IV456')
    Verschlüsselt = [0] * len(Liste)
    for i in range(len(Liste)):
        Verschlüsselt [i] = obj.encrypt(Anpassen(Liste[i]))
        #Anpassen füllt den String mit Füllzeichen auf (bis 16 oder 32)
    return Verschlüsselt 
    
def Liste_entschlüsseln(Liste,Key):
    obj = AES.new(Key, AES.MODE_CBC, 'This is an IV456')
    Entschlüsselt = [0] * len(Liste)
    for i in range(len(Liste)):
        Entschlüsselt [i] = obj.decrypt(Liste[i])
        Entschlüsselt [i] = Aufbereiten(Entschlüsselt [i])
        #Entschlüsselt entfernt die Füllzeichen
    return Entschlüsselt
    
def Datenbank_verschlüsseln(Datenbank,key):
    Datenbank = Tupel_to_List(Datenbank)
    Datenbank_verschlüsselt = [0] * len(Datenbank)
    for i in range(len(Datenbank_verschlüsselt)):
        Datenbank_verschlüsselt[i] = Liste_verschlüsseln(Datenbank[i],key)
    return Datenbank_verschlüsselt

def Datenbank_entschlüsseln(Datenbank,key):
    Datenbank_entschlüsselt = [0] * len(Datenbank)
    for i in range(len(Datenbank_entschlüsselt)):
        Datenbank_entschlüsselt[i] = Liste_entschlüsseln(Datenbank[i],key)
    return Datenbank_entschlüsselt

def Element_entschlüsseln(Element,Key):
    obj = AES.new(Key, AES.MODE_CBC, 'This is an IV456')
    Element = obj.decrypt(Element)
    return Element

key = "This is a key123"

db=DB()
Datenbank = db.user_ausgeben()

#Datenbank verschlüsseln -- funktioniert
Verschlüsselt = Datenbank_verschlüsseln(Datenbank,key)

#Element entnehmen und entschlüsseln -- funktioniert nicht 
x = Element_entschlüsseln(Verschlüsselt[0][1],key)

#Datenbank entschlüsseln -- funktioniert
Entschli = Datenbank_entschlüsseln(Verschlüsselt,key)
Ausgabe x:

Code: Alles auswählen

>>> x
b'=X\xeb\xd9y\xb2\x073\x84\xed\x9f\xca\x0c\xbe\xc0\x1d'
Hier noch ein Beispiel (was auch funktioniert):

Code: Alles auswählen

obj8 = AES.new(key, AES.MODE_CBC, 'This is an IV456')
String = "The answer is no"
String = Anpassen(String)
print(String)
Geheim = obj8.encrypt(String)
print(Geheim)
print(type(Geheim))

obj9 = AES.new(key, AES.MODE_CBC, 'This is an IV456')
Nicht_Geheim = obj9.decrypt(Geheim)
Nicht_Geheim = Aufbereiten(Nicht_Geheim)
print(Nicht_Geheim)
print(type(Nicht_Geheim))
Ausgabe:

Code: Alles auswählen

The answer is no
b'\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1'
<class 'bytes'>
The answer is no
<class 'str'>
Ich sitze nun fast einen Tag dran und würde mich über jede Hilfe freuen!

Ich wünsche noch einen schönen Abend ;-)

Gruß
Windo
BlackJack

@windo89: Du musst für jedes einzelne Element ein neues `AES`-Exemplar erstellen, sonst müsstest Du um ein einzelnes Element zu entschlüsseln erst alle entschlüsseln die Du davor mit einem `AES`-Exemplar verschlüsselt hast, und das auch in der gleichen Reihenfolge. (`obj` ist übrigens ein ziemlich schlechter Name für etwas was man zum Beispiel `aes` nennen könnte.)

Welche Programmiersprache schreibst Du da eigentlich? Python ist das nicht, da stimmt die Namenschreibweise nicht und diese komische Listen mit 0en erstellen und dann über ``range(len(something))`` iterieren um dann die sinnlosen 0en durch die tatsächlichen Werte zu ersetzen ist kein idiomatisches Python. Da würde man eine leere Liste erstellen und dann die Elemente anhängen, oder eine „list comprehension“ schreiben. Eventuell auch eine Generatorfunktion damit man nicht immer alle Werte komplett in Listen im Speicher hat. Schau Dir mal Style Guide for Python Code an und arbeite ein Python-Grundlagentutorial durch. In der Python-Dokumentation ist zum Beispiel eines.
Antworten