#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)