密码学,即密码的科学,是在编码的帮助下实现的。我们不能决定一种编程语言比另一种更好或更差。然而,选择一个合适的密码学库就会有很大的不同。
Python为数据的加密和解密提供了一些非常复杂的库和模块。其中一些是Cryptography, hashlib, Simple-Crypt, 等等。这篇文章通过说明如何对文本字符串和文件进行加密和解密,在密码学库的帮助下展示了现代密码学在Python中的应用。
密码学库的安装
Cryptography是Python中的一个库,它为用户提供了各种加密方式;其中之一就是简单的数据加密和解密。使用下面的命令来安装密码学库。
ubuntu@ubuntu:~$ pip install cryptography
文本加密
导入Fernet
安装成功后,从库中导入fernet模块。该函数承担了数据的加密以及解密的责任。为此,创建一个python文件,并从cryptography库中导入fernet模块,如下所示。
from cryptography.fernet import Fernet
生成密钥
现在通过定义一个函数或简单地使用Python中的fernet生成器来生成认证密钥。Fernet.generate_key()函数将生成一个用于加密和解密的密钥。在代码中添加以下一行。
>> key = Fernet.generate_key()
现在Fernet类将使用生成的密钥进行实例化。
>> fernet= Fernet(key)
文本字符串加密
现在只需几行代码就可以对文本进行加密。添加以下几行以使你的文本得到加密。
>> message = “This text will be encrypted”
>> encrypted_message= fernet.encrypt(message.encode())
>> print(‘original text string:’, message)
>> print(‘message after encryption:’ encrypted_message)
执行上述python代码,会输出一串无法解读的字母数字字符,如下图所示。这是借助于Python中的密码学库对文本字符串进行加密的最简单形式。首先,它对字符串进行编码,以便以后使用密码学加密配方对其进行加密。

文本字符串的解密
通过雪貂加密方法对字符串进行加密后,将文本解密为其原始形式。成功的解密可以确保收件人能够顺利解码和访问信息。
因此,为了顺利解密,fernet模块也渲染了一个简单的解密功能。在你的Python文件中加入这两行,就可以顺利地将相同的信息解密为初始形式。
decrypted_message=fernet.decrypt(encrypted_message).decode()
print(‘decrypted string of text:’, decrypted_message )
以上几行代码使用了同一个Fernet实例,它使用保存在程序内存中的密钥进行解密。fernet.decrypt()函数返回解密后的编码字符串,因为它在加密前已经被编码。现在,解密函数将编码后的字符串返回到其原始形式。
文件加密
就像文本加密一样,导入fernet模块用于文件加密和密钥生成。从密码学库中导入fernet模块。
from cryptography.fernet import Fernet
密钥生成
如上所示,使用fernet密钥生成器函数来生成密钥。尽管这是测试短文加密和解密的较好方法,但实际上并不实用,因为它在程序终止后会永久地丢失密钥。因此,建议将密钥安全地存储在一个文件中,以便在需要时可以读取和使用。
通过在代码中定义一个密钥生成器函数,将密钥写入文件来实现这一点。这也可以通过将fernet密钥存储在一个文本文件中来实现。生成密钥并将其存储在一个文件中供将来使用。
>> key = Fernet.generate_key()
>> with open('keyfile.key', 'wb') as keyfile:
keyfile.write(key)
这段代码将生成一个随机的字母数字字符串,并将其存储在keyfile.key文件中。
加密
使用下面这行代码来读取已经存储的密钥进行文件加密。
>> with open('keyfile.key', 'rb') as keyfile:
>> key= keyfile.read()
为fernet实例使用密钥。
>> fernet= Fernet(key)
打开并读取要加密的文件,用fernet加密法对文件中的数据进行加密。
>> with open('list.csv', 'rb') as original_file:
original_data = original_file.read()
>> Encrypted_data= fernet.encrypt(original_data)
现在以写模式打开文件,把加密的数据写回来。
>> with open('list.csv', 'wb') as encrypted_file:
encrypted_file.write(encrypted_data)
上述代码的执行将用大量的字母数字字符串替换原始文件数据。
解密文件
再次使用Fernet模块,用相同的密钥解密文件。下面的代码首先从加密的文件中读取数据,然后用解密函数将其恢复到原来的形式。
>> fernet= Fernet(key)
>> With open('list.csv', 'rb') as encrypted_file:
encrypted_data = encrypted_file.read()
>> decrypted_data = fernet.decrypt(encrypted_data)
>> with open('list.csv', 'wb') as decrypted_file:
decrypted_file.write(decrypted_data)
总结
密码学库是Python为安全通信和加密提供的众多库和模块中的一个。该库的fernet模块提供了一个内置的密钥发生器,并为一串数据和大文件提供了加密和解密功能。