コードの概要:トークンは同一ですが、暗号化と復号化の間に暗号化されたオブジェクトはモジュールレベルの辞書に格納されます。暗号化トークンは変更されません。暗号トークンオブジェクトは例外を発生させ、トークンが同一であっても復号できません
なぜこれは機能しませんか?私は、一意にする暗号化されたオブジェクトに関する裏の事があると想像していますが、必要なのは復号化が正しく機能するための鍵だと思っていました。ここで
は、最小限の関連するコードです:
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")))
それを動作させるには:引数なしでプログラムを実行する - それはJSONファイル、ファイルに入力あなたの文字列とその暗号化、および終了を作成します。 。
次に、単一の引数を渡してプログラムを実行します。以前入力したものと同じ文字列を取得してください。
このトレースバックが発生した場合:
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
編集:システムを終了せずにそれを試してelif
行をコメントアウトします。 これは動作します。
:例えば '( "復号化"、f.decrypt(バイト(ストレージ[to_decrypt]、 "UTF-8")))プリントとして深いネストコール'デバッグが困難であるが、代わりに使用します複数のステップと中間変数。次に、デバッガで実行をトレースするか、中間値のprint文を追加します。また、エラーメッセージの行番号は、実際のエラーがあることをよりよく理解することができます。 – zaph