使用python加密主机文件几种方法实现
作者:一青一柠 发布时间:2021-03-06 03:16:12
数据加密是一种保护数据安全的技术,通过对数据进行编码,使得未经授权的用户无法读取或改动数据。
加密是通过使用加密算法和密钥实现的。加密算法是一种特定的算法,可以将数据编码成不可读的形式,密钥是一串字符串,用于控制加密和解密的过程。加密后的数据只能使用对应的密钥解密。
加密在保护数据的安全性方面非常重要,尤其是在互联网和移动设备环境中,用户的隐私数据容易遭到黑客的攻击。加密技术不仅可以保护数据的隐私,还可以保护数据的完整性,确保数据不被篡改。
在企业环境中,数据加密也被广泛应用于保护公司数据的安全。从合同到秘密文件,加密技术可以保护公司数据不被未经授权的人员查看。
总的来说,数据加密是一种重要的保护数据安全的技术,对于任何用户和企业都非常重要。
要求:利用python对某个目录的全部文件进行加密,密钥由用户的输入的字符串经过变化而生成,封装为一个函数,输入参数有目录路径和用户输入的字符串。
以下是使用 Python 实现的一种简单的文件加密方案:
import os
import hashlib
def encrypt_directory(directory, password):
for root, dirs, files in os.walk(directory):
for file in files:
path = os.path.join(root, file)
with open(path, 'rb') as f:
data = f.read()
key = hashlib.sha256(password.encode()).hexdigest()
encrypted_data = bytearray(x ^ ord(key[i % len(key)]) for i, x in enumerate(data))
with open(path, 'wb') as f:
f.write(encrypted_data)
该函数接收两个参数:目录路径和用户输入的字符串。它通过使用 os.walk 对目录下的每个文件进行加密,并将加密后的数据写回文件。加密使用了异或操作,密钥是对用户输入的字符串进行 SHA-256 哈希的十六进制字符串。
以下是对上面的加密函数的对应解密函数:
scssCopy code
def decrypt_directory(directory, password):
for root, dirs, files in os.walk(directory):
for file in files:
path = os.path.join(root, file)
with open(path, 'rb') as f:
encrypted_data = f.read()
key = hashlib.sha256(password.encode()).hexdigest()
data = bytearray(x ^ ord(key[i % len(key)]) for i, x in enumerate(encrypted_data))
with open(path, 'wb') as f:
f.write(data)
该函数与上面的加密函数类似,但是它读入加密后的文件,并使用相同的密钥对数据进行异或操作,以获得原始文件。
将上述代码更换加密算法,使用AES加密,代码如下:
import os
import hashlib
from Crypto.Cipher import AES
def encrypt_directory(directory, password):
# 计算密钥
key = hashlib.sha256(password.encode()).digest()[:16]
for root, dirs, files in os.walk(directory):
for file in files:
path = os.path.join(root, file)
# 读取文件
with open(path, 'rb') as f:
data = f.read()
# 对数据进行补位
padding_length = 16 - len(data) % 16
data += bytes([padding_length] * padding_length)
# 初始化加密器
cipher = AES.new(key, AES.MODE_ECB)
# 加密数据
encrypted_data = cipher.encrypt(data)
# 将加密后的数据写回文件
with open(path, 'wb') as f:
f.write(encrypted_data)
def decrypt_directory(directory, password):
# 计算密钥
key = hashlib.sha256(password.encode()).digest()[:16]
for root, dirs, files in os.walk(directory):
for file in files:
path = os.path.join(root, file)
# 读取文件
with open(path, 'rb') as f:
encrypted_data = f.read()
# 初始化解密器
cipher = AES.new(key, AES.MODE_ECB)
# 解密数据
data = cipher.decrypt(encrypted_data)
# 删除补位数据
padding_length = data[-1]
data = data[:-padding_length]
# 将解密后的数据写回文件
with open(path, 'wb') as f:
f.write(data)
注:上面的代码仅供参考,不建议在生产环境中使用。AES ECB 模式并不是很安全,应该使用其他模式。
或者使用非对称加密:
这里使用RSA加密算法实现数据的加密解密:
import os
import rsa
def encrypt_file(file_path, public_key_file):
"""使用RSA算法加密文件
参数:
file_path: 需要加密的文件路径
public_key_file: 公钥文件路径
返回值:
无
"""
# 读取文件内容
with open(file_path, "rb") as file:
file_content = file.read()
# 读取公钥
with open(public_key_file, "rb") as key_file:
public_key = rsa.PublicKey.load_pkcs1(key_file.read())
# 加密文件内容
encrypted_content = rsa.encrypt(file_content, public_key)
# 将加密后的内容写入文件
with open(file_path, "wb") as file:
file.write(encrypted_content)
def decrypt_file(file_path, private_key_file, password):
"""使用RSA算法解密文件
参数:
file_path: 需要解密的文件路径
private_key_file: 私钥文件路径
password: 私钥文件密码
返回值:
无
"""
# 读取文件内容
with open(file_path, "rb") as file:
encrypted_content = file.read()
# 读取私钥
with open(private_key_file, "rb") as key_file:
private_key = rsa.PrivateKey.load_pkcs1(key_file.read(), password)
# 解密文件内容
file_content = rsa.decrypt(encrypted_content, private_key)
# 将解密后的内容写入文件
with open(file_path, "wb") as file:
file.write(file_content)
需要注意的是,RSA加密的效率较低,适用于加密少量数据,如对文件进行加密
来源:https://blog.csdn.net/qq_56438857/article/details/128937140
猜你喜欢
- 马上就要过节了,想把自己的项目搞得酷炫一些,对整个网站的按钮添加图标、飘花效果、首屏大图展示、顶部导航背景图,于是就写了这一遍文字,如有兴趣
- 什么是 Python? Python 之父 Guido van Rossum 说:Python是一种高级程序语言,其核心设计哲学是代码可读性
- 12-24小时制编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。输入格式:输入在一行中给出带有中间的:符号(半角的冒号
- 1.简介torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现Varia
- 一:创建迁移在laravel中使用make:migration命令来创建迁移php artisan make:migration creat
- url标记为变量通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的 部分会作为
- 模板引擎的思想是来源于MVC(Model View Controller)模型,即模型层、视图层、控制器层。在Web端,模型层为数据库的操作
- 本文实例讲述了JS实现简易图片轮播效果的方法。分享给大家供大家参考。具体如下:这里使用JS制作简易图片轮播效果:制作比较粗糙,使用的图片是w
- 在循环对象和函数对象中,我们了解了循环器(iterator)的功能。循环器是对象的容器,包含有多个对象。通过调用循环器的next()方法 (
- 本文实例讲述了PHP连接MySQL数据库的三种方式。分享给大家供大家参考,具体如下:PHP与MySQL的连接有三种API接口,分别是:PHP
- 大家知道,mailto是网页设计制作中的一个非常实用的html标签,许多拥有个人网页的朋友都喜欢在网站的醒目位置处写上自己的电子邮件地址,这
- 译者:AlphaImageLoader是一个让IE6正常显示PNG32时要用到的一个滤镜,但它在使用中也会产生一系列的问题,本文对使用Alp
- 闭包的概念我们尝试从概念上去理解一下闭包。在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部函数引用了外部函数的变量,则可能产生闭
- 由于连续的字符(字母、符号、数字)在默认情况下是不换行的,可能会破坏整个界面布局。那如何解决这个问题呢?在 IE 和 Safari 1.3+
- BLOG阅读:http://www.planabc.net/article.asp?id=118在使用CSS实现表现的时候,会经常接触到di
- 本文实例讲述了python实现域名系统(DNS)正向查询的方法。分享给大家供大家参考,具体如下:域名系统(DNS)是一个分布式的数据库,主要
- 在我们制作网页的时候会经常碰到一些需求,如果不知道方法,说不定会困扰我们半天。其实实现它们都很简单,下
- 概述os.access() 方法使用当前的uid/gid尝试访问路径。大部分操作使用有效的 uid/gid, 因此运行环境可以在 suid/
- 本文实例讲述了Python使用cx_Freeze库生成msi格式安装文件的方法。分享给大家供大家参考,具体如下:①.需要在目录下面创建一个文
- 1、首先,界面上有个按钮触发操作:<button type="button" class="layui-