Python如何加密和解密文件?如何使用带有密码学库的对称加密方案在 Python 中加密和解密文件?
加密是以只有授权方才能访问的方式对一条信息进行编码的过程。这非常重要,因为它允许你安全地保护你不希望任何人看到或访问的数据。
如何在Python中实现加密和解密文件?在本教程中,你将学习如何使用 Python 使用加密库来加密文件或任何字节对象(也包括字符串对象)。
我们将使用对称加密,这意味着我们用来加密数据的相同密钥也可用于解密。有很多加密算法,我们将使用的库建立在AES 算法之上。
注意:了解加密算法和散列算法之间的区别很重要,在加密中,一旦拥有密钥,你就可以检索原始数据,而散列函数则不能,这就是为什么它们被称为单向加密。
相关文章 如何在 Python 中提取和解密 Chrome Cookie。
Python加密和解密文件示例 - 让我们从安装加密开始:
pip3 install cryptography
打开一个新的 Python 文件,让我们开始吧:
from cryptography.fernet import Fernet
生成密钥
Python如何加密和解密文件?Fernet 是对称认证密码学的实现,让我们从生成该密钥并将其写入文件开始:
def write_key():
"""
Generates a key and save it into a file
"""
key = Fernet.generate_key()
with open("key.key", "wb") as key_file:
key_file.write(key)
generate_key()函数会生成一个新的 fernet 密钥,你真的需要把它保存在一个安全的地方,如果你丢失了密钥,你将无法再解密用这个密钥加密的数据。
由于此密钥是唯一的,因此我们不会在每次加密任何内容时生成密钥,因此我们需要一个函数来为我们加载该密钥:
def load_key():
"""
Loads the key from the current directory named `key.key`
"""
return open("key.key", "rb").read()
字符串加密
如何在Python中实现加密和解密文件?现在我们知道如何获取密钥,让我们从加密字符串对象开始,只是为了让你先熟悉它。
Python加密和解密文件示例 - 生成密钥并将其写入文件:
# generate and write a new key
write_key()
让我们加载该密钥:
# load the previously generated key
key = load_key()
一些消息:
message = "some secret message".encode()
我们需要对字符串进行编码,将它们转换为适合加密的字节,encode()方法使用utf-8编解码器对该字符串进行编码。使用该键初始化 Fernet 类:
# initialize the Fernet class
f = Fernet(key)
加密消息:
# encrypt the message
encrypted = f.encrypt(message)
f.encrypt()方法对传递的数据进行加密,这种加密的结果被称为“Fernet 令牌”,具有很强的隐私性和真实性保证。
让我们看看它的外观:
# print how it looks
print(encrypted)
输出:
b'gAAAAABdjSdoqn4kx6XMw_fMx5YT2eaeBBCEue3N2FWHhlXjD6JXJyeELfPrKf0cqGaYkcY6Q0bS22ppTBsNTNw2fU5HVg-c-0o-KVqcYxqWAIG-LVVI_1U='
解密:
decrypted_encrypted = f.decrypt(encrypted)
print(decrypted_encrypted)
b'some secret message'
这确实是相同的信息。
f.decrypt()方法解密Fernet令牌。这将在成功解密时返回原始明文作为结果,否则将引发异常。
还学习: 如何在 Python 中加密和解密 PDF 文件。
文件加密
Python如何加密和解密文件?现在你知道如何基本加密字符串,让我们深入研究文件加密,我们需要一个函数来加密给定文件名和密钥的文件,Python加密和解密文件示例:
def encrypt(filename, key):
"""
Given a filename (str) and key (bytes), it encrypts the file and write it
"""
f = Fernet(key)
使用给定的键初始化 Fernet 对象后,让我们首先读取该文件:
with open(filename, "rb") as file:
# read all file data
file_data = file.read()
之后,加密我们刚刚读取的数据:
# encrypt data
encrypted_data = f.encrypt(file_data)
使用相同的名称写入加密文件,因此它将覆盖原始文件(不要在敏感信息上使用它,只需测试一些垃圾数据):
# write the encrypted file
with open(filename, "wb") as file:
file.write(encrypted_data)
好的,大功告成,现在进入解密函数,除了我们将使用decrypt()函数而不是encrypt()函数之外,它是相同的过程:
def decrypt(filename, key):
"""
Given a filename (str) and key (bytes), it decrypts the file and write it
"""
f = Fernet(key)
with open(filename, "rb") as file:
# read the encrypted data
encrypted_data = file.read()
# decrypt data
decrypted_data = f.decrypt(encrypted_data)
# write the original file
with open(filename, "wb") as file:
file.write(decrypted_data)
我们来测试一下,我在当前目录下有一个csv文件和一个key,如下图所示:
Python加密和解密文件示例:它是一个完全可读的文件,要加密它,我们需要做的就是调用我们刚刚编写的函数:
# uncomment this if it's the first time you run the code, to generate the key
# write_key()
# load the key
key = load_key()
# file name
file = "data.csv"
# encrypt it
encrypt(file, key)
Python如何加密和解密文件?一旦你执行了这个,你可能会看到文件变大了,而且是垃圾数据,你一个字也读不懂!
要将文件恢复为原始形式,只需调用decrypt()函数:
# decrypt the file
decrypt(file, key)
如何在Python中实现加密和解密文件?就是这样!你将看到原始文件代替之前加密的文件出现。
查看cryptography的官方文档以获取更多详细信息和说明。
但是请注意,你需要提防大文件,因为文件需要完全在内存中才能适合加密,你需要考虑使用一些拆分数据的方法或对大文件进行文件压缩!
这是经过一些重构后的完整代码,我只是让它很容易作为脚本运行。