Шифрование и дешифрование файлов с помощью 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. Мы обсудили некоторые части криптографической библиотеки, а также создали полный пример процесса.

Ответить