2017-03-06 4 views
1

Guten Tag,Kennwort Decrypter Failing

Ich habe ein Skript Ich schaffe, dass eine Benutzereingabe liest und vergleicht ihn mit dem Schlüssel in einer Textdatei gespeichert. Es scheitert auch wenn die Saiten gleich sind bitte helft mir:

from Crypto.Cipher import AES 
from tkinter import * 
#create the window 
root = Tk() 

#modify root window 
root.title("Button Example") 
#root.geometry("500x500") 

app = Frame(root) 
key='Key is unique!!!' 
IV='This is an IV456' 
#password=b'\xa3Y\x00\xae\xad\xad\x1c\xc6Js\xa9\xf4\x0e\xf3\x0f\xe3' 


def encrypt(): 
    obj = AES.new(key, AES.MODE_CBC, IV) 
    messagein = inputbar.get() 
    inputbar.delete(0,END) 
    messlen = len(messagein) 
    if messlen < 16: 
     diff = 16-messlen 
     message = 'z'*diff + messagein 
    global ciphertext 
    ciphertext = obj.encrypt(message) 
    print(ciphertext) 
    del obj 
def check(): 
    encrypt() 
    passwordfunc() 
    if ciphertext == password: 
     print('Success!') 
    else: 
     print('Fail!') 

def passwordfunc(): 
    file=open("E536D.dat","r") 
    global password 
    password = file.readline() 
    file.close() 
    print(password) 

inputbar = Entry(root,font='TkDefaultFont 30') 
inputbar.pack() 

button1= Button(text='Encrpyt',command=lambda:encrypt()) 
button1.pack() 
button2 = Button(text='Compare',command=lambda:check()) 
button2.pack() 
button3 = Button(text='File',command=lambda:passwordfunc()) 
button3.pack() 

root.mainloop() 

Was habe ich falsch gemacht? Die Zeile #password=b'\xa3Y\x00\xae\xad\xad\x1c\xc6Js\xa9\xf4\x0e\xf3\x0f\xe3' ist der Schlüssel, mit dem verglichen werden muss, aber sie gibt false für den Vergleich aus der Datei zurück, aber in ihrem Inneren funktioniert sie. Bitte hilf mir. Ich reparierte die unterschiedliche Schlüsselausgabe, indem ich obj = AES.new(key, AES.MODE_CBC, IV) in encrypt verschiebe und es am Ende der Funktion lösche. Aber wenn ich die Zeichenfolge aus der Datei und die richtige Eingabe Python vergleichen, sagt sie immer noch nicht das Gleiche. Unten ist ein Screenshot von dem, was ich meine. enter image description here

+0

der Schlüssel und die IV müssen 16 Zeichen haben, und der Text, der encripted sein muss ein Vielfaches von 16 Zeichen sein, müssen Sie es mit einigen Zeichen wie Leerzeichen auffüllen, wenn es nicht –

+0

ist, tat ich, was das tut : 'if messlen <16: diff = 16-messlen message = 'z' * diff + messagein' –

+0

Ist" E536D.dat "eine Binärdatei, die _just_ diese Bytes enthält, ohne Newline? In diesem Fall sollten Sie es im Binärmodus öffnen und die Methode '.read()' verwenden, um die Bytedaten abzurufen. Wenn dies nicht der Fall ist, sollten Sie uns einen hexadezimalen Speicherabzug ihres Inhalts zeigen, damit wir herausfinden können, wie sie richtig gelesen wird. –

Antwort

1

Okay, ich habe es behoben. Das Problem war, dass Chiffretext war in Bytes und meine Datei hatte es gelesen, wie eine Zeichenfolge, so habe ich die unten und schrieb sie in einer Datei Bytes und lesen Sie es als Bytes jetzt funktioniert es 100%

from Crypto.Cipher import AES 
from tkinter import * 
#create the window 
root = Tk() 

#modify root window 
root.title("Button Example") 
#root.geometry("500x500") 

app = Frame(root) 
key='Key is unique!!!' 
IV='This is an IV456' 
#password=b'\xa3Y\x00\xae\xad\xad\x1c\xc6Js\xa9\xf4\x0e\xf3\x0f\xe3' 


def encrypt(): 
    obj = AES.new(key, AES.MODE_CBC, IV) 
    messagein = inputbar.get() 
    inputbar.delete(0,END) 
    messlen = len(messagein) 
    if messlen < 16: 
     diff = 16-messlen 
     message = 'z'*diff + messagein 
    global ciphertext 
    ciphertext = obj.encrypt(message) 
    del obj 

def passwordfunc(): 
    file=open("E536D.dat","rb") 
    global password 
    password = file.readline() 
    file.close() 

def check(): 
    encrypt() 
    passwordfunc() 
    print('ciphertext = ',ciphertext) 
    print(' password = ',password) 
    if ciphertext == password: 
     print('Success!') 
    else: 
     print('Fail!') 

def write(): 
    encrypt() 
    file=open("E536D.dat","wb") 
    file.write(ciphertext) 
    file.close() 


inputbar = Entry(root,font='TkDefaultFont 30') 
inputbar.pack() 

button1= Button(text='Encrpyt',command=lambda:encrypt()) 
button1.pack() 
button2 = Button(text='Compare',command=lambda:check()) 
button2.pack() 
button3 = Button(text='File',command=lambda:passwordfunc()) 
button3.pack() 
button4 = Button(text='Write',command=lambda:write()) 
button4.pack() 

root.mainloop() 

Dank PM 2RIng für Ihre Hilfe. Deine Frage hat mich zum Nachdenken gebracht, also habe ich es geschafft, es mit einem schnellen Google zu beheben. Vielen Dank

+0

Das Schreiben und Lesen der Bytes als Bytes ist die sinnvolle Lösung. :) Für zukünftige Referenz ist es möglich, eine String-Darstellung eines Bytes-Objekts in ein richtiges Byte-Objekt zu konvertieren, indem Sie 'ast.literal_eval()' verwenden, aber es ist viel besser, diese zusätzliche Ebene der Komplikation zu vermeiden. –

+0

Wenn Sie verschlüsseln müssen (brauchen Sie nicht wirklich Passwörter, um sicher zu sein), verwenden Sie den CBC-Modus mit einer zufälligen IV, nur die verschlüsselten Daten mit der IV zur Verwendung bei der Entschlüsselung, muss es nicht geheim sein. Natürlich ist die nächste Frage, wie man den Verschlüsselungsschlüssel sicher hält, das ist im Allgemeinen nicht einfach. – zaph