2017-10-13 1 views
1

Codeübersicht: Die Token sind identisch, aber zwischen Verschlüsselung und Entschlüsselung wird das verschlüsselte Objekt in einem Modulebene-Wörterbuch gespeichert Verschlüsselungstoken ändert sich nicht.Kryptografie-Token-Objekt löst Ausnahme aus und kann nicht entschlüsseln, obwohl die Token identisch sind

Warum funktioniert das nicht? Ich stelle mir vor, dass es Dinge hinter den Kulissen bezüglich des verschlüsselten Objekts gibt, die es einzigartig machen, aber ich hätte angenommen, dass alles, was es braucht, der richtige Schlüssel ist, damit die Entschlüsselung funktioniert.

Hier ist der minimale zugehörige Code:

import sys 
from cryptography.fernet import Fernet 
import json 
import os 

key = Fernet.generate_key() 
f = Fernet(key) 


with open("storage.json", "a+") as file: 
    if os.stat("storage.json").st_size == 0: 
     file.write("{}") 
    file.seek(0) 
    storage = json.load(file) 


def write(data): 
    with open("storage.json", "w") as file: 
     json.dump(data, file) 


def encrypt(pw): 
    token = f.encrypt(bytes(pw, "utf-8")) 
    return token 


def decrypt(token): 
    return f.decrypt(token) 

if len(sys.argv) == 1: 
    to_encrypt = input("A key to encrypt: ") 
    storage[to_encrypt] = encrypt(to_encrypt).decode("utf-8") 
    print("encrypted:", storage[to_encrypt]) 
    # print("storage:", storage) 
    try: 
     write(storage) 
    except Exception as e: 
     print("error:", e) 

elif len(sys.argv) == 2: 
    to_decrypt = input("Key to decrypt: ") 
    # print(storage[to_d]) 
    print("decrypted:", f.decrypt(bytes(storage[to_decrypt], "utf-8"))) 

, damit es funktioniert: das Programm ohne Argumente läuft - es wird eine JSON-Datei, geben Sie Ihren String und seine Verschlüsselung in die Datei erstellen, und beenden .
Führen Sie dann das Programm aus und übergeben Sie ein einzelnes Argument. Versuchen Sie, die gleiche Zeichenfolge zu erhalten, die Sie zuvor eingegeben haben.

sollte Dieses Zurückverfolgungs auftreten:

Traceback (most recent call last): 
    File "/Users/sjung/lib/python3.5/site-packages/cryptography/fernet.py", line 101, in decrypt 
    h.verify(data[-32:]) 
    File "/Users/sjung/lib/python3.5/site-packages/cryptography/hazmat/primitives/hmac.py", line 69, in verify 
    ctx.verify(signature) 
    File "/Users/sjung/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/hmac.py", line 73, in verify 
    raise InvalidSignature("Signature did not match digest.") 
cryptography.exceptions.InvalidSignature: Signature did not match digest. 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "test_a.py", line 43, in <module> 
    print("decrypted:", f.decrypt(bytes(storage[to_decrypt], "utf-8"))) 
    File "/Users/sjung/lib/python3.5/site-packages/cryptography/fernet.py", line 103, in decrypt 
    raise InvalidToken 
cryptography.fernet.InvalidToken 

edit: kommentieren Sie die elif Linie, es zu versuchen, ohne das System zu verlassen. Dies funktioniert.

+0

Abgesehen: tief verschachtelt Anrufe wie 'print ("entschlüsselt", f.decrypt (Bytes (storage [to_decrypt] "utf-8")))' sind schwer zu debuggen, verwenden Sie stattdessen mehrere Schritte und Zwischenvariablen. Dann verfolgen Sie die Ausführung in einem Debugger oder fügen Sie print-Anweisungen für die Zwischenwerte hinzu. Auch die Zeilennummer in Fehlermeldungen gibt eine bessere Vorstellung davon, wo der tatsächliche Fehler liegt. – zaph

Antwort

Verwandte Themen