Прошу не судить слишком строго, всё-таки первая статья на Хабре как-никак :)
Вступление
В этой статье я расскажу, как создать программу для шифрования своих личных данных, с небольшой изюминкой в реализации. Возможно это не так надёжно как полное шифрование диска до загрузки ОС, за то что-то новое.
Представим такую ситуацию: на вашем компьютере хранятся очень важные и компрометирующие вас данные, а в вашу дверь кто-то ломится. Ваша задача заключается в том, что бы быстро и незаметно зашифровать всю важную информацию на своём компьютере.
Для этого понадобится всего-лишь отключить заранее подготовленную флешку (карту памяти) из своего компьютера, после чего программа работавшая до этого в фоновом режиме автоматически начнёт процесс шифрования выделенных данных. Вам остаётся лишь надёжнее спрятать флешку с ключом шифрования)
Реализация
Теперь попытаемся перенести описанную выше программу в реальный мир. В качестве языка программирования я выбрал 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)
Итог
Мы создали две программы: одна работает в скрытом режиме и проверяет подключена ли флешка к компьютеру, в ином случае программа автоматически шифрует выделенные данные, сохраняя ключ шифрования на нашу флешку. Вторая программа необходима для расшифровки этих самых данных с помощью сохранённого ключа на флешке.
Так же, программу можно добавить в автозагрузку, что бы не запускать её каждый раз при запуске компьютера вручную.
Теперь, всё что вам остаётся сделать, так это вставить свою флешку в компьютер, включить программу для шифрования наслаждаться пресловутой безопасностью :-)