如何在Python中实现加密和解密文件?详细教程

2021年11月16日15:21:00 发表评论 2,126 次浏览

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中实现加密和解密文件?详细教程

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的官方文档以获取更多详细信息和说明。

但是请注意,你需要提防大文件,因为文件需要完全在内存中才能适合加密,你需要考虑使用一些拆分数据的方法或对大文件进行文件压缩!

这是经过一些重构后的完整代码,我只是让它很容易作为脚本运行。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: