使用Python对文件进行加密和解密

4,352 阅读5分钟

使用Python对文件进行加密和解密

在这篇文章中,我们将讨论如何使用Python对文件进行加密和解密。

目录

  • 简介
  • 创建一个密钥
  • 加载一个密钥
  • 使用Python对文件进行加密
  • 使用Python解密一个文件
  • 完整的面向对象的编程实例
  • 总结

简介

在不断发展的数据和信息传输世界中,文件内容的安全仍然是公司最关心的问题之一。有些信息可以用密码保护(电子邮件、登录),而其他通过电子邮件或FTP传输的信息,如果用一些关键词来保护,就会缺乏效率。这时,文件加密就发挥了很大的作用,为从事文件传输的各方提供安全和便利。

那么什么是加密呢?它是一个将信息转换为某种形式的代码以隐藏其真实内容的过程。那么访问文件信息的唯一方法就是解密。加密/解密的过程被称为密码学。

让我们看看我们如何使用Python对一些文件进行加密和解密。我们将采用对称加密法,即使用相同的密钥来加密和解密文件。

为了继续学习本教程,我们将需要以下Python库:cryptography。

如果你没有安装它,请打开 "命令提示符"(在Windows下)并使用以下代码安装它。

pip install cryptography

而且我们还需要一个我们要处理的样本文件。下面是包含一些学生成绩数据的样本.csv文件:
grades.csv

创建一个密钥

在我们的例子中,我们将使用对称方程。

from cryptography.fernet import Fernet

Fernet是认证的密码学,不允许在没有 "钥匙 "的情况下读取和/或修改文件。

现在,让我们创建密钥并将其保存在与我们的数据文件相同的文件夹中。

key = Fernet.generate_key()

with open('mykey.key', 'wb') as mykey:
    mykey.write(key)

如果你检查你的 Python 代码所在的目录,你应该看到mykey.key文件。你可以用任何文本编辑器打开它 (在我的例子中,它显示在本地目录中,因为我使用 VS Code)。该文件应该包含一行,它是一个由一些字符顺序组成的字符串。对我来说是 "VlD8h2tEiJkQpKKnDNKnu8ya2fpIBMOo5oc7JKNasvk="。

加载一个密钥

在我们生成加密密钥后,我们需要将其加载到我们的环境中,以便对文件进行加密/解密。

下面的步骤非常简单,只需要打开mykey.key文件并将其存储在本地内存中。

with open('mykey.key', 'rb') as mykey:
    key = mykey.read()

print(key)

为了验证,我们将看到以下输出。

VlD8h2tEiJkQpKKnDNKnu8ya2fpIBMOo5oc7JKNasvk=

加密密钥现在作为密钥变量存储在本地。

使用Python对文件进行加密

现在我们有了要加密的文件和加密密钥,我们现在要写一个函数来利用这些,并返回加密后的文件。

f = Fernet(key)

with open('grades.csv', 'rb') as original_file:
    original = original_file.read()

encrypted = f.encrypt(original)

with open ('enc_grades.csv', 'wb') as encrypted_file:
    encrypted_file.write(encrypted)

让我们讨论一下我们在这里做了什么。

  • 我们初始化Fernet对象,将其存储为一个局部变量f
  • 接下来,我们将我们的原始数据(成绩.csv文件)读到原始文件中。
  • 然后,我们使用Fernet对象对数据进行加密,并将其存储为已加密的数据。
  • 最后,我们把它写进一个新的.csv文件,叫做 "enc_grades.csv"

你可以在这里看一下加密后的文件:
enc_grades.csv

使用Python解密文件

在你对文件进行了加密,例如,成功地将文件转移到另一个地方之后,你会想要访问它。现在,这些数据是以加密的格式存在的。下一步是将其解密为原始内容。

我们现在要遵循的过程与上一部分的加密过程相反。完全相同的过程,但现在我们将从加密的文件到解密的文件。

f = Fernet(key)

with open('enc_grades.csv', 'rb') as encrypted_file:
    encrypted = encrypted_file.read()

decrypted = f.decrypt(encrypted)

with open('dec_grades.csv', 'wb') as decrypted_file:
    decrypted_file.write(decrypted)

让我们讨论一下我们在这里做了什么。

  • 我们初始化Fernet对象,将其存储为一个局部变量f
  • 接下来,我们将我们的加密数据(enc_grades.csv文件)读入加密的
  • 然后,我们使用Fernet对象解密数据,并将其存储为解密的数据。
  • 最后,我们把它写进一个新的.csv文件,称为 "dec_grades.csv"

你可以在这里看一下解密后的文件:
dec_grades.csv

将 "dec_grades.csv "与原始的 "grades.csv "相比较,你会发现事实上这两个文件的内容是完全一样的。我们的加密/解密过程是成功的。

完整的面向对象编程实例

这是一个额外的部分,我把所有的东西都组织成一个更加结构化的格式。

class Encryptor():

    def key_create(self):
        key = Fernet.generate_key()
        return key

    def key_write(self, key, key_name):
        with open(key_name, 'wb') as mykey:
            mykey.write(key)

    def key_load(self, key_name):
        with open(key_name, 'rb') as mykey:
            key = mykey.read()
        return key

    def file_encrypt(self, key, original_file, encrypted_file):
        
        f = Fernet(key)

        with open(original_file, 'rb') as file:
            original = file.read()

        encrypted = f.encrypt(original)

        with open (encrypted_file, 'wb') as file:
            file.write(encrypted)

    def file_decrypt(self, key, encrypted_file, decrypted_file):
        
        f = Fernet(key)

        with open(encrypted_file, 'rb') as file:
            encrypted = file.read()

        decrypted = f.decrypt(encrypted)

        with open(decrypted_file, 'wb') as file:
            file.write(decrypted)

而这是一个使用上述类进行加密/解密的例子。

encryptor=Encryptor()

mykey=encryptor.key_create()

encryptor.key_write(mykey, 'mykey.key')

loaded_key=encryptor.key_load('mykey.key')

encryptor.file_encrypt(loaded_key, 'grades.csv', 'enc_grades.csv')

encryptor.file_decrypt(loaded_key, 'enc_grades.csv', 'dec_grades.csv')

结语

这篇文章介绍了使用Python的基本对称文件加密和解密。我们已经讨论了密码学库的一些部分,并创建了一个完整的过程实例。