Цвет

Шифрование файлов на Python

99₽ 129₽

Категории:

pythonencryption

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

Для шифрования мы будем использовать необходимые модули. Мы импортируем их так:

import os
import sys
from cryptography.fernet import Fernet

Ключевым в данном случае будет модуль Fernet. С помощью него мы будем генерировать ключ и сохранять его в файл.

Для начала генерируем ключ с помощью метода generate_key() и запишем его в переменную key:

key = Fernet.generate_key()

Создаем функцию, чтобы убедиться, что в конце пути будет слэш.

def checkForEnd(path):
     myPath = str(path)
     if myPath[-1] != "\\":
         myPath +="\\"
     return myPath

Функция checkForEnd проверяет находимся ли мы корневой директории (C:, D: и т.д.), если это так, то добавляет один обратный слэш. Чтобы пропустить символ обратного слэша, нужно поставить второй обратный слэш перед ним так "\\"

Мы будем сохранять файл в ту же папку, где расположен наш .py файл. Для этого используется модуль os:

myPath= checkForEnd(os.path.dirname(__file__))
myPathFull= os.path.join(myPath, "filekey.key")

os.path.join() мы соединили путь к нашему файлу питон

os.path.dirname(__file__)

и само название файла filekey.key

!!!Для исполняемых файлов типа .exe, вместо __file__ нужно использовать sys.executable как аргумент

os.path.dirname(sys.executable)

Для начала нам нужно открыть файл с помощью встроенной конструкции with open() as и записать туда ключ так:

with open(myPathFull, 'wb') as file:
      file.write(key)

Дальше считываем ключ той же конструкцией и запишем в key:

with open(myPathFull, 'rb') as file:
      key = file.read()

Создаем элемент объекта Fernet:

fernet = Fernet(key)

мы будем использовать его методы fernet.encrypt() и fernet.decrypt() для шифрования и дешифрования данных.

Мы создадим тестовый текстовый файл NewNode.txt в той же директории (в той же папке), где мы находимся. И запишем в него любое предложение. Далее открываем файл с параметрами для чтения то есть rb - read bytes

with open("B:\python_projects\MyNode.txt", 'rb') as fl:
      original = fl.read()

Далее с помощью метода encrypt, созданного нами объекта fernet, шифруем данные, которые мы считали.

encrypted = fernet.encrypt(original)

Осталось вписать зашифрованные данные в наш файл и заменить тем самым его содержимое.

with open("B:\python_projects\MyNode.txt", 'wb') as encrypted_file:
      encrypted_file.write(encrypted)

Готово. Теперь все данные в текстовом файле зашифрованы и могут быть расшифрованы с помощью дешифрования.

Чтобы дешифровать содержимое файла, нам нужно сделать практически тоже самое. Для начала создадим второй Python файл с расширением .py , его мы будем использовать для дешифрования файла. Начала файла будет точно такое же:

import os
import sys
from cryptography.fernet import Fernet

key = Fernet.generate_key()

def checkForEnd(path):
      myPath = str(path)
      if myPath[-1] != "\\":
            myPath +="\\"
      return myPath

myPath= checkForEnd(os.path.dirname(__file__))

myPathFull= os.path.join(myPath, "filekey.key")

Далее мы должны считать наш ключ, адрес ключа записан в переменную myPathFull

with open(myPathFull, 'rb') as filekey:
      key = filekey.read()

Так же как и раньше, создаем элемент класса Fernet с аргументом считанного нами ключа

fernet = Fernet(key)

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

with open("B:\python_projects\MyNode.txt", 'rb') as fl:
      original = fl.read()

Записываем в переменную decrypted расшифрованные данные, с помощью метода decrypt

decrypted = fernet.decrypt(original)

Осталось записать расшифрованные данные в файл

with open("B:\python_projects\MyNode.txt", 'wb') as decrypted_file:
      decrypted_file.write(decrypted)