Шифрование файлов

Шифрование файлов

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

Report Page