Привет Codeby !
Интро
Надумал сделать удобную программу для шифрования файлов без паролей, с использованием ключа, чтобы он хранился на носителе, таким образом чтобы шифровать/дешифровать файлы/директории было удобно и просто, запустил экзешник, засунул флешку, и готово. Алгоритм симметричного шифрования работает достаточно быстро, да и к слову совсем изголяться и от кого то прятаться не является целью данной статьи. Но у меня есть доки и файлы, в которых я могу писать пароли к некоторым сервисам и тд. т.к. всего не упомнишь и хотелось бы чтобы эти данные были скрыты от чужих глаз, если что. Фотки видосы скрипты - все что угодно. Мне понравилась функциональность данного скрипта и я использую его в своих целях, именно поэтому решил написать тут, кто то может использовать его или допилить и сделать более круто и удобно т.к. сам код достаточно прост. Заодно попытаюсь немного разобрать плюсы/минусы симметричного шифрования, на деле же думаю что более безопасен гибридный метод совмещающий ассиметричные и симметричные алгоритмы. Но тем не менее, просто так с наскока расшифровать какие-то файлы без ключа, не думаю что просто так получиться. Конечно же исхожу из мысли, что это не какие то секретные документы от которых зависят судьбы государств. (что простите ? ) Лирическое отступление такое Давайте разберем :
Симметричное шифрование
Итак, симметричное шифрование (далее СШ) - это способ шифрования/дешифровки с использованием одного ключа.
В ассиметричном - как вы знаете, используются два ключа, закрытый/открытый (Диффи Хелманы - все дела). Основной недостаток СШ - это то, что ключ всего один и для расшифровки вам надо как то передать его той же Алисе. Поэтому для ЭЦП и других подобных задач симметричные алгоритмы не применяются. Но этот недостаток для нас как раз таки не имеет значения. Мы сгенерим свой ключ, чтобы он хранился только у нас и больше никто не имел доступа к нему.
Готовим флешку
В принципе особо готовить ничего и не надо. Нужна безопасная флеха, которую мы не пихаем в первые попавшиеся тачки, а храним где то на ключах или типо того, для каких-нибудь особых случаев ) На usb-хе будет создана директория, в который будет лежать ключик. Далее нужно проделать одну манипуляцию, дело в том, что путь до ключа будет захардкожен в скрипте, ибо не вижу смысла каждый раз для шифра/дешифра прописывать лишние строки. Поэтому назначаю постоянную букву для флешки в управлении дисками. Делаю это под виндой, для линуха надо назначить постоянное имя для носителя, нашел вот такую
Имеем постоянный путь к этой флешке: X:\
Скрипт
В скрипте используется Fernet из модуля cryptography. Все достаточно тривиально, три команды на инпут шифровать/дешифровать/генерировать новый ключ.
Работа
Компилим все этой в .exe pyinstaller'ом
И получаем резвый и достаточно удобный в использовании скрипт. Для использования: втыкаем флешку, запускаем .exe
Все готово. Работает как уже говорил достаточно резво, для небольших файлов до 500 Мб практически незаметно.
Спасибо за внимание !
Интро
Надумал сделать удобную программу для шифрования файлов без паролей, с использованием ключа, чтобы он хранился на носителе, таким образом чтобы шифровать/дешифровать файлы/директории было удобно и просто, запустил экзешник, засунул флешку, и готово. Алгоритм симметричного шифрования работает достаточно быстро, да и к слову совсем изголяться и от кого то прятаться не является целью данной статьи. Но у меня есть доки и файлы, в которых я могу писать пароли к некоторым сервисам и тд. т.к. всего не упомнишь и хотелось бы чтобы эти данные были скрыты от чужих глаз, если что. Фотки видосы скрипты - все что угодно. Мне понравилась функциональность данного скрипта и я использую его в своих целях, именно поэтому решил написать тут, кто то может использовать его или допилить и сделать более круто и удобно т.к. сам код достаточно прост. Заодно попытаюсь немного разобрать плюсы/минусы симметричного шифрования, на деле же думаю что более безопасен гибридный метод совмещающий ассиметричные и симметричные алгоритмы. Но тем не менее, просто так с наскока расшифровать какие-то файлы без ключа, не думаю что просто так получиться. Конечно же исхожу из мысли, что это не какие то секретные документы от которых зависят судьбы государств. (что простите ? ) Лирическое отступление такое Давайте разберем :
Симметричное шифрование
Итак, симметричное шифрование (далее СШ) - это способ шифрования/дешифровки с использованием одного ключа.
В ассиметричном - как вы знаете, используются два ключа, закрытый/открытый (Диффи Хелманы - все дела). Основной недостаток СШ - это то, что ключ всего один и для расшифровки вам надо как то передать его той же Алисе. Поэтому для ЭЦП и других подобных задач симметричные алгоритмы не применяются. Но этот недостаток для нас как раз таки не имеет значения. Мы сгенерим свой ключ, чтобы он хранился только у нас и больше никто не имел доступа к нему.
Готовим флешку
В принципе особо готовить ничего и не надо. Нужна безопасная флеха, которую мы не пихаем в первые попавшиеся тачки, а храним где то на ключах или типо того, для каких-нибудь особых случаев ) На usb-хе будет создана директория, в который будет лежать ключик. Далее нужно проделать одну манипуляцию, дело в том, что путь до ключа будет захардкожен в скрипте, ибо не вижу смысла каждый раз для шифра/дешифра прописывать лишние строки. Поэтому назначаю постоянную букву для флешки в управлении дисками. Делаю это под виндой, для линуха надо назначить постоянное имя для носителя, нашел вот такую
Ссылка скрыта от гостей
. Таким образом под линь надо поменять одну строку кода, в которой прописан путь до сертификата.Имеем постоянный путь к этой флешке: 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
Все готово. Работает как уже говорил достаточно резво, для небольших файлов до 500 Мб практически незаметно.
Спасибо за внимание !