Время прочтения: 3 мин.

Шифрование — это процесс кодирования информации, позволяющий только авторизованным сторонам получить к ней доступ. Подробно, о том для чего требуется шифрование файлов, рассказал Юрий Плотников в своей статье опубликованной 13.05.2020 на сайте NewTethAudit.ru, поэтому останавливаться на этом я не буду.

Также Юрий представил пример функции, выполняющей шифрование, используя язык программирования C#.

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

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

Итак,  установим библиотеку cryptography:

pip install cryptography

Открываем новый файл Python:

from cryptography.fernet import Fernet

Создаем ключ и сохраняем его в файл, например, crypto.key:

def write_key():
# Создаем ключ и сохраняем его в файл
    key = Fernet.generate_key()
    with open('crypto.key', 'wb') as key_file:
        key_file.write(key)

Внимание! Сгенерированный ключ crypto.key необходимо хранить в надежном месте. В случае его потери невозможно будет расшифровывать данные, которые были зашифрованы этим ключом.

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

Создадим функцию для загрузки этого ключа:

def load_key():
# Загружаем ключ 'crypto.key' из текущего каталога
    return open('crypto.key', 'rb').read()

Далее понадобится создать функцию  для шифрования файла:

def encrypt(filename, key):
# Зашифруем файл и записываем его
    f = Fernet(key)

После инициализации объекта Fernet с заданным ключом прочитаем этот файл:

    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)

Теперь создадим  функцию расшифровки файла:

def decrypt(filename, key):
# Расшифруем файл и записываем его
    f = Fernet(key)
    with open(filename, 'rb') as file:
        # читать зашифрованные данные
        encrypted_data = file.read()
    # расшифровать данные
    decrypted_data = f.decrypt(encrypted_data)
    # записать оригинальный файл
    with open(filename, 'wb') as file:
        file.write(decrypted_data)

И, наконец, проверим это на конкретном файле, разместив шифруемый файл и ключ в текущем каталоге.

Например, для  шифрования файла с именем ‘report.csv’ вызываем созданную  функцию  encrypt():

# раскомментируйте следующую строку, если запускаете код впервые, чтобы сгенерировать ключ
# write_key()
# загрузить ключ
key = load_key()
# имя шифруемого файла
file = 'report.csv'
# зашифровать файл
encrypt(file, key)

После шифрования будет видно, что размер файла ‘report.csv’ увеличился, и мы не сможем прочитать содержимое этого файл.

Чтобы вернуть файл ‘report.csv’ в исходную форму,  вызовем  функцию decrypt ():

# расшифровать файл
decrypt(file, key)

Получаем исходный файл ‘report.csv’ вместо ранее зашифрованного.

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

Применение этого несложного кода Python даст возможность надежно защитить данные от несанкционированного доступа к ним и соблюсти требования кибербезопасности при работе с критически важной информацией. При этом установки какого-либо специального программного обеспечения не требуется.