使用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的基本对称文件加密和解密。我们已经讨论了密码学库的一些部分,并创建了一个完整的过程实例。