Шифрование и дешифрование файлов с помощью Python

В этой статье мы обсудим как зашифровать и расшифровать файлы с помощью Python.
Введение
В развивающемся мире передачи данных и информации безопасность содержимого файлов остается одной из самых серьезных проблем для компаний. Некоторая информация может быть защищена паролем (электронная почта, логины), в то время как другая информация, передаваемая по электронной почте или FTP, неэффективна, если защищена каким-либо ключевым словом. Здесь шифрование файлов играет большую роль и обеспечивает безопасность и удобство, которые необходимы сторонам, участвующим в передаче файлов.
Так что же такое шифрование? Это процесс преобразования информации в некую форму кода, чтобы скрыть его истинное содержание. Единственный способ получить доступ к информации о файле – это расшифровать его. Процесс шифрования / дешифрования называется криптографией.
Давайте посмотрим, как мы можем зашифровать и расшифровать некоторые из наших файлов с помощью Python. Мы будем следовать симметричному шифрованию, что означает использование одного и того же ключа для шифрования и дешифрования файлов.
Чтобы продолжить изучение этого руководства, нам понадобится следующая библиотека Python: cryptography
.
Если он у вас не установлен, откройте «Командную строку» (в Windows) и установите его, используя следующий код:
pip install cryptography
И нам также понадобится образец файла, с которым мы будем работать. Ниже представлен образец файла .csv с некоторыми данными об оценках учащихся:
grades.csv
Создание ключа
В нашем примере мы будем использовать симметричное уравнение:
from cryptography.fernet import Fernet
Fernet – это аутентифицированная криптография, которая не позволяет читать и / или изменять файл без «ключа».
Теперь давайте создадим ключ и сохраним его в той же папке, что и наш файл данных:
key = Fernet.generate_key()
with open('mykey.key', 'wb') as mykey:
mykey.write(key)
Если вы проверите каталог, в котором находится ваш код Python, вы должны увидеть файл mykey.key . Вы можете открыть его в любом текстовом редакторе (в моем случае он отображается в локальном каталоге, потому что я использую VS Code). Файл должен содержать одну строку, которая представляет собой строку из некоторого порядка символов. Для меня это «VlD8h2tEiJkQpKKnDNKnu8ya2fpIBMOo5oc7JKNasvk =».
Загрузка ключа
После того, как мы сгенерировали ключ шифрования, нам нужно будет загрузить его в нашу среду, чтобы зашифровать / расшифровать файлы.
Следующий шаг очень прост и требует просто открыть файл mykey.key и сохранить его в локальной памяти:
with open('mykey.key', 'rb') as mykey:
key = mykey.read()
print(key)
И чтобы убедиться, что загрузка ключа прошла успешна, мы увидим следующий вывод:
VlD8h2tEiJkQpKKnDNKnu8ya2fpIBMOo5oc7JKNasvk=
Ключ шифрования теперь хранится локально в качестве ключевой переменной.
Шифрование файла с помощью Python
Теперь, когда у нас есть файл для шифрования и ключ шифрования, мы напишем функцию, которая будет использовать их и возвращать зашифрованный файл:
f = Fernet(key)
with open('grades.csv', 'rb') as original_file:
original = original_file.read()
encrypted = f.encrypt(original)
with open ('enc_grades.csv', 'wb') as encrypted_file:
encrypted_file.write(encrypted)
Объяснение:
- Мы инициализируем объект Fernet как локальную переменную f.
- Затем мы считываем наши исходные данные (файл grades.csv).
- Затем мы шифруем данные с помощью объекта Fernet и сохраняем их как зашифрованные.
- И, наконец, мы записываем его в новый файл .csv под названием «enc_grades.csv».
Вы можете посмотреть зашифрованный файл здесь:
enc_grades.csv
Расшифровка файла с помощью Python
После того, как вы зашифровали файл и, например, успешно переместили его в другое место, вы захотите получить к нему доступ. Теперь эти данные находятся в зашифрованном формате. Следующим шагом будет его дешифрование до исходного содержимого.
Процесс, которому мы сейчас будем следовать, – это процесс, обратный шифрованию. Точно такой же процесс, но теперь мы перейдем от зашифрованного файла к расшифрованному:
f = Fernet(key)
with open('enc_grades.csv', 'rb') as encrypted_file:
encrypted = encrypted_file.read()
decrypted = f.decrypt(encrypted)
with open('dec_grades.csv', 'wb') as decrypted_file:
decrypted_file.write(decrypted)
Объяснение:
- Мы инициализируем объект Fernet как локальную переменную f
- Затем мы читаем наши зашифрованные данные (файл enc_grades.csv)
- Затем мы расшифровываем данные с помощью объекта Fernet и сохраняем их в расшифрованном виде.
- И, наконец, мы записываем его в новый файл .csv под названием «dec_grades.csv».
Вы можете посмотреть расшифрованный файл здесь:
dec_grades.csv
Сравнивая «dec_grades.csv» с исходным «grades.csv», вы увидите, что на самом деле эти два файла имеют идентичное содержимое. Наш процесс шифрования / дешифрования прошел успешно.
Полный пример объектно-ориентированного программирования
Это бонусная часть, где я организовал все в более структурированном формате:
class Encryptor():
def key_create(self):
key = Fernet.generate_key()
return key
def key_write(self, key, key_name):
with open(key_name, 'wb') as mykey:
mykey.write(key)
def key_load(self, key_name):
with open(key_name, 'rb') as mykey:
key = mykey.read()
return key
def file_encrypt(self, key, original_file, encrypted_file):
f = Fernet(key)
with open(original_file, 'rb') as file:
original = file.read()
encrypted = f.encrypt(original)
with open (encrypted_file, 'wb') as file:
file.write(encrypted)
def file_decrypt(self, key, encrypted_file, decrypted_file):
f = Fernet(key)
with open(encrypted_file, 'rb') as file:
encrypted = file.read()
decrypted = f.decrypt(encrypted)
with open(decrypted_file, 'wb') as file:
file.write(decrypted)
А это пример шифрования / дешифрования с использованием указанного выше класса:
encryptor=Encryptor()
mykey=encryptor.key_create()
encryptor.key_write(mykey, 'mykey.key')
loaded_key=encryptor.key_load('mykey.key')
encryptor.file_encrypt(loaded_key, 'grades.csv', 'enc_grades.csv')
encryptor.file_decrypt(loaded_key, 'enc_grades.csv', 'dec_grades.csv')
Вывод
В этой статье рассказывается о базовом симметричном шифровании и дешифровании файлов с помощью Python. Мы обсудили некоторые части криптографической библиотеки, а также создали полный пример процесса.