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

Шифрование — это процесс кодирования информации, позволяющий только авторизованным сторонам получить к ней доступ.

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

0
6 комментариев
Написать комментарий...
Алексей Nein

перевели readme. ну-ну.

...Обратите внимание на то, что при применении данного кода, размер файла не должен превышать объем оперативной памяти... (с).
 
А это вообще стыдно. Пример с генератором был бы куда интересней.

Ответить
Развернуть ветку
NTA
Автор

Алексей, спасибо за Вашу обратную связь. Стараемся делиться только той информацией, которую используем в работе. Про ваше предложение с генератором - посмотрим, изучим 

Ответить
Развернуть ветку
Петя Мурадян

Где следует хранить crypto.key? И как реализовать ограниченный доступ к нему
Если я правильно понимаю при доступе к нему шифрование теряет всякую защиту.

Ответить
Развернуть ветку
Kazbek Zhumagazyev

Задачи:
Примените процедуру шифрования к нечетным инструкциям (1,3, ..., 29) и четным (2,4 ..., 30)
Рекомендуется использовать метод дешифрования. На работе
Сохраните результат в другом файле, используя (исходящий) файл данных
должен. Используйте датчик в соответствии с вашими инструкциями, чтобы получить значение. есть 

Ответить
Развернуть ветку
Алексей Николаевич

Интересно. Попробуем...

Ответить
Развернуть ветку
NTA
Автор

👀 будем рады комментариям

Ответить
Развернуть ветку
3 комментария
Раскрывать всегда