Как зашифровать любой файл, независимо от его типа, с помощью Python?

#python #encryption #cryptography

Вопрос:

Поэтому я попытался прочитать файл и зашифровать его содержимое, cryptography.fernet но иногда файл содержит символы, которые не могут быть зашифрованы с помощью любого алгоритма, используемого в этой библиотеке. Я также попробовал библиотеку, pyAesCrypt которая имеет эту функцию: pyAesCrypt.encryptFile("data.txt", "data.txt.aes", password) . Но он также не может шифровать некоторые типы файлов, такие как gif. Я мало что знаю об алгоритме шифрования, происходящем в фоновом режиме, но есть ли какой-либо способ зашифровать все файлы, независимо от того, какие символы они содержат? Или, может быть, сначала закодировать их, чтобы избавиться от этих символов, а затем зашифровать их? Я просто даю идеи, основанные на тех небольших знаниях, которые у меня есть по этой теме.

Код, который я попробовал с помощью библиотеки Фернет:

 from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)

with open(filename, "r") as file:
    file_data = file.read()
    encrypted_data = f.encrypt(file_data.encode()).decode()

with open(filename, "w") as file:
    file.write(encrypted_data)
 

Когда я пытаюсь сделать это с помощью GIF-файлов, я получаю:

 UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 466: character maps to <undefined>
 

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

1. Можете ли вы привести примеры кода того, что вы пробовали, и какие типы файлов не работали при таком подходе?

2. @bobveringa Хорошо, я отредактировал сообщение.

3. Я редактировал сообщение пару раз из-за ошибок в примере кода, но я попробовал его без методов decode() и encode (), но также должен был использовать «rb» и «wb» вместо «r» и «b» в функции open (). Сейчас все работает нормально.

Ответ №1:

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

 from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)

with open(filename, "rb") as file:
    file_data = file.read()
    encrypted_data = f.encrypt(file_data)

with open(filename, "wb") as file:
    file.write(encrypted_data)