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

Вступление

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

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

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

Реализация

Теперь попытаемся перенести описанную выше программу в реальный мир. В качестве языка программирования я выбрал 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)

Итог

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

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

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

Комментарии (34)


  1. BugM
    13.07.2023 12:39
    +6

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

    Работа с файловой системой тоже не так проста. Разнообразные симлинки доставляют много радости.


    1. vilgeforce
      13.07.2023 12:39
      +4

      Даже если не брать в расчет симлинки и прочее веселье, наивный подход "открыть-прочитать-записать-закрыть" показывает далеко не лучшую производительность. Плохие парни, которые хотят шифровать максимально быстро, уже много лет используют всякие зубодробительные WinAPI про CompletionPort. Но это сложно писать и отлаживать...


      1. freeExec
        13.07.2023 12:39
        +4

        Особенно на питоне


    1. Flux
      13.07.2023 12:39
      +2

      Никогда не пишите криптографию самостоятельно. Вообще никогда.

      Поддерживаю. Доверьте это профессионалам - они знают своё дело. Они и код более качественный напишут, и константы правильные подберут.


      1. Shaman_RSHU
        13.07.2023 12:39
        +1

        И бекдоры встроят (шутка). Если серьезно, то лучше конечно использовать проверенные временем и людьми алгоритмы.


    1. freeExec
      13.07.2023 12:39
      +2

      Он и не пишет криптографию сам а взял какой-то fernet


    1. Truzme Автор
      13.07.2023 12:39

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


  1. jh0ns0n
    13.07.2023 12:39
    +3

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


    1. dartraiden
      13.07.2023 12:39
      +1

      Проще использовать условный BitLocker с ключевым файлом на флешке / карте памяти.


      Носитель с файлом вполне реально уничтожить (раздолбать молотком чип памяти / проглотить microSD-карточку), пока пилят дверь. И никакое электричество для этого не нужно. Единственное условие — дверь должна открываться наружу и выдержать несколько минут.


    1. Truzme Автор
      13.07.2023 12:39

      Думаю лучше потерять зашифрованные данные, чем они попадут в не те руки. К тому же есть такая же вероятность что и жёсткий диск с данными может полететь. А про ИБП я тоже думал, интересная тема)


  1. vilgeforce
    13.07.2023 12:39
    +3

    Вы говорите об "экстренном" шифровании, но при этом используете не чистый AES, а некоторую надстройку над ним по имени fernet. Очень беглый гуглинг показывает, что она использует HMAC, который считается по всему шифротексту. Это однозначно будет оказывать влияние на скорость шифрования (не в лучшую сторону), при этом никак не увеличивая стойкость шифрования к прочтению ломящимися в дверь.


    1. Truzme Автор
      13.07.2023 12:39

      Не могу с вами не согласится. Fernet взял из-за лёгкости в понимании, в отличии от других библиотек в которых всё не много сложнее.


  1. OldFisher
    13.07.2023 12:39
    +18

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


    1. Aelliari
      13.07.2023 12:39
      +3

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

      P.S. Сейчас хватает SSD шифрующих данные по умолчанию, пусть 100% доверия к вендорским поделкам тоже нет, но у части из них есть функция «Secure Erase», которая, собственно и убивает ключ шифрования в памяти контроллера SSD


  1. Akina
    13.07.2023 12:39
    +2

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

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

    А коллекция порнушки так и останется незашифрованной.

    Я уж не говорю о том, что те, кто ломится - они сначала бьют по рубильнику, и только потом ломятся. А бесперебойника в коде я как-то не вижу...


  1. aamonster
    13.07.2023 12:39
    +10

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


  1. anzay911
    13.07.2023 12:39
    +1

    В комментах уже высказались про проверенные решения, и это верно. А мне вот иногда вспоминается ситуация, когда полиция инсценировала драку в кафе, чтобы завладеть ноутбуком сидевшего там админа хакерского форума, чтобы он не успел заблокировать ничего. Горячие клавиши не нажмёшь, супернадёжный veracrypt не размонтируется. Кроме скрипта с bluetooth ничего в голову не приходит.


    1. BugM
      13.07.2023 12:39
      -1

      Закрыть крышку ноута это правда так сложно и долго? Да, этого достаточно.

      Если ответ да - не открывайте ноут в публичных местах.


      1. Kuklachev
        13.07.2023 12:39

        Он не успел закрыть. У него выхватили ноут и скрутили хакера.


      1. splix
        13.07.2023 12:39

        Именно так поймали основателя Silk Road. Инсценировав какие-то действия рядом с его столиком чтобы он повернул голову, и в этот момент с другой стороны выхватили ноутбук что-бы не успел закрыть крышку.


        1. BugM
          13.07.2023 12:39
          +2

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


    1. 9982th
      13.07.2023 12:39

      FaceID?


      1. Serge78rus
        13.07.2023 12:39
        +1

        После общения с полицией "ключ" к FaceID может измениться настолько, что в итоге сам не сможешь ничего расшифровать.


    1. Kuklachev
      13.07.2023 12:39
      -1

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


    1. Aelliari
      13.07.2023 12:39
      +1

      Два фактора разблокировки, условная «флешка-ключ» и пароль, по наступлению события (флешка покидает порт) - блокировка криптоконтейнера. Флешку - на веревочку, и на браслет/лямку джинсов для ремня.


    1. not-allowed-here
      13.07.2023 12:39

      таймеры... правда задалбывает, но безопасность дороже... еще бывает так что на корпусе есть особое место где стоит датчик Холла... хотя счас можно и El-Marine и Mifare


  1. KivApple
    13.07.2023 12:39
    +1

    Очень оригинальное решение.

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

    В чём преимущество вашего метода? Возможность выпить чаю с ломяшимеся в дверь людьми, пока ждёте окончания процесса шифрования?


    1. Mingun
      13.07.2023 12:39

      Когда ломятся в дверь, руки сразу холодеют. Вот, чтобы немного согреться, нужно чтобы под стулом подгорало — успеет, не успеет?


      (Даже какая-никакая, а рифма)


  1. rudnik85
    13.07.2023 12:39
    +2

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

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


  1. not-allowed-here
    13.07.2023 12:39
    +1

    а смысл?

    1. данный которые существуют с любой криптографией будет расшифрованы - ВСЕГДА. и да за вполне конечное время. обычно время до начала расшифровки занимает от 45 минут в зависимости от опытности допрашивающего и того на сколько угрожающе выглядит методика прикладного криптоанализа.....

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

    3. даже если вы уничтожили носители не факт что органы уже не имеют копии всех важных для дела данных..... хакеры есть и у них то же плюс возможность легального MITM.....


    1. Kuklachev
      13.07.2023 12:39
      -1

      Недооценивать органы не стоит, но и преувеличивать их возможности тоже не нужно. Далеко не всегда практикуется термоанализ. Я бы предположил, что в современных реалиях это как раз редкость. Адвокаты, видеосъемка в учреждениях и т.п. все таки не очень способствует. Да и возможности по восстановлению тоже не надо преувеличивать. У меня к примеру один ssd диск накрылся. И оказалось, что данные за полгода почему-то не были забэкаплены. Обращался в разные организации по восстановлению, помочь не смогли.


      1. not-allowed-here
        13.07.2023 12:39
        +1

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

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


  1. DimoniXo
    13.07.2023 12:39

    Пользуясь случаем. А нет ли для Android реализаций подобных сценариев. Например, при вводе определённого пин кода на заблокированном экране происходит форматирование data


  1. garwall
    13.07.2023 12:39

    краткая инструкция, "как написать самому себе ransomware."

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