Я создаю ключ, и я шифрую сообщение, отправляемое пользователем, и сохраняю это сообщение в файле, и после того, как я попытаюсь расшифровать это сообщение в файле, но я получаю эту ошибку cryptography.fernet.InvalidToken
. Я не использую время для токена, и я также преобразовал его в байты.
Мой код:
from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
def encry():
global f
what = input("What i need to encrypt?")
what_b = str.encode(what)
token = f.encrypt(what_b)
print("key generated")
print("encrypted")
file1=open("string.txt", "w")
file1.write(str(token))
file1.close()
file2=open("key.txt", "w")
file2.write(str(key))
file2.close()
def decry():
global f
print("decrypted")
file1=open("string.txt", "r").read()
file_de=str.encode(file1)
file2=open("de.txt", "w")
what_d = f.decrypt(file_de)
file1.close()
file2.write(str(what_d))
file2.close()
choose = input("Do you want, encrypt or decrypt?" + " " + "(e/d)")
if choose == "e":
encry()
elif choose == "d":
decry()
else:
print("Nothing to do")
Проблема возникает из-за того, как вы пишете и читаете сообщение и ключ к файлам и из них. Действительно, зашифрованный текст и ключи не являются strings
, а byte strings
и их нужно обрабатывать по-другому.
В вашем случае при чтении и записи достаточно указать, что вы делаете это в двоичном режиме, и вы можете сделать это, добавив флаг b. Более подробную информацию см. В документации.
Кроме того, в вашем расшифровке вам также нужно прочитать ключ из файла.
def encry():
key = Fernet.generate_key()
f = Fernet(key)
what = "example"
what_b = str.encode(what)
token = f.encrypt(what_b)
with open("string.txt", "wb") as f1, open("key.txt", "wb") as f2:
f1.write(token)
f2.write(key)
def decry():
with open("string.txt", "rb") as f1, open("key.txt", "rb") as f2:
token = f1.read()
key = f2.read()
f = Fernet(key)
what_d = str(f.decrypt(token),'utf-8') #converting back to string
encry()
decry()