• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Делаем быструю и удобную программу для шифрования файлов с usb сертификатом

Привет Codeby !

main.png


Интро

Надумал сделать удобную программу для шифрования файлов без паролей, с использованием ключа, чтобы он хранился на носителе, таким образом чтобы шифровать/дешифровать файлы/директории было удобно и просто, запустил экзешник, засунул флешку, и готово. Алгоритм симметричного шифрования работает достаточно быстро, да и к слову совсем изголяться и от кого то прятаться не является целью данной статьи. Но у меня есть доки и файлы, в которых я могу писать пароли к некоторым сервисам и тд. т.к. всего не упомнишь и хотелось бы чтобы эти данные были скрыты от чужих глаз, если что. Фотки видосы скрипты - все что угодно. Мне понравилась функциональность данного скрипта и я использую его в своих целях, именно поэтому решил написать тут, кто то может использовать его или допилить и сделать более круто и удобно т.к. сам код достаточно прост. Заодно попытаюсь немного разобрать плюсы/минусы симметричного шифрования, на деле же думаю что более безопасен гибридный метод совмещающий ассиметричные и симметричные алгоритмы. Но тем не менее, просто так с наскока расшифровать какие-то файлы без ключа, не думаю что просто так получиться. Конечно же исхожу из мысли, что это не какие то секретные документы от которых зависят судьбы государств. (что простите ? :D) Лирическое отступление такое :) Давайте разберем :


Симметричное шифрование

Итак, симметричное шифрование (далее СШ) - это способ шифрования/дешифровки с использованием одного ключа.

symmetric_encryption.png


В ассиметричном - как вы знаете, используются два ключа, закрытый/открытый (Диффи Хелманы - все дела). Основной недостаток СШ - это то, что ключ всего один и для расшифровки вам надо как то передать его той же Алисе. Поэтому для ЭЦП и других подобных задач симметричные алгоритмы не применяются. Но этот недостаток для нас как раз таки не имеет значения. Мы сгенерим свой ключ, чтобы он хранился только у нас и больше никто не имел доступа к нему.


Готовим флешку

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

1.png


Имеем постоянный путь к этой флешке: X:\


Скрипт

В скрипте используется Fernet из модуля cryptography. Все достаточно тривиально, три команды на инпут шифровать/дешифровать/генерировать новый ключ.

Python:
# -*- codng: utf8 -*-
import os
import sys
from cryptography.fernet import Fernet

# AES 128 CBC

# интро такое себе, предлагаю сделать лучше :D
intro = ['ИНТРО?']

def print_intro():
    for x in intro:
        print(x)

def write_key():
    key = Fernet.generate_key()
    with open('pantera.key', 'wb') as key_file:
        key_file.write(key)

def load_key():
    # путь до директории и ключа на USB
    return open(r'X:\pantera_key\pantera.key', 'rb').read()

def encrypt_file(filename):
    key = load_key()
    f = Fernet(key)
    with open(filename, 'rb') as file:
        file_data = file.read()
    encrypted_data = f.encrypt(file_data)
    print('file {} was encrypt'.format(filename))
    with open(filename, 'wb') as file:
        file.write(encrypted_data)

def encrypt_directory(crypt_dir):
    try:
        for file in os.listdir(crypt_dir):
            if os.path.isdir(crypt_dir + '\\' + file):
                encrypt_directory(crypt_dir + '\\' + file)
            if os.path.isfile(crypt_dir + '\\' + file):
                try:
                    encrypt_file(crypt_dir + '\\' + file)
                except:
                    pass
    except Exception as e:
        print(e)

def decrypt_file(filename):
    key = load_key()
    f = Fernet(key)
    with open(filename, 'rb') as file:
        encrypted_data = file.read()
    decrypted_data = f.decrypt(encrypted_data)
    print('file {} was decrypt'.format(filename))
    with open(filename, 'wb') as file:
        file.write(decrypted_data)

def decrypt_directory(decrypt_dir):
    try:
        for file in os.listdir(decrypt_dir):
            if os.path.isdir(decrypt_dir + '\\' + file):
                decrypt_directory(decrypt_dir + '\\' + file)
            if os.path.isfile(decrypt_dir + '\\' + file):
                try:
                    decrypt_file(decrypt_dir + '\\' + file)
                except:
                    pass
    except Exception as e:
        print(e)

def pantera():
    while True:
        try:
            cord = input('crypt/decrypt/genkey # ')
            if cord == 'crypt':
                crypt_dir = input('Crypt directory # ')
                try:
                    encrypt_directory(crypt_dir)
                except Exception as e:
                    print(e)
            elif cord == 'decrypt':
                decrypt_dir = input('Decrypt directory # ')
                try:
                    decrypt_directory(decrypt_dir)
                except Exception as e:
                    print(e)
            elif cord == 'genkey':
                write_key()
            else:
                print('')
                print('Wrong command ...')
        except KeyboardInterrupt:
            sys.exit()

if __name__ == '__main__':
    print_intro()
    pantera()



Работа


Компилим все этой в .exe pyinstaller'ом
Код:
pyinstaller --onefile script.py icon=your_picture.ico
И получаем резвый и достаточно удобный в использовании скрипт. Для использования: втыкаем флешку, запускаем .exe

2.png


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


Спасибо за внимание !
 

Johan Van

Green Team
13.06.2020
352
662
BIT
167
В принципе особо готовить ничего и не надо. Нужна безопасная флеха, которую мы не пихаем в первые попавшиеся тачки, а храним где то на ключах или типо того, для каких-нибудь особых случаев ) На usb-хе будет создана директория, в который будет лежать ключик. Далее нужно проделать одну манипуляцию, дело в том, что путь до ключа будет захардкожен в скрипте, ибо не вижу смысла каждый раз для шифра/дешифра прописывать лишние строки.

Доброго времени суток ) Извини, не удержался... По поводу жесткого пути... Тут же можно так вот сделать:

Python:
# pip install psutil

import os.path

import psutil

for disk in psutil.disk_partitions():
    if os.path.isfile(os.path.join(disk[1], 'key.key')):
        print(f'[+] Bingo! Ключ тут: {os.path.join(disk[1], "key.key")}')

000.jpg

И в обеих системах работает. Еще раз прошу прощения )
 

Trixxx

Grey Team
04.04.2020
196
154
BIT
23
Доброго времени суток ) Извини, не удержался... По поводу жесткого пути... Тут же можно так вот сделать:

Python:
# pip install psutil

import os.path

import psutil

for disk in psutil.disk_partitions():
    if os.path.isfile(os.path.join(disk[1], 'key.key')):
        print(f'[+] Bingo! Ключ тут: {os.path.join(disk[1], "key.key")}')


И в обеих системах работает. Еще раз прошу прощения )
А за что извинить то? :D Норм вариант, я просто под виндой делал.
 
  • Нравится
Реакции: Johan Van

Adrian

New member
03.04.2020
3
0
BIT
0
"Компилим все этой в .exe pyinstaller'ом.."
Не надо давать настолько плохих советов. В питоне ничего не "компилится" и запускается иначе. Pyinstaller вообще Очень Плохая Идея.

В третьей версии языка это лишнее, требовалось только во второй.
 

Johan Van

Green Team
13.06.2020
352
662
BIT
167
Не надо давать настолько плохих советов. В питоне ничего не "компилится" и запускается иначе. Pyinstaller вообще Очень Плохая Идея.


В третьей версии языка это лишнее, требовалось только во второй.

Ну, можно еще попытаться использовать nuitka. Но не знаю, работает ли она с последними версиями питона, выше 3.9. Давно не смотрел проект. Но с nuitka слегка придется потанцевать с бубном. Зато получится действительно скомпиленный проект )) А пайинсталлер - больше упаковщик, чем компилятор.

Впрочем, что на Pyinstaller, что на Nuitka могут ругаться антивирусы. Для них наличие что одного, что другого - уже тревожный признак.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!