Ошибка криптографии Fernet при чтении токена из файла

1

Я создаю ключ, и я шифрую сообщение, отправляемое пользователем, и сохраняю это сообщение в файле, и после того, как я попытаюсь расшифровать это сообщение в файле, но я получаю эту ошибку 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")
Теги:
cryptography

1 ответ

1
Лучший ответ

Проблема возникает из-за того, как вы пишете и читаете сообщение и ключ к файлам и из них. Действительно, зашифрованный текст и ключи не являются 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()
  • 0
    Спасибо вам, ваш ответ, я помог мне понять, где проблема

Ещё вопросы

Сообщество Overcoder
Наверх
Меню