Как стать автором
Обновить

Экстренное шифрование данных

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров8.4K

Прошу не судить слишком строго, всё-таки первая статья на Хабре как-никак :)

Вступление

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

Представим такую ситуацию: на вашем компьютере хранятся очень важные и компрометирующие вас данные, а в вашу дверь кто-то ломится. Ваша задача заключается в том, что бы быстро и незаметно зашифровать всю важную информацию на своём компьютере.

Для этого понадобится всего-лишь отключить заранее подготовленную флешку (карту памяти) из своего компьютера, после чего программа работавшая до этого в фоновом режиме автоматически начнёт процесс шифрования выделенных данных. Вам остаётся лишь надёжнее спрятать флешку с ключом шифрования)

Реализация

Теперь попытаемся перенести описанную выше программу в реальный мир. В качестве языка программирования я выбрал Python. Во-первых, он удобен для этих целей, а во-вторых, я знаю его лучше всех остальных. Для начала создадим программу для шифрования. Установим библиотеку cryptography:

pip install cryptography

Далее импортируем в нашу программу все необходимые библиотеки:

import os
import sys
from cryptography.fernet import Fernet

После этого создадим переменные с буквой нашей флешки и путём к папке файлы в которой необходимо зашифровать. В моём случае буква диска — E. Так же необходимо написать функцию которая будет проверять, подключена ли флешка к компьютеру или нет. Я долго думал как реализовать эту функцию лучше всего. По итогу пришёл к такому варианту:

drive_letter = "E"
encrypted_path = "C:/Data"

def check_drive(drive_letter):
	if os.system("cd " + drive_letter + ":") == 0:
		return True
	else:
		return False

Далее создадим функции создания и чтения ключа шифрования:

def write_key():
	key = Fernet.generate_key()

	with open(drive_letter + ":/key.txt", "wb") as key_file:
		key_file.write(key)

def load_key():
	with open(drive_letter + ":/key.txt", "r") as file:
		key = file.read()

	return key

Как вы видите ключ создаётся и читается именно на диске E:/, то есть на флешке. Это означает что вынув её из компьютера, доступ к зашифрованным файлам останется только у вас.

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

def encrypt(filename, key): # Шифрование файла
	fernet = Fernet(key)

	with open(filename, "rb") as file:
		file_data = file.read()

		encrypted_data = fernet.encrypt(file_data)

		with open(filename, "wb") as file:
			file.write(encrypted_data)

def decrypt(filename, key): # Расшифровка файла
	fernet = Fernet(key)

	with open(filename, "rb") as file:
		file_data = file.read()

	decrypted_data = fernet.decrypt(file_data)

	with open(filename, "wb") as file:
		file.write(decrypted_data)

Теперь самое интересное. Напишем функцию, с помощью которой наша программа будет перемещаться по директориям и шифровать файлы. Для начала определим список файлов и папок в текущей директории с помощью функции os.listdir(). Дальше пройдёмся по ранее полученному списку и определим тип каждого элемента: файл или папка. Если это файл — шифруем его, если папка — запускаем нашу функцию повторно по новому пути.

def walk(directory):
	names = os.listdir(directory)

	for name in names:
		path = os.path.join(directory, name)
		ext = os.path.splitext(path)

		if os.path.isfile(path):
			encrypt(path, key)
		else:
			walk(path)

Ну и последний штрих. Если файл key.txt не найден на флешке, создаём его. Далее читаем из него ключ и сохраняем его в переменной key. После создаём бесконечный цикл проверки подключения флешки и если наша программа обнаружит что флешка отключена будет инициализирована функция walk(), в качестве аргумента передаём ей директорию, файлы и папки в которой нужно зашифровать:

if os.path.isfile(drive_letter + ":/key.txt") == False:
	write_key()
	key = load_key()
else:
	key = load_key()

while True:
	if not check_drive(drive_letter):
		walk(encrypted_path)
		print("Encrypted!")
		break

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

import os
import sys
from cryptography.fernet import Fernet

drive_letter = "E"
decrypted_path = "C:/Data"

def load_key():
	with open(drive_letter + ":/key.txt", "r") as file:
		key = file.read()

	return key

def decrypt(filename, key):
	fernet = Fernet(key)

	with open(filename, "rb") as file:
		file_data = file.read()

	decrypted_data = fernet.decrypt(file_data)

	with open(filename, "wb") as file:
		file.write(decrypted_data)

def walk(directory):
	names = os.listdir(directory)

	for name in names:
		path = os.path.join(directory, name)
		ext = os.path.splitext(path)

		if os.path.isfile(path):
			decrypt(path, key)
		else:
			walk(path)

key = load_key()
            
walk(decrypted_path)

Итог

Мы создали две программы: одна работает в скрытом режиме и проверяет подключена ли флешка к компьютеру, в ином случае программа автоматически шифрует выделенные данные, сохраняя ключ шифрования на нашу флешку. Вторая программа необходима для расшифровки этих самых данных с помощью сохранённого ключа на флешке.

Так же, программу можно добавить в автозагрузку, что бы не запускать её каждый раз при запуске компьютера вручную.

Теперь, всё что вам остаётся сделать, так это вставить свою флешку в компьютер, включить программу для шифрования наслаждаться пресловутой безопасностью :-)

Теги:
Хабы:
Всего голосов 11: ↑4 и ↓7-1
Комментарии45

Публикации

Работа

Ближайшие события