Ошибка: ключ Fernet должен содержать 32 байта в кодировке base64, безопасных для URL

#python #encryption #fernet

#питон #шифрование #фернет

Вопрос:

В настоящее время я работаю над программой шифрования/дешифрования на Python с использованием Fernet. Вот мой код до сих пор:

 from cryptography.fernet import Fernet  def decrypter():  enc_message = input("Input an encrypted string:n")   key = input("Input a key:n")   fernet = Fernet(key)   dec_message = fernet.decrypt(enc_message).decode()  print(dec_message)  def encrypter():  message = input("Input a string to encrypt:n")  key = Fernet.generate_key()  fernet = Fernet(key)    enc_message = fernet.encrypt(message.encode())   print("")  print("Original string: ", message)  print("")  print("Encrypted string: ", repr(enc_message))  print("")  print("Key: ", repr(key))  print("")  dec_message = fernet.decrypt(enc_message).decode()   print("Decrypted string: ", dec_message)  encrypter() decrypter()  

В конечном итоге я планирую добавить больше функций качества жизни, но прямо сейчас функция шифрования запрашивает у вас строку для шифрования, генерирует ключ с помощью Fernet, шифрует вашу строку, а затем печатает вашу исходную строку, вашу недавно зашифрованную строку и ключ шифрования. (Это не та часть, которая нуждается в исправлении.)

Идея функции дешифратора заключается в том, что она берет зашифрованную строку и ключ из функции шифратора. Затем он расшифровывает строку с помощью ключа и печатает ее.

Моя проблема в том, что ключ вызывает ошибку. Я не уверен, правильно ли я закодировал дешифровщик или я просто неправильно ввожу ключ.

Мои извинения, если это легко решаемый вопрос, я новичок в Python и не смог найти никаких ответов специально для этого в Интернете. Любая помощь будет очень признательна!

Комментарии:

1. Ваш код был бы лучше структурирован, если бы шифратору и дешифратору передавались ключ и текст для шифрования в качестве параметров, т. Е. Принимались входные данные и вычислялся ключ перед вызовом шифратора. И шифровальщик может вернуть зашифрованные данные, а затем ваш вызывающий код передает ключ и зашифрованные данные в качестве параметров дешифровальщику, который возвращает результат дешифрования. Этот стиль кодирования также позволит вам изначально использовать жестко закодированный текст для шифрования, поэтому вам не придется вводить данные каждый раз, когда вы запускаете свой код. Это также обеспечивает способ получения ключа к дешифратору 🙂

2. @balmy спасибо за быстрый ответ! Вы имеете в виду, что вместо этого я должен эффективно сделать строку и ключ универсальной переменной? Я хочу сделать так, чтобы пользователь теоретически мог использовать шифратор, скопировать строку и ключ, выйти из программы, а затем использовать дешифратор.

3. Под универсальным вы подразумеваете глобальное? Я имею в виду сделать ключ и строку для шифрования, а зашифрованные строки переменными вне функций, предоставляемыми/возвращаемыми функциями. Использование параметров и возвратов означает, что вы можете использовать шифратор и дешифратор более различными способами — альтернативой использованию глобальных переменных является анти-шаблон (т. Е. Его следует избегать), что затрудняет повторное использование и поддержку вашего кода.

Ответ №1:

Ваш текущий подход к этому заключается в том, чтобы выполнять весь ввод и печать в рамках функций дешифратора и шифрования. Это означает, что если вы когда-нибудь захотите сделать что-то немного другое с результатами шифрования, вам придется переписать эти функции.

Ваш код был бы более многоразовым и модульным, если бы вы сохраняли ввод и печать отдельно для функций, которые выполняют эту работу, например:

 from cryptography.fernet import Fernet  def encrypter(key,plaintext):  fernet = Fernet(key)  enc_message = fernet.encrypt(plaintext.encode())  return enc_message  def decrypter(key,ciphertext):  fernet = Fernet(key)  dec_message = fernet.decrypt(ciphertext).decode()  return dec_message  def generatekey():  key = Fernet.generate_key()  return key  if __name__=="__main__":  # comment out input() so code can be tested simply  #plaintext = input("Input a string to encrypt:n")  plaintext= "A test message"   key = generatekey()   ciphertext = encrypter(key,plaintext)   print("")  print("Original string: ", plaintext)  print("")  print("Encrypted string: ", repr(ciphertext))  print("")  print("Key: ", repr(key))  print("")   decoded_message = decrypter(key,ciphertext)   print("Decrypted string: ", decoded_message)  

Теперь вы можете написать другой файл, который импортировал вышеуказанный файл и использует generatekey, шифровальщик и дешифровальщик, возможно, принимая ввод от пользователя, не зная или не используя fernet вообще 🙂

Комментарии:

1. Спасибо! Я попробую это сделать 🙂