Шифрование файлов
Anton KudryavtsevВсем привет! Я расскажу про свой алгоритм для шифрования файлов. Я не особо хорошо знаю криптографию и безопасность, потому мне сложно оценить насколько алгоритм хорош или плох.
Алгоритм очень прост для понимания. Основная его суть это разбивания файла на части и их шифрование, а потом их обратная сборка. Перейдём к более детальному разбору алгоритма.
Введем следующие структуры:
Item в нашем случае это путь. FileInfo информация о файле. Эти структуры вводить не обязательно, они нужно для понимания и всё.
Сам алгоритм шифрования выглядит так:
Мы получаем хеш пароля для шифровки и информации о файле. Это нужно для того чтобы мы могли как-то определять наш файл. Дальше делим файл на части. После этого берём каждую часть по очереди, прибавляем к хешу файла индекс. Это будет путь к части файла. Дальше шифруем данные и записываем по пути. Алгоритм шифрует и возвращает количество частей. Это нужно для дешифровки.
Алгоритм для дешифровки:
Для дешифрирования нужно иметь информацию про файл, пароль и количество частей. Алгоритм работает в обратную сторону потому объяснять его нету смысла.
Алгоритм очень прост. И его можно улучшить. К примеру убрать необходимость знать количество частей и проверять целостность файлов к примеру с помощью блокчейна. Может когда будет время и желания сделаю.
Моя простенькая реализация на Python:
from hashlib import sha256 from Crypto.Cipher import DES import os size_block = 64 def pad(text): while len(text) % 8 != 0: text += b' ' return text def encrypt_file(info, password, content): i = 0 hash_obj = sha256(info.encode('utf-8') + password.encode('utf-8')).hexdigest() des = DES.new(pad(password.encode()), DES.MODE_ECB) for part in content: buf = des.encrypt(pad(part)) path = str(sha256(hash_obj.encode('utf-8') + str(i).encode('utf-8')).hexdigest()) print(path) with open(path, 'wb') as f: f.write(buf) i += 1 print("Count of block: ", i) def decrypt_file(info, password, count): hash_obj = sha256(info.encode('utf-8') + password.encode('utf-8')).hexdigest() des = DES.new(pad(password.encode()), DES.MODE_ECB) res = b"" i = 0 while i < count: path = str(sha256(hash_obj.encode('utf-8') + str(i).encode('utf-8')).hexdigest()) i += 1 with open(path, 'rb') as f: buf = f.read(size_block) res += des.decrypt(buf) with open(info, 'wb') as f: f.write(res) choose = input("Encrypt/decrypt file?(e/d)") password = input("Password: ") path = input("Path: ") if choose == "e": content = [] with open(path,'rb') as f: while True: buf = f.read(size_block) if not buf: break content.append(buf) encrypt_file(path, password, content) os.remove(path) print("Succes") elif choose == "d": count = int(input("Count of block: ")) decrypt_file(path, password, count) print("Ok")
Пример работы шифрования
Пример работы дешифрирования:
Если у вас не запускается код установите некоторые библиотеки через pip:
pip install pycryptodome
или
pip install pycryptodomex
Брал информацию про шифрование файлов в python отсюда https://python-scripts.com/encryption-cryptography
По всем вопросам или предложениям пишите в телеграм @kudrya_a_1